makepad_platform/os/linux/
gl_sys.rs

1#![allow(non_snake_case)]
2#![allow(non_upper_case_globals)]
3
4#[macro_export]
5macro_rules!gl_log_error {
6    ($libgl:ident) => {
7        {
8            let mut ret = false;
9            let mut i= 0;
10            loop{
11                #[allow(unused_unsafe)]
12                let err = unsafe{($libgl.glGetError)()};
13                if err!=0{
14                    crate::log!("Caught GL Error({i}) {:x} ", err);
15                    ret = true;
16                }
17                else{break}
18                i += 1;
19            }
20            ret
21        }
22    };
23}
24
25#[macro_export]
26macro_rules!gl_flush_error {
27    ($libgl:ident) => {
28        {
29            loop{
30                #[allow(unused_unsafe)]
31                let err = unsafe{($libgl.glGetError)()};
32                if err!=0{}
33                else{break}
34            }
35        }
36    };
37}
38
39use std::os::raw;
40
41pub type GLenum = raw::c_uint;
42pub type GLsizei = raw::c_int;
43pub type GLuint = raw::c_uint;
44pub type GLint = raw::c_int;
45pub type GLdouble = raw::c_double;
46pub type GLfloat = raw::c_float;
47pub type GLbitfield = raw::c_uint;
48pub type GLboolean = raw::c_uchar;
49pub type GLchar = raw::c_char;
50pub type GLubyte = raw::c_uchar;
51pub type GLsizeiptr = isize; 
52
53pub const TRUE: GLboolean = 1;
54pub const ARRAY_BUFFER: GLenum = 0x8892;
55pub const ELEMENT_ARRAY_BUFFER: GLenum = 0x8893;
56pub const TEXTURE0: GLenum = 0x84C0;
57pub const TEXTURE_2D: GLenum = 0x0DE1;
58pub const TRIANGLES: GLenum = 0x0004;
59pub const UNSIGNED_INT: GLenum = 0x1405;
60pub const DEPTH_TEST: GLenum = 0x0B71;
61pub const LEQUAL: GLenum = 0x0203;
62pub const FUNC_ADD: GLenum = 0x8006;
63pub const ONE: GLenum = 1;
64pub const ONE_MINUS_SRC_ALPHA: GLenum = 0x0303;
65pub const BLEND: GLenum = 0x0BE2;
66pub const FRAMEBUFFER: GLenum = 0x8D40;
67pub const COLOR_BUFFER_BIT: GLenum = 0x00004000;
68pub const DEPTH_BUFFER_BIT: GLenum = 0x00000100;
69pub const RENDERBUFFER: GLenum = 0x8D41;
70pub const DEPTH_COMPONENT16: GLenum = 0x81A5;
71pub const DEPTH_COMPONENT24: GLenum = 0x81A6;
72pub const DYNAMIC_DRAW:GLenum = 0x88E8;
73pub const FRAMEBUFFER_SRGB_EXT: GLenum = 0x8DB9;
74pub const DEPTH_ATTACHMENT: GLenum = 0x8D00;
75pub const COLOR_ATTACHMENT0: GLenum = 0x8CE0;
76pub const INFO_LOG_LENGTH: GLenum = 0x8B84;
77pub const COMPILE_STATUS: GLenum = 0x8B81;
78pub const LINK_STATUS: GLenum = 0x8B82;
79pub const VERTEX_SHADER: GLenum = 0x8B31;
80pub const FRAGMENT_SHADER: GLenum = 0x8B30;
81pub const TEXTURE_MIN_FILTER: GLenum = 0x2801;
82pub const LINEAR: GLenum = 0x2601;
83pub const LINEAR_MIPMAP_LINEAR: GLenum = 0x2703;
84pub const TEXTURE_BASE_LEVEL: GLenum = 0x813C;
85pub const TEXTURE_MAX_LEVEL: GLenum = 0x813D;
86pub const TEXTURE_MAG_FILTER: GLenum = 0x2800;
87pub const TEXTURE_WIDTH: GLenum = 0x1000;
88pub const TEXTURE_HEIGHT: GLenum = 0x1001;
89pub const TEXTURE_2D_ARRAY: GLenum = 0x8C1A;
90pub const TEXTURE_BORDER_COLOR: GLenum = 0x1004;
91pub const DEBUG_OUTPUT: GLenum = 0x92E0;
92
93pub const RGBA: GLenum = 0x1908;
94pub const BGRA: GLenum = 0x80E1;
95pub const RED: GLenum = 0x1903;
96pub const RG: GLenum =  0x8227;
97pub const R8: GLenum =  0x8229;
98pub const UNSIGNED_BYTE: GLenum = 0x1401;
99pub const HALF_FLOAT: GLenum =  0x140B;
100pub const FLOAT: GLenum = 0x1406;
101pub const SRGB8_ALPHA8L: GLenum =  0x8C43;
102
103pub const DEPTH_COMPONENT32F: GLenum = 0x8CAC;
104pub const STATIC_DRAW: GLenum = 0x88E4;
105pub const NEAREST: GLenum = 0x2600;
106pub const TEXTURE_WRAP_S: GLenum = 0x2802;
107pub const TEXTURE_WRAP_T: GLenum = 0x2803;
108pub const CLAMP_TO_EDGE: GLenum = 0x812F;
109pub const CLAMP_TO_BORDER: GLenum = 0x812D;
110pub const PROGRAM_BINARY_LENGTH: GLenum = 0x8741;
111pub const NO_ERROR: GLenum = 0x0;
112pub const UNPACK_ALIGNMENT: GLenum = 0x0CF5;
113pub const UNPACK_ROW_LENGTH: GLenum = 0x0CF2;
114pub const UNPACK_SKIP_PIXELS: GLenum = 0x0CF4;
115pub const UNPACK_SKIP_ROWS: GLenum = 0x0CF3;
116pub const DRAW_FRAMEBUFFER:GLenum = 0x8CA9;
117pub const TEXTURE_EXTERNAL_OES: GLenum = 0x8D65;
118pub const EXTENSIONS: GLenum = 0x1F03;
119pub const VENDOR: GLenum = 0x1F00;
120pub const RENDERER: GLenum = 0x1F01;
121pub const SCISSOR_TEST: GLenum = 0x0C11;
122pub const CULL_FACE:GLenum = 0x0B44;
123pub const DONT_CARE:GLenum = 0x1100;
124pub const UNIFORM_BUFFER:GLenum = 0x8A11;
125
126pub type TglGenVertexArrays = unsafe extern "C" fn(n: GLsizei, arrays: *mut GLuint) -> () ;
127pub type TglBindVertexArray = unsafe extern "C" fn(array: GLuint) -> () ;
128pub type TglBindBuffer = unsafe extern "C" fn(target: GLenum, buffer: GLuint) -> () ;
129pub type TglVertexAttribPointer = unsafe extern "C" fn(index: GLuint, size: GLint, type_: GLenum, normalized: GLboolean, stride: GLsizei, pointer: *const raw::c_void) -> () ;
130pub type TglEnableVertexAttribArray = unsafe extern "C" fn(index: GLuint) -> () ;
131pub type TglVertexAttribDivisor = unsafe extern "C" fn(index: GLuint, divisor: GLuint) -> () ;
132pub type TglUseProgram = unsafe extern "C" fn(program: GLuint) -> () ;
133pub type TglActiveTexture = unsafe extern "C" fn(texture: GLenum) -> () ;
134pub type TglBindTexture = unsafe extern "C" fn(target: GLenum, texture: GLuint) -> () ;
135pub type TglDrawElementsInstanced = unsafe extern "C" fn(mode: GLenum, count: GLsizei, type_: GLenum, indices: *const raw::c_void, instancecount: GLsizei) -> () ;
136pub type TglEnable = unsafe extern "C" fn(cap: GLenum) -> () ;
137pub type TglDepthFunc = unsafe extern "C" fn(func: GLenum) -> () ;
138pub type TglBlendEquationSeparate = unsafe extern "C" fn(modeRGB: GLenum, modeAlpha: GLenum) -> () ;
139pub type TglBlendFuncSeparate = unsafe extern "C" fn(sfactorRGB: GLenum, dfactorRGB: GLenum, sfactorAlpha: GLenum, dfactorAlpha: GLenum) -> () ;
140pub type TglViewport = unsafe extern "C" fn(x: GLint, y: GLint, width: GLsizei, height: GLsizei) -> () ;
141pub type TglBindFramebuffer = unsafe extern "C" fn(target: GLenum, framebuffer: GLuint) -> () ;
142pub type TglClearDepthf = unsafe extern "C" fn(d: GLfloat) -> () ;
143pub type TglClearColor = unsafe extern "C" fn(red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) -> () ;
144pub type TglClear = unsafe extern "C" fn(mask: GLbitfield) -> () ;
145pub type TglGenFramebuffers = unsafe extern "C" fn(n: GLsizei, framebuffers: *mut GLuint) -> () ;
146pub type TglGenRenderbuffers = unsafe extern "C" fn(n: GLsizei, renderbuffers: *mut GLuint) -> () ;
147pub type TglBindRenderbuffer = unsafe extern "C" fn(target: GLenum, renderbuffer: GLuint) -> () ;
148pub type TglRenderbufferStorage = unsafe extern "C" fn(target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) -> () ;
149pub type TglDisable = unsafe extern "C" fn(cap: GLenum) -> () ;
150pub type TglFramebufferRenderbuffer = unsafe extern "C" fn(target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: GLuint) -> () ;
151pub type TglFramebufferTexture2D = unsafe extern "C" fn(target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLuint, level: GLint) -> () ;
152pub type TglGetShaderiv = unsafe extern "C" fn(shader: GLuint, pname: GLenum, params: *mut GLint) -> () ;
153pub type TglGetProgramiv = unsafe extern "C" fn(program: GLuint, pname: GLenum, params: *mut GLint) -> () ;
154pub type TglGetShaderInfoLog = unsafe extern "C" fn(shader: GLuint, bufSize: GLsizei, length: *mut GLsizei, infoLog: *mut GLchar) -> () ;
155pub type TglGetProgramInfoLog = unsafe extern "C" fn(program: GLuint, bufSize: GLsizei, length: *mut GLsizei, infoLog: *mut GLchar) -> () ;
156pub type TglGetAttribLocation = unsafe extern "C" fn(program: GLuint, name: *const GLchar) -> GLint ;
157pub type TglGetUniformLocation = unsafe extern "C" fn(program: GLuint, name: *const GLchar) -> GLint ;
158pub type TglCreateShader = unsafe extern "C" fn(type_: GLenum) -> GLuint ;
159pub type TglShaderSource = unsafe extern "C" fn(shader: GLuint, count: GLsizei, string: *const *const GLchar, length: *const GLint) -> () ;
160pub type TglCompileShader = unsafe extern "C" fn(shader: GLuint) -> () ;
161pub type TglCreateProgram = unsafe extern "C" fn() -> GLuint ;
162pub type TglAttachShader = unsafe extern "C" fn(program: GLuint, shader: GLuint) -> () ;
163pub type TglLinkProgram = unsafe extern "C" fn(program: GLuint) -> () ;
164pub type TglDeleteShader = unsafe extern "C" fn(shader: GLuint) -> () ;
165pub type TglUniform1fv = unsafe extern "C" fn(location: GLint, count: GLsizei, value: *const GLfloat) -> () ;
166pub type TglGenTextures = unsafe extern "C" fn(n: GLsizei, textures: *mut GLuint) -> () ;
167pub type TglTexParameteri = unsafe extern "C" fn(target: GLenum, pname: GLenum, param: GLint) -> () ;
168pub type TglTexParameterfv = unsafe extern "C" fn(target: GLenum, pname: GLenum, param: *const GLfloat) -> () ;
169pub type TglTexImage2D = unsafe extern "C" fn(target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, type_: GLenum, pixels: *const raw::c_void) -> () ;
170pub type TglTexSubImage2D = unsafe extern "C" fn(target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, type_: GLenum, pixels: *const raw::c_void) -> () ;
171pub type TglGetTexLevelParameteriv = unsafe extern "C" fn(target: GLenum, level: GLint, pname: GLenum, params: *mut GLint) -> ();
172pub type TglDeleteTextures = unsafe extern "C" fn(n: GLsizei, textures: *const GLuint) -> () ;
173pub type TglGenBuffers = unsafe extern "C" fn(n: GLsizei, buffers: *mut GLuint) -> () ;
174pub type TglBufferData = unsafe extern "C" fn(target: GLenum, size: GLsizeiptr, data: *const raw::c_void, usage: GLenum) -> () ;
175pub type TglUniform1i = unsafe extern "C" fn(location: GLint, v0: GLint) -> () ;
176pub type TglGetError = unsafe extern "C" fn() -> GLenum ;
177pub type TglFinish = unsafe extern "C" fn() -> () ;
178pub type TglGetProgramBinary = unsafe extern "C" fn(program: GLuint, bufSize: GLsizei, length: *mut GLsizei, binaryFormat: *mut GLenum, binary: *mut raw::c_void) -> () ;
179pub type TglProgramBinary = unsafe extern "C" fn(program: GLuint, binaryFormat: GLenum, binary: *const raw::c_void, length: GLsizei) -> () ;
180pub type TglDeleteRenderbuffers = unsafe extern "C" fn(n: GLsizei, renderbuffers: *const GLuint) -> () ;
181pub type TglDeleteBuffers = unsafe extern "C" fn(n: GLsizei, buffers: *const GLuint) -> () ;
182pub type TglDeleteFramebuffers = unsafe extern "C" fn(n: GLsizei, framebuffers: *const GLuint) -> () ;
183pub type TglDeleteVertexArrays = unsafe extern "C" fn(n: GLsizei, arrays: *const GLuint) -> () ;
184pub type TglGenerateMipmap = unsafe extern "C" fn(target: GLenum) -> () ;
185pub type TglPixelStorei = unsafe extern "C" fn(pname: GLenum, param: GLint) -> () ;
186pub type TglGetString = unsafe extern "C" fn(name: GLenum) -> *const GLubyte ;
187pub type TglTexStorage3D = unsafe extern "C" fn (target:GLenum, levels:GLsizei, internal_format: GLenum, width: GLsizei, height:GLsizei, depth:GLsizei);
188pub type TglFramebufferTextureMultiviewOVR = unsafe extern "C" fn(target:GLenum , attachment:GLenum, texture:GLuint, level:GLint, base_view_index:GLint, num_views:GLsizei);
189pub type TglColorMask = unsafe extern "C" fn(r: GLboolean, g:GLboolean, b:GLboolean, a:GLboolean);
190pub type TglDepthMask = unsafe extern "C" fn(d: GLboolean);
191pub type TglScissor = unsafe extern "C" fn(x:GLint, y:GLint, width:GLsizei, height:GLsizei);
192
193pub type TglInvalidateFramebuffer = unsafe extern "C" fn(target:GLenum, num_attachments:GLsizei, attachments: *const GLenum);
194pub type TglDebugMessageCallback = unsafe extern "C" fn(ptr: TglDebugMessageCallbackFn, param: *const raw::c_void);
195pub type TglDebugMessageCallbackFn = unsafe extern "C" fn(source: GLenum, ty: GLenum, id: GLuint, severity:GLenum, length:GLsizei, msg: *const GLchar, param: *const raw::c_void);
196pub type TglGetUniformBlockIndex = unsafe extern "C" fn(program:GLuint, uniform_block_name: *const GLchar)->GLuint;
197pub type TglUniformBlockBinding = unsafe extern "C" fn(program: GLuint, block_index: GLuint, binding: GLuint);
198pub type TglBindBufferBase = unsafe extern "C" fn(target:GLenum, index: GLuint, buffer:GLuint);
199
200pub type TglFramebufferTextureMultisampleMultiviewOVR = unsafe extern "C" fn(target:GLenum , attachment:GLenum, texture:GLuint, level:GLint, samples:GLsizei, base_view_index:GLint, num_views:GLsizei);
201
202pub type TglGetDebugMessageLog = unsafe extern "C" fn(count:GLuint,
203    buf_size:GLsizei,
204    sources: *mut GLenum,
205    types: &mut GLenum,
206    ids: *mut GLuint,
207    severities: *mut GLenum,
208    lengths: *mut GLsizei,
209    message_log: *mut GLchar);
210    
211pub type TglDebugMessageControl = unsafe extern "C" fn(
212    source:GLenum,
213    ty: GLenum,
214    severity: GLenum,
215    count: GLsizei,
216    ids: *const GLuint,
217    enabled: GLboolean);
218    
219pub struct LibGl{
220    pub glGenVertexArrays: TglGenVertexArrays,
221    pub glBindVertexArray: TglBindVertexArray,
222    pub glBindBuffer: TglBindBuffer,
223    pub glVertexAttribPointer: TglVertexAttribPointer,
224    pub glEnableVertexAttribArray: TglEnableVertexAttribArray,
225    pub glVertexAttribDivisor: TglVertexAttribDivisor,
226    pub glUseProgram: TglUseProgram,
227    pub glActiveTexture: TglActiveTexture,
228    pub glBindTexture: TglBindTexture,
229    pub glDrawElementsInstanced: TglDrawElementsInstanced,
230    pub glEnable: TglEnable,
231    pub glDepthFunc: TglDepthFunc,
232    pub glBlendEquationSeparate: TglBlendEquationSeparate,
233    pub glBlendFuncSeparate: TglBlendFuncSeparate,
234    pub glViewport: TglViewport,
235    pub glBindFramebuffer: TglBindFramebuffer,
236    pub glClearDepthf: TglClearDepthf,
237    pub glClearColor: TglClearColor,
238    pub glClear: TglClear,
239    pub glGenFramebuffers: TglGenFramebuffers,
240    pub glGenRenderbuffers: TglGenRenderbuffers,
241    pub glBindRenderbuffer: TglBindRenderbuffer,
242    pub glRenderbufferStorage: TglRenderbufferStorage,
243    pub glDisable: TglDisable,
244    pub glFramebufferRenderbuffer: TglFramebufferRenderbuffer,
245    pub glFramebufferTexture2D: TglFramebufferTexture2D,
246    pub glGetShaderiv: TglGetShaderiv,
247    pub glGetProgramiv: TglGetProgramiv,
248    pub glGetShaderInfoLog: TglGetShaderInfoLog,
249    pub glGetProgramInfoLog: TglGetProgramInfoLog,
250    pub glGetAttribLocation: TglGetAttribLocation,
251    pub glGetUniformLocation: TglGetUniformLocation,
252    pub glCreateShader: TglCreateShader,
253    pub glShaderSource: TglShaderSource,
254    pub glCompileShader: TglCompileShader,
255    pub glCreateProgram: TglCreateProgram,
256    pub glAttachShader: TglAttachShader,
257    pub glLinkProgram: TglLinkProgram,
258    pub glDeleteShader: TglDeleteShader,
259    pub glUniform1fv: TglUniform1fv,
260    pub glGenTextures: TglGenTextures,
261    pub glTexParameteri: TglTexParameteri,
262    pub glTexParameterfv: TglTexParameterfv,
263    pub glTexImage2D: TglTexImage2D,
264    pub glTexSubImage2D: TglTexSubImage2D,
265    pub glGetTexLevelParameteriv: TglGetTexLevelParameteriv,
266    pub glGenBuffers: TglGenBuffers,
267    pub glBufferData: TglBufferData,
268    pub glUniform1i: TglUniform1i,
269    pub glGetError: TglGetError,
270    pub glFinish: TglFinish,
271    pub glGetProgramBinary: TglGetProgramBinary,
272    pub glProgramBinary: TglProgramBinary,
273    pub glDeleteTextures: TglDeleteTextures,
274    pub glDeleteRenderbuffers: TglDeleteRenderbuffers,
275    pub glDeleteBuffers: TglDeleteBuffers,
276    pub glDeleteFramebuffers: TglDeleteFramebuffers,
277    pub glDeleteVertexArrays: TglDeleteVertexArrays,
278    pub glGenerateMipmap: TglGenerateMipmap,
279    pub glPixelStorei: TglPixelStorei,
280    pub glGetString: TglGetString,
281    pub glTexStorage3D: TglTexStorage3D,
282    pub glColorMask: TglColorMask,
283    pub glDepthMask: TglDepthMask,
284    pub glScissor: TglScissor,
285    pub glInvalidateFramebuffer: TglInvalidateFramebuffer,
286    pub glDebugMessageCallback: TglDebugMessageCallback,
287    pub glGetDebugMessageLog: TglGetDebugMessageLog,
288    pub glDebugMessageControl: TglDebugMessageControl,
289    pub glGetUniformBlockIndex: TglGetUniformBlockIndex,
290    pub glUniformBlockBinding: TglUniformBlockBinding,
291    pub glBindBufferBase: TglBindBufferBase,
292    pub glFramebufferTextureMultiviewOVR: Option<TglFramebufferTextureMultiviewOVR>,
293    pub glFramebufferTextureMultisampleMultiviewOVR: Option<TglFramebufferTextureMultisampleMultiviewOVR>,
294}
295
296
297
298macro_rules! load {
299    ($loadfn:expr, $ty:ident, $($sym:expr),*) => {
300        unsafe{
301            let syms = [$($sym,)*];
302            let ptr = $loadfn(&syms);
303            if ptr.is_null(){
304                Err(format!("Cannot find symbol {}", stringify!($ty)))
305            }
306            else{
307                Ok({ std::mem::transmute_copy::<_, $ty>(&ptr) })
308            }
309        }
310    };
311}
312
313
314impl LibGl{
315    pub fn enable_debugging(&self){
316        unsafe{(self.glEnable)(self::DEBUG_OUTPUT)};
317                                
318        unsafe extern "C" fn debug(_source: self::GLenum, _ty: self::GLenum, _id: self::GLuint, _severity:self::GLenum, _length:self::GLsizei, msg: *const self::GLchar, _param: *const std::ffi::c_void){
319            crate::log!("GL Debug info: {:?}", std::ffi::CStr::from_ptr(msg));
320        }
321                                
322        unsafe{(self.glDebugMessageControl)(
323            self::DONT_CARE,
324            self::DONT_CARE,
325            self::DONT_CARE,
326            0,
327            0 as * const _,
328            self::TRUE
329        )};
330        unsafe{(self.glDebugMessageCallback)(debug, 0 as *const _)};
331    }
332    
333    pub fn try_load<F>(mut loadfn: F)->Result<LibGl, String>
334    where F: FnMut(&[&'static str]) -> *const raw::c_void
335    {
336        Ok(Self{
337            glGenVertexArrays: load!(loadfn, TglGenVertexArrays, "glGenVertexArrays", "glGenVertexArraysAPPLE", "glGenVertexArraysOES")?,
338            glBindVertexArray: load!(loadfn, TglBindVertexArray, "glBindVertexArray", "glBindVertexArrayOES")?,
339            glBindBuffer: load!(loadfn, TglBindBuffer, "glBindBuffer", "glBindBufferARB")?,
340            glVertexAttribPointer: load!(loadfn, TglVertexAttribPointer, "glVertexAttribPointer", "glVertexAttribPointerARB")?,
341            glEnableVertexAttribArray: load!(loadfn, TglEnableVertexAttribArray, "glEnableVertexAttribArray", "glEnableVertexAttribArrayARB")?,
342            glVertexAttribDivisor: load!(loadfn, TglVertexAttribDivisor, "glVertexAttribDivisor", "glVertexAttribDivisorANGLE", "glVertexAttribDivisorARB", "glVertexAttribDivisorEXT", "glVertexAttribDivisorNV")?,
343            glUseProgram: load!(loadfn, TglUseProgram, "glUseProgram", "glUseProgramObjectARB")?,
344            glActiveTexture: load!(loadfn, TglActiveTexture, "glActiveTexture", "glActiveTextureARB")?,
345            glBindTexture: load!(loadfn, TglBindTexture, "glBindTexture", "glBindTextureEXT")?,
346            glDrawElementsInstanced: load!(loadfn, TglDrawElementsInstanced, "glDrawElementsInstanced", "glDrawElementsInstancedANGLE", "glDrawElementsInstancedARB", "glDrawElementsInstancedEXT", "glDrawElementsInstancedNV")?,
347            glEnable: load!(loadfn, TglEnable, "glEnable")?,
348            glDepthFunc: load!(loadfn, TglDepthFunc, "glDepthFunc")?,
349            glBlendEquationSeparate: load!(loadfn, TglBlendEquationSeparate, "glBlendEquationSeparate", "glBlendEquationSeparateEXT")?,
350            glBlendFuncSeparate: load!(loadfn, TglBlendFuncSeparate, "glBlendFuncSeparate", "glBlendFuncSeparateEXT", "glBlendFuncSeparateINGR")?,
351            glViewport: load!(loadfn, TglViewport, "glViewport")?,
352            glBindFramebuffer: load!(loadfn, TglBindFramebuffer, "glBindFramebuffer")?,
353            glClearColor: load!(loadfn, TglClearColor, "glClearColor")?,
354            glClear: load!(loadfn, TglClear, "glClear")?,
355            glGenFramebuffers: load!(loadfn, TglGenFramebuffers, "glGenFramebuffers", "glGenFramebuffersEXT")?,
356            glGenRenderbuffers: load!(loadfn, TglGenRenderbuffers, "glGenRenderbuffers", "glGenRenderbuffersEXT")?,
357            glBindRenderbuffer: load!(loadfn, TglBindRenderbuffer, "glBindRenderbuffer")?,
358            glRenderbufferStorage: load!(loadfn, TglRenderbufferStorage, "glRenderbufferStorage", "glRenderbufferStorageEXT")?,
359            glDisable: load!(loadfn, TglDisable, "glDisable")?,
360            glFramebufferRenderbuffer: load!(loadfn, TglFramebufferRenderbuffer, "glFramebufferRenderbuffer", "glFramebufferRenderbufferEXT")?,
361            glFramebufferTexture2D: load!(loadfn, TglFramebufferTexture2D, "glFramebufferTexture2D", "glFramebufferTexture2DEXT")?,
362            glGetShaderiv: load!(loadfn, TglGetShaderiv, "glGetShaderiv")?,
363            glGetProgramiv: load!(loadfn, TglGetProgramiv, "glGetProgramiv")?,
364            glGetShaderInfoLog: load!(loadfn, TglGetShaderInfoLog, "glGetShaderInfoLog")?,
365            glGetProgramInfoLog: load!(loadfn, TglGetProgramInfoLog, "glGetProgramInfoLog")?,
366            glGetAttribLocation: load!(loadfn, TglGetAttribLocation, "glGetAttribLocation", "glGetAttribLocationARB")?,
367            glGetUniformLocation: load!(loadfn, TglGetUniformLocation, "glGetUniformLocation", "glGetUniformLocationARB")?,
368            glCreateShader: load!(loadfn, TglCreateShader, "glCreateShader", "glCreateShaderObjectARB")?,
369            glShaderSource: load!(loadfn, TglShaderSource, "glShaderSource", "glShaderSourceARB")?,
370            glCompileShader: load!(loadfn, TglCompileShader, "glCompileShader", "glCompileShaderARB")?,
371            glCreateProgram: load!(loadfn, TglCreateProgram, "glCreateProgram", "glCreateProgramObjectARB")?,
372            glAttachShader: load!(loadfn, TglAttachShader, "glAttachShader", "glAttachObjectARB")?,
373            glLinkProgram: load!(loadfn, TglLinkProgram, "glLinkProgram", "glLinkProgramARB")?,
374            glDeleteShader: load!(loadfn, TglDeleteShader, "glDeleteShader")?,
375            glUniform1fv: load!(loadfn, TglUniform1fv, "glUniform1fv", "glUniform1fvARB")?,
376            glGenTextures: load!(loadfn, TglGenTextures, "glGenTextures")?,
377            glTexParameteri: load!(loadfn, TglTexParameteri, "glTexParameteri")?,
378            glTexParameterfv: load!(loadfn, TglTexParameterfv, "glTexParameterfv")?,
379            glTexImage2D: load!(loadfn, TglTexImage2D, "glTexImage2D")?,
380            glTexSubImage2D: load!(loadfn, TglTexSubImage2D, "glTexSubImage2D")?,
381            glGetTexLevelParameteriv: load!(loadfn, TglGetTexLevelParameteriv, "glGetTexLevelParameteriv" )?,
382            glDeleteTextures: load!(loadfn, TglDeleteTextures, "glDeleteTextures")?,
383            glGenBuffers: load!(loadfn, TglGenBuffers, "glGenBuffers", "glGenBuffersARB")?,
384            glBufferData: load!(loadfn, TglBufferData, "glBufferData", "glBufferDataARB")?,
385            glUniform1i: load!(loadfn, TglUniform1i, "glUniform1i", "glUniform1iARB")?,
386            glGetError: load!(loadfn, TglGetError, "glGetError")?,
387            glFinish: load!(loadfn, TglFinish, "glFinish")?,
388            glClearDepthf: load!(loadfn, TglClearDepthf, "glClearDepthf", "glClearDepthfOES")?,
389            glGetProgramBinary: load!(loadfn, TglGetProgramBinary, "glGetProgramBinary", "glGetProgramBinaryOES")?,
390            glProgramBinary: load!(loadfn, TglProgramBinary, "glProgramBinary", "glProgramBinaryOES")?,
391            glDeleteRenderbuffers: load!(loadfn, TglDeleteRenderbuffers, "glDeleteRenderbuffers", "glDeleteRenderbuffersEXT")?,
392            glDeleteBuffers: load!(loadfn, TglDeleteBuffers, "glDeleteBuffers", "glDeleteBuffersARB")?,
393            glDeleteFramebuffers: load!(loadfn, TglDeleteFramebuffers, "glDeleteFramebuffers", "glDeleteFramebuffersEXT")?,
394            glDeleteVertexArrays: load!(loadfn, TglDeleteVertexArrays, "glDeleteVertexArrays", "glDeleteVertexArraysAPPLE", "glDeleteVertexArraysOES")?,
395            glGenerateMipmap: load!(loadfn, TglGenerateMipmap, "glGenerateMipmap")?,
396            glPixelStorei: load!(loadfn, TglPixelStorei, "glPixelStorei")?,
397            glGetString: load!(loadfn, TglGetString, "glGetString")?,
398            glTexStorage3D: load!(loadfn, TglTexStorage3D, "glTexStorage3D")?,
399            glColorMask: load!(loadfn, TglColorMask, "glColorMask")?,
400            glDepthMask: load!(loadfn, TglDepthMask, "glDepthMask")?,
401            glScissor: load!(loadfn, TglScissor, "glScissor")?,
402            glInvalidateFramebuffer: load!(loadfn, TglInvalidateFramebuffer, "glInvalidateFramebuffer")?,
403            glDebugMessageCallback: load!(loadfn, TglDebugMessageCallback, "glDebugMessageCallback")?,
404            glGetDebugMessageLog: load!(loadfn, TglGetDebugMessageLog, "glGetDebugMessageLog")?,
405            glDebugMessageControl: load!(loadfn, TglDebugMessageControl, "glDebugMessageControl")?,
406            glGetUniformBlockIndex: load!(loadfn, TglGetUniformBlockIndex, "glGetUniformBlockIndex")?,
407            glUniformBlockBinding: load!(loadfn, TglUniformBlockBinding, "glUniformBlockBinding")?,
408            glBindBufferBase: load!(loadfn, TglBindBufferBase, "glBindBufferBase")?,
409            
410            // optional fns
411            glFramebufferTextureMultiviewOVR: load!(loadfn, TglFramebufferTextureMultiviewOVR, "glFramebufferTextureMultiviewOVR").ok(),
412            glFramebufferTextureMultisampleMultiviewOVR: load!(loadfn, TglFramebufferTextureMultisampleMultiviewOVR, "glFramebufferTextureMultisampleMultiviewOVR").ok()
413        })
414    }
415}