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
290pub 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
370pub 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}