aboutsummaryrefslogtreecommitdiffstats
path: root/main.lua
diff options
context:
space:
mode:
authors-ol <s+removethis@s-ol.nu>2025-03-21 10:34:50 +0000
committers-ol <s+removethis@s-ol.nu>2025-03-21 10:34:50 +0000
commitf0ad10a66312156d5795c71cbb767d99d3a0a429 (patch)
tree041a76189cef50d98d19f77cd6c1fb192e5ed610 /main.lua
parentinitial PoC (diff)
downloadlua-texture-share-vk-f0ad10a66312156d5795c71cbb767d99d3a0a429.tar.gz
lua-texture-share-vk-f0ad10a66312156d5795c71cbb767d99d3a0a429.zip
with unpatched love2d
Diffstat (limited to 'main.lua')
-rw-r--r--main.lua55
1 files changed, 51 insertions, 4 deletions
diff --git a/main.lua b/main.lua
index db26f90..72b295f 100644
--- a/main.lua
+++ b/main.lua
@@ -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
)