aboutsummaryrefslogtreecommitdiffstats
path: root/main.lua
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2025-03-21 09:56:23 +0000
committers-ol <s+removethis@s-ol.nu>2025-03-21 09:56:23 +0000
commitfd757390e0fc3cfaf366be85e6ffc2be35a85c74 (patch)
tree28cb41600a3c0ed22b92c898df4886b0809a0dff /main.lua
downloadlua-texture-share-vk-fd757390e0fc3cfaf366be85e6ffc2be35a85c74.tar.gz
lua-texture-share-vk-fd757390e0fc3cfaf366be85e6ffc2be35a85c74.zip
initial PoC
Diffstat (limited to 'main.lua')
-rw-r--r--main.lua97
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