summaryrefslogtreecommitdiff
path: root/rsgl.c3
blob: 08459dfe1342fe124955f1acc3d84aba7a0f3424 (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
module rsgl;

alias Renderer = void;
alias RenderPass = void;
alias TextureBlob = void;

alias Framebuffer = usz;
alias Texture = usz;

enum BufferType
{
  ARRAY_BUFFER,
  ELEMENT_ARRAY_BUFFER,
  SHADER_STORAGE_BUFFER,
  TEXTURE_BUFFER,
  UNIFORM_BUFFER,
}

struct ProgramBlob
{
  ZString vertex;
  usz vertexLen;
  ZString fragment;
  usz fragmentLen;
}

struct ProgramInfo
{
  usz program;
  usz perspectiveView;
  usz model;
  usz vertexPosition;
  usz vertexTexCoord;
  usz vertexColor;
}

alias RendererProc_size = fn usz ();
alias RendererProc_defaultBlob = fn ProgramBlob (void*);
alias RendererProc_initPtr = fn void (void*, void*);
alias RendererProc_freePtr = fn void (void*);
alias RendererProc_render = fn void (void*, RenderPass*);
alias RendererProc_clear = fn void (void*, Framebuffer, float, float, float, float);
alias RendererProc_viewport = fn void (void*, int, int, int, int);
alias RendererProc_setSurface = fn void (void*, void*);
alias RendererProc_createTexture = fn Texture (void*, TextureBlob*);
alias RendererProc_copyToTexture = fn void (void*, Texture, usz, usz, TextureBlob*);
alias RendererProc_deleteTexture = fn void (void*, Texture);
alias RendererProc_scissorStart = fn void (void*, float, float, float, float, float);
alias RendererProc_scissorEnd = fn void (void*);
alias RendererProc_createProgram = fn ProgramInfo (void*, ProgramBlob*);
alias RendererProc_deleteProgram = fn void (void*, ProgramInfo*);
alias RendererProc_findShaderVariable = fn usz (void*, ProgramInfo*, ZString, usz);
alias RendererProc_updateShaderVariable = fn void (void*, ProgramInfo*, usz, float*, char);
alias RendererProc_createComputeProgram = fn ProgramInfo (void*, ZString);
alias RendererProc_dispatchComputeProgram = fn void (void*, ProgramInfo*, uint, uint, uint);
alias RendererProc_bindComputeTexture = fn void (void*, uint, char);
alias RendererProc_createBuffer = fn void (void*, BufferType, usz, void*, usz*);
alias RendererProc_updateBuffer = fn void (void*, BufferType, usz, void*, usz, usz);
alias RendererProc_deleteBuffer = fn void (void*, usz);
alias RendererProc_createFramebuffer = fn Framebuffer (void*, usz, usz);
alias RendererProc_attachFramebuffer = fn void (void*, Framebuffer, Texture, char, char);
alias RendererProc_deleteFramebuffer = fn void (void*, Framebuffer);

struct RendererProc
{
  RendererProc_size                   size;
  RendererProc_defaultBlob            defaultBlob;
  RendererProc_initPtr                initPtr;
  RendererProc_freePtr                freePtr;
  RendererProc_render                 render;
  RendererProc_clear                  clear;
  RendererProc_viewport               viewport;
  RendererProc_setSurface             setSurface;
  RendererProc_createTexture          createTexture;
  RendererProc_copyToTexture          copyToTexture;
  RendererProc_deleteTexture          deleteTexture;
  RendererProc_scissorStart           scissorStart;
  RendererProc_scissorEnd             scissorEnd;
  RendererProc_createProgram          createProgram;
  RendererProc_deleteProgram          deleteProgram;
  RendererProc_findShaderVariable     findShaderVariable;
  RendererProc_updateShaderVariable   updateShaderVariable;
  RendererProc_createComputeProgram   createComputeProgram;
  RendererProc_dispatchComputeProgram dispatchComputeProgram;
  RendererProc_bindComputeTexture     bindComputeTexture;
  RendererProc_createBuffer           createBuffer;
  RendererProc_updateBuffer           updateBuffer;
  RendererProc_deleteBuffer           deleteBuffer;
  RendererProc_createFramebuffer      createFramebuffer;
  RendererProc_attachFramebuffer      attachFramebuffer;
  RendererProc_deleteFramebuffer      deleteFramebuffer;
}

extern fn Renderer*    renderer_init(RendererProc, void*) @cname("RSGL_renderer_init");
extern fn RendererProc gl_rendererProc()                  @cname("RSGL_GL_rendererProc");