tiny_gl/gl/
ffi.rs

1#![allow(non_snake_case)]
2
3mod enums;
4
5use crate::utils::*;
6use core::ffi::{c_void, CStr};
7
8pub use crate::types::*;
9pub use enums::*;
10
11pub unsafe fn glCreateShader(ty: GLenum) -> GLuint {
12    call_ptr_1arg(CREATE_SHADER_PTR, ty)
13}
14
15pub unsafe fn glShaderSource(
16    shader: GLuint,
17    count: GLsizei,
18    string: *const *const GLchar,
19    length: *const GLint,
20) {
21    call_ptr_4arg(SHADER_SOURCE_PTR, shader, count, string, length)
22}
23
24pub unsafe fn glCompileShader(shader: GLuint) {
25    call_ptr_1arg(COMPILE_SHADER_PTR, shader)
26}
27
28pub unsafe fn glDeleteShader(shader: GLuint) {
29    call_ptr_1arg(DELETE_SHADER_PTR, shader)
30}
31
32pub unsafe fn glGetShaderiv(shader: GLuint, pname: GLenum, params: *mut GLint) {
33    call_ptr_3arg(GET_SHADER_IV_PTR, shader, pname, params)
34}
35
36pub unsafe fn glGetShaderInfoLog(
37    shader: GLuint,
38    max_length: GLsizei,
39    length: *mut GLsizei,
40    info_log: *mut GLchar,
41) {
42    call_ptr_4arg(
43        GET_SHADER_INFO_LOG_PTR,
44        shader,
45        max_length,
46        length,
47        info_log,
48    )
49}
50
51pub unsafe fn glCreateProgram() -> GLuint {
52    call_ptr_0arg(CREATE_PROGRAM_PTR)
53}
54
55pub unsafe fn glAttachShader(program: GLuint, shader: GLuint) {
56    call_ptr_2arg(ATTACH_SHADER_PTR, program, shader)
57}
58
59pub unsafe fn glLinkProgram(program: GLuint) {
60    call_ptr_1arg(LINK_PROGRAM_PTR, program)
61}
62
63pub unsafe fn glGetProgramiv(program: GLuint, pname: GLenum, params: *mut GLint) {
64    call_ptr_3arg(GET_PROGRAM_IV_PTR, program, pname, params)
65}
66
67pub unsafe fn glGetProgramInfoLog(
68    program: GLuint,
69    max_length: GLsizei,
70    length: *mut GLsizei,
71    info_log: *mut GLchar,
72) {
73    call_ptr_4arg(
74        GET_PROGRAM_INFO_LOG_PTR,
75        program,
76        max_length,
77        length,
78        info_log,
79    )
80}
81
82pub unsafe fn glDeleteProgram(program: GLuint) {
83    call_ptr_1arg(DELETE_PROGRAM_PTR, program)
84}
85
86pub unsafe fn glDrawArrays(mode: GLenum, first: GLint, count: GLsizei) {
87    call_ptr_3arg(DRAW_ARRAYS_PTR, mode, first, count)
88}
89
90pub unsafe fn glCreateBuffers(n: GLsizei, buffers: *mut GLuint) {
91    call_ptr_2arg(CREATE_BUFFERS_PTR, n, buffers)
92}
93
94pub unsafe fn glNamedBufferData(
95    buffer: GLuint,
96    size: GLsizeiptr,
97    data: *const c_void,
98    usage: GLenum,
99) {
100    call_ptr_4arg(NAMED_BUFFER_DATA_PTR, buffer, size, data, usage)
101}
102
103pub unsafe fn glDeleteBuffers(n: GLsizei, buffers: *const GLuint) {
104    call_ptr_2arg(DELETE_BUFFERS_PTR, n, buffers)
105}
106
107pub unsafe fn glCreateVertexArrays(n: GLsizei, arrays: *mut GLuint) {
108    call_ptr_2arg(CREATE_VERTEX_ARRAYS_PTR, n, arrays)
109}
110
111pub unsafe fn glVertexArrayVertexBuffer(
112    vaobj: GLuint,
113    bindingindex: GLuint,
114    buffer: GLuint,
115    offset: GLintptr,
116    stride: GLsizei,
117) {
118    call_ptr_5arg(
119        VERTEX_ARRAY_VERTEX_BUFFER_PTR,
120        vaobj,
121        bindingindex,
122        buffer,
123        offset,
124        stride,
125    )
126}
127
128pub unsafe fn glVertexArrayElementBuffer(vaobj: GLuint, buffer: GLuint) {
129    call_ptr_2arg(VERTEX_ARRAY_ELEMENT_BUFFER_PTR, vaobj, buffer)
130}
131
132pub unsafe fn glEnableVertexArrayAttrib(vaobj: GLuint, index: GLuint) {
133    call_ptr_2arg(ENABLE_VERTEX_ARRAY_ATTRIB_PTR, vaobj, index)
134}
135
136pub unsafe fn glVertexArrayAttribFormat(
137    vaobj: GLuint,
138    attribindex: GLuint,
139    size: GLint,
140    ty: GLenum,
141    normalized: GLboolean,
142    relativeoffset: GLuint,
143) {
144    call_ptr_6arg(
145        VERTEX_ARRAY_ATTRIB_FORMAT_PTR,
146        vaobj,
147        attribindex,
148        size,
149        ty,
150        normalized,
151        relativeoffset,
152    )
153}
154
155pub unsafe fn glVertexArrayAttribBinding(vaobj: GLuint, attribindex: GLuint, bindingindex: GLuint) {
156    call_ptr_3arg(
157        VERTEX_ARRAY_ATTRIB_BINDING_PTR,
158        vaobj,
159        attribindex,
160        bindingindex,
161    )
162}
163
164pub unsafe fn glDeleteVertexArrays(n: GLsizei, arrays: *const GLuint) {
165    call_ptr_2arg(DELETE_VERTEX_ARRAYS_PTR, n, arrays)
166}
167
168pub unsafe fn glNamedBufferStorage(
169    buffer: GLuint,
170    size: GLsizeiptr,
171    data: *const c_void,
172    flags: GLbitfield,
173) {
174    call_ptr_4arg(NAMED_BUFFER_STORAGE_PTR, buffer, size, data, flags)
175}
176
177pub unsafe fn glCreateTextures(target: GLenum, n: GLsizei, textures: *mut GLuint) {
178    call_ptr_3arg(CREATE_TEXTURES_PTR, target, n, textures)
179}
180
181pub unsafe fn glDeleteTextures(n: GLsizei, textures: *const GLuint) {
182    call_ptr_2arg(DELETE_TEXTURES_PTR, n, textures)
183}
184
185pub unsafe fn glTextureStorage2D(
186    texture: GLuint,
187    levels: GLsizei,
188    internalformat: GLenum,
189    width: GLsizei,
190    height: GLsizei,
191) {
192    call_ptr_5arg(
193        TEXTURE_STORAGE_2D_PTR,
194        texture,
195        levels,
196        internalformat,
197        width,
198        height,
199    )
200}
201
202pub unsafe fn glCreateFramebuffers(n: GLsizei, framebuffers: *mut GLuint) {
203    call_ptr_2arg(CREATE_FRAMEBUFFERS_PTR, n, framebuffers)
204}
205
206pub unsafe fn glDeleteFramebuffers(n: GLsizei, framebuffers: *const GLuint) {
207    call_ptr_2arg(DELETE_FRAMEBUFFERS_PTR, n, framebuffers)
208}
209
210pub unsafe fn glNamedFramebufferTexture(
211    framebuffer: GLuint,
212    attachment: GLenum,
213    texture: GLuint,
214    level: GLint,
215) {
216    call_ptr_4arg(
217        NAMED_FRAMEBUFFER_TEXTURE_PTR,
218        framebuffer,
219        attachment,
220        texture,
221        level,
222    )
223}
224
225pub unsafe fn glUseProgram(program: GLuint) {
226    call_ptr_1arg(USE_PROGRAM_PTR, program)
227}
228
229pub unsafe fn glBindVertexArray(vertex_array: GLuint) {
230    call_ptr_1arg(BIND_VERTEX_ARRAY_PTR, vertex_array)
231}
232
233pub unsafe fn glClear(mask: GLbitfield) {
234    call_ptr_1arg(CLEAR_PTR, mask)
235}
236
237pub unsafe fn glClearColor(red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) {
238    call_ptr_4arg(CLEAR_COLOR_PTR, red, green, blue, alpha)
239}
240
241pub unsafe fn glGetUniformLocation(program: GLuint, name: *const GLchar) -> GLint {
242    call_ptr_2arg(GET_UNIFORM_LOCATION_PTR, program, name)
243}
244
245pub unsafe fn glProgramUniform1f(program: GLuint, location: GLint, v0: GLfloat) {
246    call_ptr_3arg(PROGRAM_UNIFORM_1F_PTR, program, location, v0)
247}
248
249pub unsafe fn glProgramUniformMatrix4fv(
250    program: GLuint,
251    location: GLint,
252    count: GLsizei,
253    transpose: GLboolean,
254    value: *const GLfloat,
255) {
256    call_ptr_5arg(
257        PROGRAM_UNIFORM_MATRIX_5FV_PTR,
258        program,
259        location,
260        count,
261        transpose,
262        value,
263    )
264}
265
266pub unsafe fn glViewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei) {
267    call_ptr_4arg(VIEWPORT_PTR, x, y, width, height)
268}
269
270pub unsafe fn glBindFramebuffer(target: GLenum, framebuffer: GLuint) {
271    call_ptr_2arg(BIND_FRAMEBUFFER_PTR, target, framebuffer)
272}
273
274pub unsafe fn glEnable(cap: GLenum) {
275    call_ptr_1arg(ENABLE_PTR, cap)
276}
277
278pub unsafe fn glDisable(cap: GLenum) {
279    call_ptr_1arg(DISABLE_PTR, cap)
280}
281
282pub unsafe fn glDepthMask(flag: GLboolean) {
283    call_ptr_1arg(DEPTH_MASK_PTR, flag)
284}
285
286pub unsafe fn glDepthFunc(func: GLenum) {
287    call_ptr_1arg(DEPTH_FUNC_PTR, func)
288}
289
290//TODO Should this move?
291pub type DEBUGPROC = unsafe extern "system" fn(
292    source: GLenum,
293    gl_type: GLenum,
294    id: GLuint,
295    severity: GLenum,
296    length: GLsizei,
297    message: *const GLchar,
298    user_param: *mut c_void,
299);
300
301pub unsafe fn glDebugMessageCallback(callback: DEBUGPROC, user_param: *const c_void) {
302    call_ptr_2arg(DEBUG_MESSAGE_CALLBACK_PTR, callback, user_param)
303}
304
305pub unsafe fn glDebugMessageControl(
306    source: GLenum,
307    gl_type: GLenum,
308    severity: GLenum,
309    count: GLsizei,
310    ids: *const GLuint,
311    enabled: GLboolean,
312) {
313    call_ptr_6arg(
314        DEBUG_MESSAGE_CONTROL_PTR,
315        source,
316        gl_type,
317        severity,
318        count,
319        ids,
320        enabled,
321    )
322}
323
324static mut CREATE_SHADER_PTR: *const c_void = core::ptr::null();
325static mut SHADER_SOURCE_PTR: *const c_void = core::ptr::null();
326static mut COMPILE_SHADER_PTR: *const c_void = core::ptr::null();
327static mut DELETE_SHADER_PTR: *const c_void = core::ptr::null();
328static mut GET_SHADER_IV_PTR: *const c_void = core::ptr::null();
329static mut GET_SHADER_INFO_LOG_PTR: *const c_void = core::ptr::null();
330static mut CREATE_PROGRAM_PTR: *const c_void = core::ptr::null();
331static mut ATTACH_SHADER_PTR: *const c_void = core::ptr::null();
332static mut LINK_PROGRAM_PTR: *const c_void = core::ptr::null();
333static mut GET_PROGRAM_IV_PTR: *const c_void = core::ptr::null();
334static mut GET_PROGRAM_INFO_LOG_PTR: *const c_void = core::ptr::null();
335static mut DELETE_PROGRAM_PTR: *const c_void = core::ptr::null();
336static mut DRAW_ARRAYS_PTR: *const c_void = core::ptr::null();
337static mut CREATE_BUFFERS_PTR: *const c_void = core::ptr::null();
338static mut NAMED_BUFFER_DATA_PTR: *const c_void = core::ptr::null();
339static mut DELETE_BUFFERS_PTR: *const c_void = core::ptr::null();
340static mut CREATE_VERTEX_ARRAYS_PTR: *const c_void = core::ptr::null();
341static mut VERTEX_ARRAY_VERTEX_BUFFER_PTR: *const c_void = core::ptr::null();
342static mut VERTEX_ARRAY_ELEMENT_BUFFER_PTR: *const c_void = core::ptr::null();
343static mut ENABLE_VERTEX_ARRAY_ATTRIB_PTR: *const c_void = core::ptr::null();
344static mut VERTEX_ARRAY_ATTRIB_FORMAT_PTR: *const c_void = core::ptr::null();
345static mut VERTEX_ARRAY_ATTRIB_BINDING_PTR: *const c_void = core::ptr::null();
346static mut DELETE_VERTEX_ARRAYS_PTR: *const c_void = core::ptr::null();
347static mut NAMED_BUFFER_STORAGE_PTR: *const c_void = core::ptr::null();
348static mut CREATE_TEXTURES_PTR: *const c_void = core::ptr::null();
349static mut DELETE_TEXTURES_PTR: *const c_void = core::ptr::null();
350static mut TEXTURE_STORAGE_2D_PTR: *const c_void = core::ptr::null();
351static mut CREATE_FRAMEBUFFERS_PTR: *const c_void = core::ptr::null();
352static mut DELETE_FRAMEBUFFERS_PTR: *const c_void = core::ptr::null();
353static mut NAMED_FRAMEBUFFER_TEXTURE_PTR: *const c_void = core::ptr::null();
354static mut USE_PROGRAM_PTR: *const c_void = core::ptr::null();
355static mut BIND_VERTEX_ARRAY_PTR: *const c_void = core::ptr::null();
356static mut CLEAR_PTR: *const c_void = core::ptr::null();
357static mut CLEAR_COLOR_PTR: *const c_void = core::ptr::null();
358static mut GET_UNIFORM_LOCATION_PTR: *const c_void = core::ptr::null();
359static mut PROGRAM_UNIFORM_1F_PTR: *const c_void = core::ptr::null();
360static mut PROGRAM_UNIFORM_MATRIX_5FV_PTR: *const c_void = core::ptr::null();
361static mut VIEWPORT_PTR: *const c_void = core::ptr::null();
362static mut BIND_FRAMEBUFFER_PTR: *const c_void = core::ptr::null();
363static mut ENABLE_PTR: *const c_void = core::ptr::null();
364static mut DISABLE_PTR: *const c_void = core::ptr::null();
365static mut DEPTH_MASK_PTR: *const c_void = core::ptr::null();
366static mut DEPTH_FUNC_PTR: *const c_void = core::ptr::null();
367static mut DEBUG_MESSAGE_CALLBACK_PTR: *const c_void = core::ptr::null();
368static mut DEBUG_MESSAGE_CONTROL_PTR: *const c_void = core::ptr::null();
369
370//TODO Implement for textures:
371// glTextureParameteri
372// glTextureSubImage2D
373// glBindTextureUnit
374// glGenerateTextureMipmap
375
376//TODO Implement for framebuffers:
377// glCheckNamedFramebufferStatus
378// glBlitNamedFramebuffer
379// glClearNamedFramebufferfv
380
381//TODO Others:
382// glGetError
383
384pub unsafe fn load(get_proc_address: impl Fn(&CStr) -> *const c_void) {
385    CREATE_SHADER_PTR = get_proc_address(c"glCreateShader");
386    SHADER_SOURCE_PTR = get_proc_address(c"glShaderSource");
387    COMPILE_SHADER_PTR = get_proc_address(c"glCompileShader");
388    DELETE_SHADER_PTR = get_proc_address(c"glDeleteShader");
389    GET_SHADER_IV_PTR = get_proc_address(c"glGetShaderiv");
390    GET_SHADER_INFO_LOG_PTR = get_proc_address(c"glGetShaderInfoLog");
391    CREATE_PROGRAM_PTR = get_proc_address(c"glCreateProgram");
392    ATTACH_SHADER_PTR = get_proc_address(c"glAttachShader");
393    LINK_PROGRAM_PTR = get_proc_address(c"glLinkProgram");
394    GET_PROGRAM_IV_PTR = get_proc_address(c"glGetProgramiv");
395    GET_PROGRAM_INFO_LOG_PTR = get_proc_address(c"glGetProgramInfoLog");
396    DELETE_PROGRAM_PTR = get_proc_address(c"glDeleteProgram");
397    DRAW_ARRAYS_PTR = get_proc_address(c"glDrawArrays");
398    CREATE_BUFFERS_PTR = get_proc_address(c"glCreateBuffers");
399    NAMED_BUFFER_DATA_PTR = get_proc_address(c"glNamedBufferData");
400    DELETE_BUFFERS_PTR = get_proc_address(c"glDeleteBuffers");
401    CREATE_VERTEX_ARRAYS_PTR = get_proc_address(c"glCreateVertexArrays");
402    VERTEX_ARRAY_VERTEX_BUFFER_PTR = get_proc_address(c"glVertexArrayVertexBuffer");
403    VERTEX_ARRAY_ELEMENT_BUFFER_PTR = get_proc_address(c"glVertexArrayElementBuffer");
404    ENABLE_VERTEX_ARRAY_ATTRIB_PTR = get_proc_address(c"glEnableVertexArrayAttrib");
405    VERTEX_ARRAY_ATTRIB_FORMAT_PTR = get_proc_address(c"glVertexArrayAttribFormat");
406    VERTEX_ARRAY_ATTRIB_BINDING_PTR = get_proc_address(c"glVertexArrayAttribBinding");
407    DELETE_VERTEX_ARRAYS_PTR = get_proc_address(c"glDeleteVertexArrays");
408    NAMED_BUFFER_STORAGE_PTR = get_proc_address(c"glNamedBufferStorage");
409    CREATE_TEXTURES_PTR = get_proc_address(c"glCreateTextures");
410    DELETE_TEXTURES_PTR = get_proc_address(c"glDeleteTextures");
411    TEXTURE_STORAGE_2D_PTR = get_proc_address(c"glTextureStorage2D");
412    CREATE_FRAMEBUFFERS_PTR = get_proc_address(c"glCreateFramebuffers");
413    DELETE_FRAMEBUFFERS_PTR = get_proc_address(c"glDeleteFramebuffers");
414    NAMED_FRAMEBUFFER_TEXTURE_PTR = get_proc_address(c"glNamedFramebufferTexture");
415    USE_PROGRAM_PTR = get_proc_address(c"glUseProgram");
416    BIND_VERTEX_ARRAY_PTR = get_proc_address(c"glBindVertexArray");
417    CLEAR_PTR = get_proc_address(c"glClear");
418    CLEAR_COLOR_PTR = get_proc_address(c"glClearColor");
419    GET_UNIFORM_LOCATION_PTR = get_proc_address(c"glGetUniformLocation");
420    PROGRAM_UNIFORM_1F_PTR = get_proc_address(c"glProgramUniform1f");
421    PROGRAM_UNIFORM_MATRIX_5FV_PTR = get_proc_address(c"glProgramUniformMatrix4fv");
422    VIEWPORT_PTR = get_proc_address(c"glViewport");
423    BIND_FRAMEBUFFER_PTR = get_proc_address(c"glBindFramebuffer");
424    ENABLE_PTR = get_proc_address(c"glEnable");
425    DISABLE_PTR = get_proc_address(c"glDisable");
426    DEPTH_MASK_PTR = get_proc_address(c"glDepthMask");
427    DEPTH_FUNC_PTR = get_proc_address(c"glDepthFunc");
428    DEBUG_MESSAGE_CALLBACK_PTR = get_proc_address(c"glDebugMessageCallback");
429    DEBUG_MESSAGE_CONTROL_PTR = get_proc_address(c"glDebugMessageControl");
430}