1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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
|