diff options
| -rw-r--r-- | main.lua | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..db26f90 --- /dev/null +++ b/main.lua @@ -0,0 +1,97 @@ +local ffi = require 'ffi' + +ffi.cdef [[ +// gl.h +typedef int GLint; +typedef unsigned int GLuint; +typedef unsigned int GLenum; + +// texture_share_ipc.h +typedef enum ImgFormat { + R8G8B8A8, + R8G8B8, + B8G8R8A8, + B8G8R8, + Undefined, +} ImgFormat; + +// texture_share_gl_client.h +typedef enum ImageLookupResult { + Error = -1, + NotFound = 0, + Found = 1, + RequiresUpdate = 2, +} ImageLookupResult; + +typedef struct ClientImageDataGuard ClientImageDataGuard; + +typedef struct GlClient GlClient; + +typedef struct GlImageExtent { + GLint top_left[2]; + GLint bottom_right[2]; +} GlImageExtent; + +bool gl_client_initialize_external_gl(void); + +struct GlClient *gl_client_new(const char *socket_path, uint64_t timeout_in_millis); + +void gl_client_destroy(struct GlClient *gl_client); + +enum ImageLookupResult gl_client_init_image(struct GlClient *gl_client, + const char *image_name, + uint32_t width, + uint32_t height, + ImgFormat format, + bool overwrite_existing); + +int gl_client_send_image(struct GlClient *gl_client, + const char *image_name, + void*, // GLuint src_texture_id, + GLenum src_texture_target, + bool invert, + GLuint prev_fbo, + const struct GlImageExtent *extents); +]] +local tvs = ffi.load("texture_share_gl_client") + +local width, height +local canvas +local client, image + +function love.load() + width, height = love.graphics.getDimensions() + canvas = love.graphics.newCanvas(width, height) + + assert(tvs.gl_client_initialize_external_gl(), "no init") + client = assert(tvs.gl_client_new("/tmp/vk_server/vk_server.sock", 1000)) + image = assert(tvs.gl_client_init_image(client, "love2d", width, height, ffi.C.R8G8B8A8, true) > 0) +end + +local angle = 0 + +function love.update(dt) + angle = angle + 5 * dt +end + +function love.draw() + love.graphics.setCanvas(canvas) + love.graphics.clear(0, 0, 0, 0) + love.graphics.translate(width/2, height/2) + love.graphics.rotate(angle) + + love.graphics.setColor(1, 0, 0, 1) + love.graphics.rectangle("fill", -150,-150, 300,300) + love.graphics.setCanvas() + + tvs.gl_client_send_image( + client, "love2d", + canvas:getHandle(), + 0x0DE1, -- GL_TEXTURE_2D + false, 0, nil + ) + + love.graphics.reset() + love.graphics.setBlendMode("alpha", "premultiplied") + love.graphics.draw(canvas) +end |
