aboutsummaryrefslogtreecommitdiffstats
path: root/main.lua
blob: db26f909d0883da8f43119e9bea37a36db43225f (plain)
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