diff options
| author | s-ol <s+removethis@s-ol.nu> | 2025-03-21 10:34:50 +0000 |
|---|---|---|
| committer | s-ol <s+removethis@s-ol.nu> | 2025-03-21 10:34:50 +0000 |
| commit | f0ad10a66312156d5795c71cbb767d99d3a0a429 (patch) | |
| tree | 041a76189cef50d98d19f77cd6c1fb192e5ed610 /main.lua | |
| parent | initial PoC (diff) | |
| download | lua-texture-share-vk-f0ad10a66312156d5795c71cbb767d99d3a0a429.tar.gz lua-texture-share-vk-f0ad10a66312156d5795c71cbb767d99d3a0a429.zip | |
with unpatched love2d
Diffstat (limited to 'main.lua')
| -rw-r--r-- | main.lua | 55 |
1 files changed, 51 insertions, 4 deletions
@@ -1,11 +1,26 @@ local ffi = require 'ffi' +-- from +local VK_SERVER_EXECUTABLE = "/usr/bin/texture-share-vk-server" +local VK_SERVER_DEFAULT_LOCKFILE_PATH = "/tmp/vk_server/vk_server.lock" +local VK_SERVER_DEFAULT_SOCKET_PATH = "/tmp/vk_server/vk_server.sock" +local VK_SERVER_DEFAULT_SHMEM_PREFIX = "shmem_img_" + +-- from gl.h +local GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1 +local GL_COLOR_ATTACHMENT0 = 0x8CE0 +local GL_FRAMEBUFFER = 0x8D40 +local GL_TEXTURE_2D = 0x0DE1 + ffi.cdef [[ // gl.h typedef int GLint; typedef unsigned int GLuint; typedef unsigned int GLenum; +void glGetFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, + GLenum pname, GLint *params); + // texture_share_ipc.h typedef enum ImgFormat { R8G8B8A8, @@ -35,6 +50,17 @@ typedef struct GlImageExtent { bool gl_client_initialize_external_gl(void); struct GlClient *gl_client_new(const char *socket_path, uint64_t timeout_in_millis); +struct GlClient *gl_client_new_with_server_launch(const char *socket_path, + uint64_t client_timeout_in_millis, + const char *server_program, + const char *server_lock_path, + const char *server_socket_path, + const char *shmem_prefix, + uint64_t server_socket_timeout_in_millis, + uint64_t server_connection_wait_timeout_in_millis, + uint64_t server_ipc_timeout_in_millis, + uint64_t server_lockfile_timeout_in_millis, + uint64_t server_spawn_timeout_in_millis); void gl_client_destroy(struct GlClient *gl_client); @@ -47,13 +73,14 @@ enum ImageLookupResult gl_client_init_image(struct GlClient *gl_client, int gl_client_send_image(struct GlClient *gl_client, const char *image_name, - void*, // GLuint src_texture_id, + 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 gl = ffi.load("GL") local width, height local canvas @@ -64,7 +91,19 @@ function love.load() 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)) + client = assert(tvs.gl_client_new_with_server_launch( + VK_SERVER_DEFAULT_SOCKET_PATH, + 1000, + VK_SERVER_EXECUTABLE, + VK_SERVER_DEFAULT_LOCKFILE_PATH, + VK_SERVER_DEFAULT_SOCKET_PATH, + VK_SERVER_DEFAULT_SHMEM_PREFIX, + 2000, + 2000, + 2000, + 2000, + 2000 + ), "failed to connect or launch tsv server") image = assert(tvs.gl_client_init_image(client, "love2d", width, height, ffi.C.R8G8B8A8, true) > 0) end @@ -82,12 +121,20 @@ function love.draw() love.graphics.setColor(1, 0, 0, 1) love.graphics.rectangle("fill", -150,-150, 300,300) + + local name_ptr = ffi.typeof('GLint[1]')() + gl.glGetFramebufferAttachmentParameteriv( + GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, + name_ptr + ) love.graphics.setCanvas() tvs.gl_client_send_image( client, "love2d", - canvas:getHandle(), - 0x0DE1, -- GL_TEXTURE_2D + name_ptr[0], + GL_TEXTURE_2D, false, 0, nil ) |
