tiny_gl/gl/
ffi.rs

1#![allow(non_snake_case)]
2
3mod enums;
4
5use core::ffi::{c_void, CStr};
6use crate::utils::*;
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(shader: GLuint, count: GLsizei, string: *const *const GLchar, length: *const GLint) {
16    call_ptr_4arg(SHADER_SOURCE_PTR, shader, count, string, length)
17}
18
19pub unsafe fn glCompileShader(shader: GLuint) {
20    call_ptr_1arg(COMPILE_SHADER_PTR, shader)
21}
22
23pub unsafe fn glDeleteShader(shader: GLuint) {
24    call_ptr_1arg(DELETE_SHADER_PTR, shader)
25}
26
27pub unsafe fn glGetShaderiv(shader: GLuint, pname: GLenum, params: *mut GLint) {
28    call_ptr_3arg(GET_SHADER_IV_PTR, shader, pname, params)
29}
30
31pub unsafe fn glGetShaderInfoLog(shader: GLuint, max_length: GLsizei, length: *mut GLsizei, info_log: *mut GLchar) {
32    call_ptr_4arg(GET_SHADER_INFO_LOG_PTR, shader, max_length, length, info_log)
33}
34
35pub unsafe fn glCreateProgram() -> GLuint {
36    call_ptr_0arg(CREATE_PROGRAM_PTR)
37}
38
39pub unsafe fn glAttachShader(program: GLuint, shader: GLuint) {
40    call_ptr_2arg(ATTACH_SHADER_PTR, program, shader)
41}
42
43pub unsafe fn glLinkProgram(program: GLuint) {
44    call_ptr_1arg(LINK_PROGRAM_PTR, program)
45}
46
47pub unsafe fn glGetProgramiv(program: GLuint, pname: GLenum, params: *mut GLint) {
48    call_ptr_3arg(GET_PROGRAM_IV_PTR, program, pname, params)
49}
50
51pub unsafe fn glGetProgramInfoLog(program: GLuint, max_length: GLsizei, length: *mut GLsizei, info_log: *mut GLchar) {
52    call_ptr_4arg(GET_PROGRAM_INFO_LOG_PTR, program, max_length, length, info_log)
53}
54
55pub unsafe fn glDeleteProgram(program: GLuint) {
56    call_ptr_1arg(DELETE_PROGRAM_PTR, program)
57}
58
59pub unsafe fn glDrawArrays(mode: GLenum, first: GLint, count: GLsizei) {
60    call_ptr_3arg(DRAW_ARRAYS_PTR, mode, first, count)
61}
62
63pub unsafe fn glCreateBuffers(n: GLsizei, buffers: *mut GLuint) {
64    call_ptr_2arg(CREATE_BUFFERS_PTR, n, buffers)
65}
66
67pub unsafe fn glNamedBufferData(buffer: GLuint, size: GLsizeiptr, data: *const c_void, usage: GLenum) {
68    call_ptr_4arg(NAMED_BUFFER_DATA_PTR, buffer, size, data, usage)
69}
70
71pub unsafe fn glDeleteBuffers(n: GLsizei, buffers: *const GLuint) {
72    call_ptr_2arg(DELETE_BUFFERS_PTR, n, buffers)
73}
74
75pub unsafe fn glCreateVertexArrays(n: GLsizei, arrays: *mut GLuint) {
76    call_ptr_2arg(CREATE_VERTEX_ARRAYS_PTR, n, arrays)
77}
78
79pub unsafe fn glVertexArrayVertexBuffer(vaobj: GLuint, bindingindex: GLuint, buffer: GLuint, offset: GLintptr, stride: GLsizei) {
80    call_ptr_5arg(VERTEX_ARRAY_VERTEX_BUFFER_PTR, vaobj, bindingindex, buffer, offset, stride)
81}
82
83pub unsafe fn glVertexArrayElementBuffer(vaobj: GLuint, buffer: GLuint) {
84    call_ptr_2arg(VERTEX_ARRAY_ELEMENT_BUFFER_PTR, vaobj, buffer)
85}
86
87pub unsafe fn glEnableVertexArrayAttrib(vaobj: GLuint, index: GLuint) {
88    call_ptr_2arg(ENABLE_VERTEX_ARRAY_ATTRIB_PTR, vaobj, index)
89}
90
91pub unsafe fn glVertexArrayAttribFormat(vaobj: GLuint, attribindex: GLuint, size: GLint, ty: GLenum, normalized: GLboolean, relativeoffset: GLuint) {
92    call_ptr_6arg(VERTEX_ARRAY_ATTRIB_FORMAT_PTR, vaobj, attribindex, size, ty, normalized, relativeoffset)
93}
94
95pub unsafe fn glVertexArrayAttribBinding(vaobj: GLuint, attribindex: GLuint, bindingindex: GLuint) {
96    call_ptr_3arg(VERTEX_ARRAY_ATTRIB_BINDING_PTR, vaobj, attribindex, bindingindex)
97}
98
99pub unsafe fn glDeleteVertexArrays(n: GLsizei, arrays: *const GLuint) {
100    call_ptr_2arg(DELETE_VERTEX_ARRAYS_PTR, n, arrays)
101}
102
103pub unsafe fn glNamedBufferStorage(buffer: GLuint, size: GLsizeiptr, data: *const c_void, flags: GLbitfield) {
104    call_ptr_4arg(NAMED_BUFFER_STORAGE_PTR, buffer, size, data, flags)
105}
106
107pub unsafe fn glCreateTextures(target: GLenum, n: GLsizei, textures: *mut GLuint) {
108    call_ptr_3arg(CREATE_TEXTURES_PTR, target, n, textures)
109}
110
111pub unsafe fn glDeleteTextures(n: GLsizei, textures: *const GLuint) {
112    call_ptr_2arg(DELETE_TEXTURES_PTR, n, textures)
113}
114
115pub unsafe fn glTextureStorage2D(texture: GLuint, levels: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) {
116    call_ptr_5arg(TEXTURE_STORAGE_2D_PTR, texture, levels, internalformat, width, height)
117}
118
119pub unsafe fn glCreateFramebuffers(n: GLsizei, framebuffers: *mut GLuint) {
120    call_ptr_2arg(CREATE_FRAMEBUFFERS_PTR, n, framebuffers)
121}
122
123pub unsafe fn glDeleteFramebuffers(n: GLsizei, framebuffers: *const GLuint) {
124    call_ptr_2arg(DELETE_FRAMEBUFFERS_PTR, n, framebuffers)
125}
126
127pub unsafe fn glNamedFramebufferTexture(framebuffer: GLuint, attachment: GLenum, texture: GLuint, level: GLint) {
128    call_ptr_4arg(NAMED_FRAMEBUFFER_TEXTURE_PTR, framebuffer, attachment, texture, level)
129}
130
131pub unsafe fn glUseProgram(program: GLuint) {
132    call_ptr_1arg(USE_PROGRAM_PTR, program)
133}
134
135pub unsafe fn glBindVertexArray(vertex_array: GLuint) {
136    call_ptr_1arg(BIND_VERTEX_ARRAY_PTR, vertex_array)
137}
138
139pub unsafe fn glClear(mask: GLbitfield) {
140    call_ptr_1arg(CLEAR_PTR, mask)
141}
142
143pub unsafe fn glClearColor(red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) {
144    call_ptr_4arg(CLEAR_COLOR_PTR, red, green, blue, alpha)
145}
146
147pub unsafe fn glGetUniformLocation(program: GLuint, name: *const GLchar) -> GLint {
148    call_ptr_2arg(GET_UNIFORM_LOCATION_PTR, program, name)
149}
150
151pub unsafe fn glProgramUniform1f(program: GLuint, location: GLint, v0: GLfloat) {
152    call_ptr_3arg(PROGRAM_UNIFORM_1F_PTR, program, location, v0)
153}
154
155pub unsafe fn glViewport(x: GLint, y: GLint, width: GLsizei, height: GLsizei) {
156    call_ptr_4arg(VIEWPORT_PTR, x, y, width, height)
157}
158
159pub unsafe fn glBindFramebuffer(target: GLenum, framebuffer: GLuint) {
160    call_ptr_2arg(BIND_FRAMEBUFFER_PTR, target, framebuffer)
161}
162
163static mut CREATE_SHADER_PTR: *const c_void = core::ptr::null();
164static mut SHADER_SOURCE_PTR: *const c_void = core::ptr::null();
165static mut COMPILE_SHADER_PTR: *const c_void = core::ptr::null();
166static mut DELETE_SHADER_PTR: *const c_void = core::ptr::null();
167static mut GET_SHADER_IV_PTR: *const c_void = core::ptr::null();
168static mut GET_SHADER_INFO_LOG_PTR: *const c_void = core::ptr::null();
169static mut CREATE_PROGRAM_PTR: *const c_void = core::ptr::null();
170static mut ATTACH_SHADER_PTR: *const c_void = core::ptr::null();
171static mut LINK_PROGRAM_PTR: *const c_void = core::ptr::null();
172static mut GET_PROGRAM_IV_PTR: *const c_void = core::ptr::null();
173static mut GET_PROGRAM_INFO_LOG_PTR: *const c_void = core::ptr::null();
174static mut DELETE_PROGRAM_PTR: *const c_void = core::ptr::null();
175static mut DRAW_ARRAYS_PTR: *const c_void = core::ptr::null();
176static mut CREATE_BUFFERS_PTR: *const c_void = core::ptr::null();
177static mut NAMED_BUFFER_DATA_PTR: *const c_void = core::ptr::null();
178static mut DELETE_BUFFERS_PTR: *const c_void = core::ptr::null();
179static mut CREATE_VERTEX_ARRAYS_PTR: *const c_void = core::ptr::null();
180static mut VERTEX_ARRAY_VERTEX_BUFFER_PTR: *const c_void = core::ptr::null();
181static mut VERTEX_ARRAY_ELEMENT_BUFFER_PTR: *const c_void = core::ptr::null();
182static mut ENABLE_VERTEX_ARRAY_ATTRIB_PTR: *const c_void = core::ptr::null();
183static mut VERTEX_ARRAY_ATTRIB_FORMAT_PTR: *const c_void = core::ptr::null();
184static mut VERTEX_ARRAY_ATTRIB_BINDING_PTR: *const c_void = core::ptr::null();
185static mut DELETE_VERTEX_ARRAYS_PTR: *const c_void = core::ptr::null();
186static mut NAMED_BUFFER_STORAGE_PTR: *const c_void = core::ptr::null();
187static mut CREATE_TEXTURES_PTR: *const c_void = core::ptr::null();
188static mut DELETE_TEXTURES_PTR: *const c_void = core::ptr::null();
189static mut TEXTURE_STORAGE_2D_PTR: *const c_void = core::ptr::null();
190static mut CREATE_FRAMEBUFFERS_PTR: *const c_void = core::ptr::null();
191static mut DELETE_FRAMEBUFFERS_PTR: *const c_void = core::ptr::null();
192static mut NAMED_FRAMEBUFFER_TEXTURE_PTR: *const c_void = core::ptr::null();
193static mut USE_PROGRAM_PTR: *const c_void = core::ptr::null();
194static mut BIND_VERTEX_ARRAY_PTR: *const c_void = core::ptr::null();
195static mut CLEAR_PTR: *const c_void = core::ptr::null();
196static mut CLEAR_COLOR_PTR: *const c_void = core::ptr::null();
197static mut GET_UNIFORM_LOCATION_PTR: *const c_void = core::ptr::null();
198static mut PROGRAM_UNIFORM_1F_PTR: *const c_void = core::ptr::null();
199static mut VIEWPORT_PTR: *const c_void = core::ptr::null();
200static mut BIND_FRAMEBUFFER_PTR: *const c_void = core::ptr::null();
201
202//TODO Implement for textures:
203// glTextureParameteri
204// glTextureSubImage2D
205// glBindTextureUnit
206// glGenerateTextureMipmap
207
208//TODO Implement for framebuffers:
209// glCheckNamedFramebufferStatus
210// glBlitNamedFramebuffer
211// glClearNamedFramebufferfv
212
213//TODO Others:
214// glGetError
215
216pub unsafe fn load(get_proc_address: impl Fn(&CStr)-> *const c_void) {
217    CREATE_SHADER_PTR = get_proc_address(c"glCreateShader");
218    SHADER_SOURCE_PTR = get_proc_address(c"glShaderSource");
219    COMPILE_SHADER_PTR = get_proc_address(c"glCompileShader");
220    DELETE_SHADER_PTR = get_proc_address(c"glDeleteShader");
221    GET_SHADER_IV_PTR = get_proc_address(c"glGetShaderiv");
222    GET_SHADER_INFO_LOG_PTR = get_proc_address(c"glGetShaderInfoLog");
223    CREATE_PROGRAM_PTR = get_proc_address(c"glCreateProgram");
224    ATTACH_SHADER_PTR = get_proc_address(c"glAttachShader");
225    LINK_PROGRAM_PTR = get_proc_address(c"glLinkProgram");
226    GET_PROGRAM_IV_PTR = get_proc_address(c"glGetProgramiv");
227    GET_PROGRAM_INFO_LOG_PTR = get_proc_address(c"glGetProgramInfoLog");
228    DELETE_PROGRAM_PTR = get_proc_address(c"glDeleteProgram");
229    DRAW_ARRAYS_PTR = get_proc_address(c"glDrawArrays");
230    CREATE_BUFFERS_PTR = get_proc_address(c"glCreateBuffers");
231    NAMED_BUFFER_DATA_PTR = get_proc_address(c"glNamedBufferData");
232    DELETE_BUFFERS_PTR = get_proc_address(c"glDeleteBuffers");
233    CREATE_VERTEX_ARRAYS_PTR = get_proc_address(c"glCreateVertexArrays");
234    VERTEX_ARRAY_VERTEX_BUFFER_PTR = get_proc_address(c"glVertexArrayVertexBuffer");
235    VERTEX_ARRAY_ELEMENT_BUFFER_PTR = get_proc_address(c"glVertexArrayElementBuffer");
236    ENABLE_VERTEX_ARRAY_ATTRIB_PTR = get_proc_address(c"glEnableVertexArrayAttrib");
237    VERTEX_ARRAY_ATTRIB_FORMAT_PTR = get_proc_address(c"glVertexArrayAttribFormat");
238    VERTEX_ARRAY_ATTRIB_BINDING_PTR = get_proc_address(c"glVertexArrayAttribBinding");
239    DELETE_VERTEX_ARRAYS_PTR = get_proc_address(c"glDeleteVertexArrays");
240    NAMED_BUFFER_STORAGE_PTR = get_proc_address(c"glNamedBufferStorage");
241    CREATE_TEXTURES_PTR = get_proc_address(c"glCreateTextures");
242    DELETE_TEXTURES_PTR = get_proc_address(c"glDeleteTextures");
243    TEXTURE_STORAGE_2D_PTR = get_proc_address(c"glTextureStorage2D");
244    CREATE_FRAMEBUFFERS_PTR = get_proc_address(c"glCreateFramebuffers");
245    DELETE_FRAMEBUFFERS_PTR = get_proc_address(c"glDeleteFramebuffers");
246    NAMED_FRAMEBUFFER_TEXTURE_PTR = get_proc_address(c"glNamedFramebufferTexture");
247    USE_PROGRAM_PTR = get_proc_address(c"glUseProgram");
248    BIND_VERTEX_ARRAY_PTR = get_proc_address(c"glBindVertexArray");
249    CLEAR_PTR = get_proc_address(c"glClear");
250    CLEAR_COLOR_PTR = get_proc_address(c"glClearColor");
251    GET_UNIFORM_LOCATION_PTR = get_proc_address(c"glGetUniformLocation");
252    PROGRAM_UNIFORM_1F_PTR = get_proc_address(c"glProgramUniform1f");
253    VIEWPORT_PTR = get_proc_address(c"glViewport");
254    BIND_FRAMEBUFFER_PTR = get_proc_address(c"glBindFramebuffer");
255}