gl_context_loader/
lib.rs

1// Copyright 2014 The Servo Project Developers. See the COPYRIGHT
2// file at the top-level directory of this distribution.
3//
4// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
5// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
7// option. This file may not be copied, modified, or distributed
8// except according to those terms.
9
10#![cfg_attr(not(feature = "std"), no_std)]
11#![allow(non_snake_case)]
12
13#[cfg(feature = "std")]
14extern crate core;
15#[macro_use]
16extern crate alloc;
17
18use core::{ptr, mem};
19
20#[cfg(not(feature = "std"))]
21use alloc::string::String;
22#[cfg(not(feature = "std"))]
23use alloc::string::ToString;
24#[cfg(not(feature = "std"))]
25use alloc::vec::Vec;
26
27#[cfg(feature = "gleam_trait")]
28extern crate gleam;
29
30#[allow(non_camel_case_types, dead_code)]
31pub mod ctypes {
32    pub enum c_void {}
33    pub type c_char = i8;
34    pub type c_schar = i8;
35    pub type c_uchar = u8;
36    pub type c_short = i16;
37    pub type c_ushort = u16;
38    pub type c_int = i32;
39    pub type c_uint = u32;
40    pub type c_long = i64;
41    pub type c_ulong = u64;
42    pub type c_longlong = i64;
43    pub type c_ulonglong = u64;
44    pub type c_float = f32;
45    pub type c_double = f64;
46    pub type __int8 = i8;
47    pub type __uint8 = u8;
48    pub type __int16 = i16;
49    pub type __uint16 = u16;
50    pub type __int32 = i32;
51    pub type __uint32 = u32;
52    pub type __int64 = i64;
53    pub type __uint64 = u64;
54    pub type wchar_t = u16;
55}
56
57#[allow(non_camel_case_types, non_upper_case_globals)]
58pub mod gl {
59    use super::GLenum;
60
61    pub const ACCUM: GLenum = 0x0100;
62    pub const MAP_PERSISTENT_BIT: GLenum = 64;
63    pub const ACCUM_ALPHA_BITS: GLenum = 0x0D5B;
64    pub const ACCUM_BLUE_BITS: GLenum = 0x0D5A;
65    pub const ACCUM_BUFFER_BIT: GLenum = 0x00000200;
66    pub const ACCUM_CLEAR_VALUE: GLenum = 0x0B80;
67    pub const ACCUM_GREEN_BITS: GLenum = 0x0D59;
68    pub const ACCUM_RED_BITS: GLenum = 0x0D58;
69    pub const ACTIVE_ATTRIBUTES: GLenum = 0x8B89;
70    pub const ACTIVE_ATTRIBUTE_MAX_LENGTH: GLenum = 0x8B8A;
71    pub const ACTIVE_TEXTURE: GLenum = 0x84E0;
72    pub const ACTIVE_UNIFORMS: GLenum = 0x8B86;
73    pub const ACTIVE_UNIFORM_BLOCKS: GLenum = 0x8A36;
74    pub const ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: GLenum = 0x8A35;
75    pub const ACTIVE_UNIFORM_MAX_LENGTH: GLenum = 0x8B87;
76    pub const ADD: GLenum = 0x0104;
77    pub const ADD_SIGNED: GLenum = 0x8574;
78    pub const ALIASED_LINE_WIDTH_RANGE: GLenum = 0x846E;
79    pub const ALIASED_POINT_SIZE_RANGE: GLenum = 0x846D;
80    pub const ALL_ATTRIB_BITS: GLenum = 0xFFFFFFFF;
81    pub const ALPHA: GLenum = 0x1906;
82    pub const ALPHA12: GLenum = 0x803D;
83    pub const ALPHA16: GLenum = 0x803E;
84    pub const ALPHA16F_EXT: GLenum = 0x881C;
85    pub const ALPHA32F_EXT: GLenum = 0x8816;
86    pub const ALPHA4: GLenum = 0x803B;
87    pub const ALPHA8: GLenum = 0x803C;
88    pub const ALPHA8_EXT: GLenum = 0x803C;
89    pub const ALPHA_BIAS: GLenum = 0x0D1D;
90    pub const ALPHA_BITS: GLenum = 0x0D55;
91    pub const ALPHA_INTEGER: GLenum = 0x8D97;
92    pub const ALPHA_SCALE: GLenum = 0x0D1C;
93    pub const ALPHA_TEST: GLenum = 0x0BC0;
94    pub const ALPHA_TEST_FUNC: GLenum = 0x0BC1;
95    pub const ALPHA_TEST_REF: GLenum = 0x0BC2;
96    pub const ALREADY_SIGNALED: GLenum = 0x911A;
97    pub const ALWAYS: GLenum = 0x0207;
98    pub const AMBIENT: GLenum = 0x1200;
99    pub const AMBIENT_AND_DIFFUSE: GLenum = 0x1602;
100    pub const AND: GLenum = 0x1501;
101    pub const AND_INVERTED: GLenum = 0x1504;
102    pub const AND_REVERSE: GLenum = 0x1502;
103    pub const ANY_SAMPLES_PASSED: GLenum = 0x8C2F;
104    pub const ANY_SAMPLES_PASSED_CONSERVATIVE: GLenum = 0x8D6A;
105    pub const ARRAY_BUFFER: GLenum = 0x8892;
106    pub const ARRAY_BUFFER_BINDING: GLenum = 0x8894;
107    pub const ATTACHED_SHADERS: GLenum = 0x8B85;
108    pub const ATTRIB_STACK_DEPTH: GLenum = 0x0BB0;
109    pub const AUTO_NORMAL: GLenum = 0x0D80;
110    pub const AUX0: GLenum = 0x0409;
111    pub const AUX1: GLenum = 0x040A;
112    pub const AUX2: GLenum = 0x040B;
113    pub const AUX3: GLenum = 0x040C;
114    pub const AUX_BUFFERS: GLenum = 0x0C00;
115    pub const BACK: GLenum = 0x0405;
116    pub const BACK_LEFT: GLenum = 0x0402;
117    pub const BACK_RIGHT: GLenum = 0x0403;
118    pub const BGR: GLenum = 0x80E0;
119    pub const BGRA: GLenum = 0x80E1;
120    pub const BGRA8_EXT: GLenum = 0x93A1;
121    pub const BGRA_EXT: GLenum = 0x80E1;
122    pub const BGRA_INTEGER: GLenum = 0x8D9B;
123    pub const BGR_INTEGER: GLenum = 0x8D9A;
124    pub const BITMAP: GLenum = 0x1A00;
125    pub const BITMAP_TOKEN: GLenum = 0x0704;
126    pub const BLEND: GLenum = 0x0BE2;
127    pub const BLEND_ADVANCED_COHERENT_KHR: GLenum = 0x9285;
128    pub const BLEND_COLOR: GLenum = 0x8005;
129    pub const BLEND_DST: GLenum = 0x0BE0;
130    pub const BLEND_DST_ALPHA: GLenum = 0x80CA;
131    pub const BLEND_DST_RGB: GLenum = 0x80C8;
132    pub const BLEND_EQUATION: GLenum = 0x8009;
133    pub const BLEND_EQUATION_ALPHA: GLenum = 0x883D;
134    pub const BLEND_EQUATION_RGB: GLenum = 0x8009;
135    pub const BLEND_SRC: GLenum = 0x0BE1;
136    pub const BLEND_SRC_ALPHA: GLenum = 0x80CB;
137    pub const BLEND_SRC_RGB: GLenum = 0x80C9;
138    pub const BLUE: GLenum = 0x1905;
139    pub const BLUE_BIAS: GLenum = 0x0D1B;
140    pub const BLUE_BITS: GLenum = 0x0D54;
141    pub const BLUE_INTEGER: GLenum = 0x8D96;
142    pub const BLUE_SCALE: GLenum = 0x0D1A;
143    pub const BOOL: GLenum = 0x8B56;
144    pub const BOOL_VEC2: GLenum = 0x8B57;
145    pub const BOOL_VEC3: GLenum = 0x8B58;
146    pub const BOOL_VEC4: GLenum = 0x8B59;
147    pub const BUFFER: GLenum = 0x82E0;
148    pub const BUFFER_ACCESS: GLenum = 0x88BB;
149    pub const BUFFER_ACCESS_FLAGS: GLenum = 0x911F;
150    pub const BUFFER_KHR: GLenum = 0x82E0;
151    pub const BUFFER_MAPPED: GLenum = 0x88BC;
152    pub const BUFFER_MAP_LENGTH: GLenum = 0x9120;
153    pub const BUFFER_MAP_OFFSET: GLenum = 0x9121;
154    pub const BUFFER_MAP_POINTER: GLenum = 0x88BD;
155    pub const BUFFER_SIZE: GLenum = 0x8764;
156    pub const BUFFER_USAGE: GLenum = 0x8765;
157    pub const BYTE: GLenum = 0x1400;
158    pub const C3F_V3F: GLenum = 0x2A24;
159    pub const C4F_N3F_V3F: GLenum = 0x2A26;
160    pub const C4UB_V2F: GLenum = 0x2A22;
161    pub const C4UB_V3F: GLenum = 0x2A23;
162    pub const CCW: GLenum = 0x0901;
163    pub const CLAMP: GLenum = 0x2900;
164    pub const CLAMP_FRAGMENT_COLOR: GLenum = 0x891B;
165    pub const CLAMP_READ_COLOR: GLenum = 0x891C;
166    pub const CLAMP_TO_BORDER: GLenum = 0x812D;
167    pub const CLAMP_TO_EDGE: GLenum = 0x812F;
168    pub const CLAMP_VERTEX_COLOR: GLenum = 0x891A;
169    pub const CLEAR: GLenum = 0x1500;
170    pub const CLIENT_ACTIVE_TEXTURE: GLenum = 0x84E1;
171    pub const CLIENT_ALL_ATTRIB_BITS: GLenum = 0xFFFFFFFF;
172    pub const CLIENT_ATTRIB_STACK_DEPTH: GLenum = 0x0BB1;
173    pub const CLIENT_PIXEL_STORE_BIT: GLenum = 0x00000001;
174    pub const CLIENT_VERTEX_ARRAY_BIT: GLenum = 0x00000002;
175    pub const CLIP_DISTANCE0: GLenum = 0x3000;
176    pub const CLIP_DISTANCE1: GLenum = 0x3001;
177    pub const CLIP_DISTANCE2: GLenum = 0x3002;
178    pub const CLIP_DISTANCE3: GLenum = 0x3003;
179    pub const CLIP_DISTANCE4: GLenum = 0x3004;
180    pub const CLIP_DISTANCE5: GLenum = 0x3005;
181    pub const CLIP_DISTANCE6: GLenum = 0x3006;
182    pub const CLIP_DISTANCE7: GLenum = 0x3007;
183    pub const CLIP_PLANE0: GLenum = 0x3000;
184    pub const CLIP_PLANE1: GLenum = 0x3001;
185    pub const CLIP_PLANE2: GLenum = 0x3002;
186    pub const CLIP_PLANE3: GLenum = 0x3003;
187    pub const CLIP_PLANE4: GLenum = 0x3004;
188    pub const CLIP_PLANE5: GLenum = 0x3005;
189    pub const COEFF: GLenum = 0x0A00;
190    pub const COLOR: GLenum = 0x1800;
191    pub const COLORBURN_KHR: GLenum = 0x929A;
192    pub const COLORDODGE_KHR: GLenum = 0x9299;
193    pub const COLOR_ARRAY: GLenum = 0x8076;
194    pub const COLOR_ARRAY_BUFFER_BINDING: GLenum = 0x8898;
195    pub const COLOR_ARRAY_POINTER: GLenum = 0x8090;
196    pub const COLOR_ARRAY_SIZE: GLenum = 0x8081;
197    pub const COLOR_ARRAY_STRIDE: GLenum = 0x8083;
198    pub const COLOR_ARRAY_TYPE: GLenum = 0x8082;
199    pub const COLOR_ATTACHMENT0: GLenum = 0x8CE0;
200    pub const COLOR_ATTACHMENT1: GLenum = 0x8CE1;
201    pub const COLOR_ATTACHMENT10: GLenum = 0x8CEA;
202    pub const COLOR_ATTACHMENT11: GLenum = 0x8CEB;
203    pub const COLOR_ATTACHMENT12: GLenum = 0x8CEC;
204    pub const COLOR_ATTACHMENT13: GLenum = 0x8CED;
205    pub const COLOR_ATTACHMENT14: GLenum = 0x8CEE;
206    pub const COLOR_ATTACHMENT15: GLenum = 0x8CEF;
207    pub const COLOR_ATTACHMENT16: GLenum = 0x8CF0;
208    pub const COLOR_ATTACHMENT17: GLenum = 0x8CF1;
209    pub const COLOR_ATTACHMENT18: GLenum = 0x8CF2;
210    pub const COLOR_ATTACHMENT19: GLenum = 0x8CF3;
211    pub const COLOR_ATTACHMENT2: GLenum = 0x8CE2;
212    pub const COLOR_ATTACHMENT20: GLenum = 0x8CF4;
213    pub const COLOR_ATTACHMENT21: GLenum = 0x8CF5;
214    pub const COLOR_ATTACHMENT22: GLenum = 0x8CF6;
215    pub const COLOR_ATTACHMENT23: GLenum = 0x8CF7;
216    pub const COLOR_ATTACHMENT24: GLenum = 0x8CF8;
217    pub const COLOR_ATTACHMENT25: GLenum = 0x8CF9;
218    pub const COLOR_ATTACHMENT26: GLenum = 0x8CFA;
219    pub const COLOR_ATTACHMENT27: GLenum = 0x8CFB;
220    pub const COLOR_ATTACHMENT28: GLenum = 0x8CFC;
221    pub const COLOR_ATTACHMENT29: GLenum = 0x8CFD;
222    pub const COLOR_ATTACHMENT3: GLenum = 0x8CE3;
223    pub const COLOR_ATTACHMENT30: GLenum = 0x8CFE;
224    pub const COLOR_ATTACHMENT31: GLenum = 0x8CFF;
225    pub const COLOR_ATTACHMENT4: GLenum = 0x8CE4;
226    pub const COLOR_ATTACHMENT5: GLenum = 0x8CE5;
227    pub const COLOR_ATTACHMENT6: GLenum = 0x8CE6;
228    pub const COLOR_ATTACHMENT7: GLenum = 0x8CE7;
229    pub const COLOR_ATTACHMENT8: GLenum = 0x8CE8;
230    pub const COLOR_ATTACHMENT9: GLenum = 0x8CE9;
231    pub const COLOR_BUFFER_BIT: GLenum = 0x00004000;
232    pub const COLOR_CLEAR_VALUE: GLenum = 0x0C22;
233    pub const COLOR_INDEX: GLenum = 0x1900;
234    pub const COLOR_INDEXES: GLenum = 0x1603;
235    pub const COLOR_LOGIC_OP: GLenum = 0x0BF2;
236    pub const COLOR_MATERIAL: GLenum = 0x0B57;
237    pub const COLOR_MATERIAL_FACE: GLenum = 0x0B55;
238    pub const COLOR_MATERIAL_PARAMETER: GLenum = 0x0B56;
239    pub const COLOR_SUM: GLenum = 0x8458;
240    pub const COLOR_WRITEMASK: GLenum = 0x0C23;
241    pub const COMBINE: GLenum = 0x8570;
242    pub const COMBINE_ALPHA: GLenum = 0x8572;
243    pub const COMBINE_RGB: GLenum = 0x8571;
244    pub const COMPARE_REF_TO_TEXTURE: GLenum = 0x884E;
245    pub const COMPARE_R_TO_TEXTURE: GLenum = 0x884E;
246    pub const COMPILE: GLenum = 0x1300;
247    pub const COMPILE_AND_EXECUTE: GLenum = 0x1301;
248    pub const COMPILE_STATUS: GLenum = 0x8B81;
249    pub const COMPRESSED_ALPHA: GLenum = 0x84E9;
250    pub const COMPRESSED_INTENSITY: GLenum = 0x84EC;
251    pub const COMPRESSED_LUMINANCE: GLenum = 0x84EA;
252    pub const COMPRESSED_LUMINANCE_ALPHA: GLenum = 0x84EB;
253    pub const COMPRESSED_R11_EAC: GLenum = 0x9270;
254    pub const COMPRESSED_RED: GLenum = 0x8225;
255    pub const COMPRESSED_RED_RGTC1: GLenum = 0x8DBB;
256    pub const COMPRESSED_RG: GLenum = 0x8226;
257    pub const COMPRESSED_RG11_EAC: GLenum = 0x9272;
258    pub const COMPRESSED_RGB: GLenum = 0x84ED;
259    pub const COMPRESSED_RGB8_ETC2: GLenum = 0x9274;
260    pub const COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: GLenum = 0x9276;
261    pub const COMPRESSED_RGBA: GLenum = 0x84EE;
262    pub const COMPRESSED_RGBA8_ETC2_EAC: GLenum = 0x9278;
263    pub const COMPRESSED_RG_RGTC2: GLenum = 0x8DBD;
264    pub const COMPRESSED_SIGNED_R11_EAC: GLenum = 0x9271;
265    pub const COMPRESSED_SIGNED_RED_RGTC1: GLenum = 0x8DBC;
266    pub const COMPRESSED_SIGNED_RG11_EAC: GLenum = 0x9273;
267    pub const COMPRESSED_SIGNED_RG_RGTC2: GLenum = 0x8DBE;
268    pub const COMPRESSED_SLUMINANCE: GLenum = 0x8C4A;
269    pub const COMPRESSED_SLUMINANCE_ALPHA: GLenum = 0x8C4B;
270    pub const COMPRESSED_SRGB: GLenum = 0x8C48;
271    pub const COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: GLenum = 0x9279;
272    pub const COMPRESSED_SRGB8_ETC2: GLenum = 0x9275;
273    pub const COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: GLenum = 0x9277;
274    pub const COMPRESSED_SRGB_ALPHA: GLenum = 0x8C49;
275    pub const COMPRESSED_TEXTURE_FORMATS: GLenum = 0x86A3;
276    pub const CONDITION_SATISFIED: GLenum = 0x911C;
277    pub const CONSTANT: GLenum = 0x8576;
278    pub const CONSTANT_ALPHA: GLenum = 0x8003;
279    pub const CONSTANT_ATTENUATION: GLenum = 0x1207;
280    pub const CONSTANT_COLOR: GLenum = 0x8001;
281    pub const CONTEXT_COMPATIBILITY_PROFILE_BIT: GLenum = 0x00000002;
282    pub const CONTEXT_CORE_PROFILE_BIT: GLenum = 0x00000001;
283    pub const CONTEXT_FLAGS: GLenum = 0x821E;
284    pub const CONTEXT_FLAG_DEBUG_BIT: GLenum = 0x00000002;
285    pub const CONTEXT_FLAG_DEBUG_BIT_KHR: GLenum = 0x00000002;
286    pub const CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT: GLenum = 0x00000001;
287    pub const CONTEXT_PROFILE_MASK: GLenum = 0x9126;
288    pub const COORD_REPLACE: GLenum = 0x8862;
289    pub const COPY: GLenum = 0x1503;
290    pub const COPY_INVERTED: GLenum = 0x150C;
291    pub const COPY_PIXEL_TOKEN: GLenum = 0x0706;
292    pub const COPY_READ_BUFFER: GLenum = 0x8F36;
293    pub const COPY_READ_BUFFER_BINDING: GLenum = 0x8F36;
294    pub const COPY_WRITE_BUFFER: GLenum = 0x8F37;
295    pub const COPY_WRITE_BUFFER_BINDING: GLenum = 0x8F37;
296    pub const CULL_FACE: GLenum = 0x0B44;
297    pub const CULL_FACE_MODE: GLenum = 0x0B45;
298    pub const CURRENT_BIT: GLenum = 0x00000001;
299    pub const CURRENT_COLOR: GLenum = 0x0B00;
300    pub const CURRENT_FOG_COORD: GLenum = 0x8453;
301    pub const CURRENT_FOG_COORDINATE: GLenum = 0x8453;
302    pub const CURRENT_INDEX: GLenum = 0x0B01;
303    pub const CURRENT_NORMAL: GLenum = 0x0B02;
304    pub const CURRENT_PROGRAM: GLenum = 0x8B8D;
305    pub const CURRENT_QUERY: GLenum = 0x8865;
306    pub const CURRENT_QUERY_EXT: GLenum = 0x8865;
307    pub const CURRENT_RASTER_COLOR: GLenum = 0x0B04;
308    pub const CURRENT_RASTER_DISTANCE: GLenum = 0x0B09;
309    pub const CURRENT_RASTER_INDEX: GLenum = 0x0B05;
310    pub const CURRENT_RASTER_POSITION: GLenum = 0x0B07;
311    pub const CURRENT_RASTER_POSITION_VALID: GLenum = 0x0B08;
312    pub const CURRENT_RASTER_SECONDARY_COLOR: GLenum = 0x845F;
313    pub const CURRENT_RASTER_TEXTURE_COORDS: GLenum = 0x0B06;
314    pub const CURRENT_SECONDARY_COLOR: GLenum = 0x8459;
315    pub const CURRENT_TEXTURE_COORDS: GLenum = 0x0B03;
316    pub const CURRENT_VERTEX_ATTRIB: GLenum = 0x8626;
317    pub const CW: GLenum = 0x0900;
318    pub const DARKEN_KHR: GLenum = 0x9297;
319    pub const DEBUG_CALLBACK_FUNCTION: GLenum = 0x8244;
320    pub const DEBUG_CALLBACK_FUNCTION_KHR: GLenum = 0x8244;
321    pub const DEBUG_CALLBACK_USER_PARAM: GLenum = 0x8245;
322    pub const DEBUG_CALLBACK_USER_PARAM_KHR: GLenum = 0x8245;
323    pub const DEBUG_GROUP_STACK_DEPTH: GLenum = 0x826D;
324    pub const DEBUG_GROUP_STACK_DEPTH_KHR: GLenum = 0x826D;
325    pub const DEBUG_LOGGED_MESSAGES: GLenum = 0x9145;
326    pub const DEBUG_LOGGED_MESSAGES_KHR: GLenum = 0x9145;
327    pub const DEBUG_NEXT_LOGGED_MESSAGE_LENGTH: GLenum = 0x8243;
328    pub const DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR: GLenum = 0x8243;
329    pub const DEBUG_OUTPUT: GLenum = 0x92E0;
330    pub const DEBUG_OUTPUT_KHR: GLenum = 0x92E0;
331    pub const DEBUG_OUTPUT_SYNCHRONOUS: GLenum = 0x8242;
332    pub const DEBUG_OUTPUT_SYNCHRONOUS_KHR: GLenum = 0x8242;
333    pub const DEBUG_SEVERITY_HIGH: GLenum = 0x9146;
334    pub const DEBUG_SEVERITY_HIGH_KHR: GLenum = 0x9146;
335    pub const DEBUG_SEVERITY_LOW: GLenum = 0x9148;
336    pub const DEBUG_SEVERITY_LOW_KHR: GLenum = 0x9148;
337    pub const DEBUG_SEVERITY_MEDIUM: GLenum = 0x9147;
338    pub const DEBUG_SEVERITY_MEDIUM_KHR: GLenum = 0x9147;
339    pub const DEBUG_SEVERITY_NOTIFICATION: GLenum = 0x826B;
340    pub const DEBUG_SEVERITY_NOTIFICATION_KHR: GLenum = 0x826B;
341    pub const DEBUG_SOURCE_API: GLenum = 0x8246;
342    pub const DEBUG_SOURCE_API_KHR: GLenum = 0x8246;
343    pub const DEBUG_SOURCE_APPLICATION: GLenum = 0x824A;
344    pub const DEBUG_SOURCE_APPLICATION_KHR: GLenum = 0x824A;
345    pub const DEBUG_SOURCE_OTHER: GLenum = 0x824B;
346    pub const DEBUG_SOURCE_OTHER_KHR: GLenum = 0x824B;
347    pub const DEBUG_SOURCE_SHADER_COMPILER: GLenum = 0x8248;
348    pub const DEBUG_SOURCE_SHADER_COMPILER_KHR: GLenum = 0x8248;
349    pub const DEBUG_SOURCE_THIRD_PARTY: GLenum = 0x8249;
350    pub const DEBUG_SOURCE_THIRD_PARTY_KHR: GLenum = 0x8249;
351    pub const DEBUG_SOURCE_WINDOW_SYSTEM: GLenum = 0x8247;
352    pub const DEBUG_SOURCE_WINDOW_SYSTEM_KHR: GLenum = 0x8247;
353    pub const DEBUG_TYPE_DEPRECATED_BEHAVIOR: GLenum = 0x824D;
354    pub const DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR: GLenum = 0x824D;
355    pub const DEBUG_TYPE_ERROR: GLenum = 0x824C;
356    pub const DEBUG_TYPE_ERROR_KHR: GLenum = 0x824C;
357    pub const DEBUG_TYPE_MARKER: GLenum = 0x8268;
358    pub const DEBUG_TYPE_MARKER_KHR: GLenum = 0x8268;
359    pub const DEBUG_TYPE_OTHER: GLenum = 0x8251;
360    pub const DEBUG_TYPE_OTHER_KHR: GLenum = 0x8251;
361    pub const DEBUG_TYPE_PERFORMANCE: GLenum = 0x8250;
362    pub const DEBUG_TYPE_PERFORMANCE_KHR: GLenum = 0x8250;
363    pub const DEBUG_TYPE_POP_GROUP: GLenum = 0x826A;
364    pub const DEBUG_TYPE_POP_GROUP_KHR: GLenum = 0x826A;
365    pub const DEBUG_TYPE_PORTABILITY: GLenum = 0x824F;
366    pub const DEBUG_TYPE_PORTABILITY_KHR: GLenum = 0x824F;
367    pub const DEBUG_TYPE_PUSH_GROUP: GLenum = 0x8269;
368    pub const DEBUG_TYPE_PUSH_GROUP_KHR: GLenum = 0x8269;
369    pub const DEBUG_TYPE_UNDEFINED_BEHAVIOR: GLenum = 0x824E;
370    pub const DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR: GLenum = 0x824E;
371    pub const DECAL: GLenum = 0x2101;
372    pub const DECR: GLenum = 0x1E03;
373    pub const DECR_WRAP: GLenum = 0x8508;
374    pub const DELETE_STATUS: GLenum = 0x8B80;
375    pub const DEPTH: GLenum = 0x1801;
376    pub const DEPTH24_STENCIL8: GLenum = 0x88F0;
377    pub const DEPTH32F_STENCIL8: GLenum = 0x8CAD;
378    pub const DEPTH_ATTACHMENT: GLenum = 0x8D00;
379    pub const DEPTH_BIAS: GLenum = 0x0D1F;
380    pub const DEPTH_BITS: GLenum = 0x0D56;
381    pub const DEPTH_BUFFER_BIT: GLenum = 0x00000100;
382    pub const DEPTH_CLAMP: GLenum = 0x864F;
383    pub const DEPTH_CLEAR_VALUE: GLenum = 0x0B73;
384    pub const DEPTH_COMPONENT: GLenum = 0x1902;
385    pub const DEPTH_COMPONENT16: GLenum = 0x81A5;
386    pub const DEPTH_COMPONENT24: GLenum = 0x81A6;
387    pub const DEPTH_COMPONENT32: GLenum = 0x81A7;
388    pub const DEPTH_COMPONENT32F: GLenum = 0x8CAC;
389    pub const DEPTH_FUNC: GLenum = 0x0B74;
390    pub const DEPTH_RANGE: GLenum = 0x0B70;
391    pub const DEPTH_SCALE: GLenum = 0x0D1E;
392    pub const DEPTH_STENCIL: GLenum = 0x84F9;
393    pub const DEPTH_STENCIL_ATTACHMENT: GLenum = 0x821A;
394    pub const DEPTH_TEST: GLenum = 0x0B71;
395    pub const DEPTH_TEXTURE_MODE: GLenum = 0x884B;
396    pub const DEPTH_WRITEMASK: GLenum = 0x0B72;
397    pub const DIFFERENCE_KHR: GLenum = 0x929E;
398    pub const DIFFUSE: GLenum = 0x1201;
399    pub const DISPLAY_LIST: GLenum = 0x82E7;
400    pub const DITHER: GLenum = 0x0BD0;
401    pub const DOMAIN: GLenum = 0x0A02;
402    pub const DONT_CARE: GLenum = 0x1100;
403    pub const DOT3_RGB: GLenum = 0x86AE;
404    pub const DOT3_RGBA: GLenum = 0x86AF;
405    pub const DOUBLE: GLenum = 0x140A;
406    pub const DOUBLEBUFFER: GLenum = 0x0C32;
407    pub const DRAW_BUFFER: GLenum = 0x0C01;
408    pub const DRAW_BUFFER0: GLenum = 0x8825;
409    pub const DRAW_BUFFER1: GLenum = 0x8826;
410    pub const DRAW_BUFFER10: GLenum = 0x882F;
411    pub const DRAW_BUFFER11: GLenum = 0x8830;
412    pub const DRAW_BUFFER12: GLenum = 0x8831;
413    pub const DRAW_BUFFER13: GLenum = 0x8832;
414    pub const DRAW_BUFFER14: GLenum = 0x8833;
415    pub const DRAW_BUFFER15: GLenum = 0x8834;
416    pub const DRAW_BUFFER2: GLenum = 0x8827;
417    pub const DRAW_BUFFER3: GLenum = 0x8828;
418    pub const DRAW_BUFFER4: GLenum = 0x8829;
419    pub const DRAW_BUFFER5: GLenum = 0x882A;
420    pub const DRAW_BUFFER6: GLenum = 0x882B;
421    pub const DRAW_BUFFER7: GLenum = 0x882C;
422    pub const DRAW_BUFFER8: GLenum = 0x882D;
423    pub const DRAW_BUFFER9: GLenum = 0x882E;
424    pub const DRAW_FRAMEBUFFER: GLenum = 0x8CA9;
425    pub const DRAW_FRAMEBUFFER_BINDING: GLenum = 0x8CA6;
426    pub const DRAW_PIXELS_APPLE: GLenum = 0x8A0A;
427    pub const DRAW_PIXEL_TOKEN: GLenum = 0x0705;
428    pub const DST_ALPHA: GLenum = 0x0304;
429    pub const DST_COLOR: GLenum = 0x0306;
430    pub const DYNAMIC_COPY: GLenum = 0x88EA;
431    pub const DYNAMIC_DRAW: GLenum = 0x88E8;
432    pub const DYNAMIC_READ: GLenum = 0x88E9;
433    pub const EDGE_FLAG: GLenum = 0x0B43;
434    pub const EDGE_FLAG_ARRAY: GLenum = 0x8079;
435    pub const EDGE_FLAG_ARRAY_BUFFER_BINDING: GLenum = 0x889B;
436    pub const EDGE_FLAG_ARRAY_POINTER: GLenum = 0x8093;
437    pub const EDGE_FLAG_ARRAY_STRIDE: GLenum = 0x808C;
438    pub const ELEMENT_ARRAY_BUFFER: GLenum = 0x8893;
439    pub const ELEMENT_ARRAY_BUFFER_BINDING: GLenum = 0x8895;
440    pub const EMISSION: GLenum = 0x1600;
441    pub const ENABLE_BIT: GLenum = 0x00002000;
442    pub const EQUAL: GLenum = 0x0202;
443    pub const EQUIV: GLenum = 0x1509;
444    pub const EVAL_BIT: GLenum = 0x00010000;
445    pub const EXCLUSION_KHR: GLenum = 0x92A0;
446    pub const EXP: GLenum = 0x0800;
447    pub const EXP2: GLenum = 0x0801;
448    pub const EXTENSIONS: GLenum = 0x1F03;
449    pub const EYE_LINEAR: GLenum = 0x2400;
450    pub const EYE_PLANE: GLenum = 0x2502;
451    pub const FALSE: GLenum = 0;
452    pub const FASTEST: GLenum = 0x1101;
453    pub const FEEDBACK: GLenum = 0x1C01;
454    pub const FEEDBACK_BUFFER_POINTER: GLenum = 0x0DF0;
455    pub const FEEDBACK_BUFFER_SIZE: GLenum = 0x0DF1;
456    pub const FEEDBACK_BUFFER_TYPE: GLenum = 0x0DF2;
457    pub const FENCE_APPLE: GLenum = 0x8A0B;
458    pub const FILL: GLenum = 0x1B02;
459    pub const FIRST_VERTEX_CONVENTION: GLenum = 0x8E4D;
460    pub const FIXED: GLenum = 0x140C;
461    pub const FIXED_ONLY: GLenum = 0x891D;
462    pub const FLAT: GLenum = 0x1D00;
463    pub const FLOAT: GLenum = 0x1406;
464    pub const FLOAT_32_UNSIGNED_INT_24_8_REV: GLenum = 0x8DAD;
465    pub const FLOAT_MAT2: GLenum = 0x8B5A;
466    pub const FLOAT_MAT2x3: GLenum = 0x8B65;
467    pub const FLOAT_MAT2x4: GLenum = 0x8B66;
468    pub const FLOAT_MAT3: GLenum = 0x8B5B;
469    pub const FLOAT_MAT3x2: GLenum = 0x8B67;
470    pub const FLOAT_MAT3x4: GLenum = 0x8B68;
471    pub const FLOAT_MAT4: GLenum = 0x8B5C;
472    pub const FLOAT_MAT4x2: GLenum = 0x8B69;
473    pub const FLOAT_MAT4x3: GLenum = 0x8B6A;
474    pub const FLOAT_VEC2: GLenum = 0x8B50;
475    pub const FLOAT_VEC3: GLenum = 0x8B51;
476    pub const FLOAT_VEC4: GLenum = 0x8B52;
477    pub const FOG: GLenum = 0x0B60;
478    pub const FOG_BIT: GLenum = 0x00000080;
479    pub const FOG_COLOR: GLenum = 0x0B66;
480    pub const FOG_COORD: GLenum = 0x8451;
481    pub const FOG_COORDINATE: GLenum = 0x8451;
482    pub const FOG_COORDINATE_ARRAY: GLenum = 0x8457;
483    pub const FOG_COORDINATE_ARRAY_BUFFER_BINDING: GLenum = 0x889D;
484    pub const FOG_COORDINATE_ARRAY_POINTER: GLenum = 0x8456;
485    pub const FOG_COORDINATE_ARRAY_STRIDE: GLenum = 0x8455;
486    pub const FOG_COORDINATE_ARRAY_TYPE: GLenum = 0x8454;
487    pub const FOG_COORDINATE_SOURCE: GLenum = 0x8450;
488    pub const FOG_COORD_ARRAY: GLenum = 0x8457;
489    pub const FOG_COORD_ARRAY_BUFFER_BINDING: GLenum = 0x889D;
490    pub const FOG_COORD_ARRAY_POINTER: GLenum = 0x8456;
491    pub const FOG_COORD_ARRAY_STRIDE: GLenum = 0x8455;
492    pub const FOG_COORD_ARRAY_TYPE: GLenum = 0x8454;
493    pub const FOG_COORD_SRC: GLenum = 0x8450;
494    pub const FOG_DENSITY: GLenum = 0x0B62;
495    pub const FOG_END: GLenum = 0x0B64;
496    pub const FOG_HINT: GLenum = 0x0C54;
497    pub const FOG_INDEX: GLenum = 0x0B61;
498    pub const FOG_MODE: GLenum = 0x0B65;
499    pub const FOG_START: GLenum = 0x0B63;
500    pub const FRAGMENT_DEPTH: GLenum = 0x8452;
501    pub const FRAGMENT_SHADER: GLenum = 0x8B30;
502    pub const FRAGMENT_SHADER_DERIVATIVE_HINT: GLenum = 0x8B8B;
503    pub const FRAMEBUFFER: GLenum = 0x8D40;
504    pub const FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE: GLenum = 0x8215;
505    pub const FRAMEBUFFER_ATTACHMENT_ANGLE: GLenum = 0x93A3;
506    pub const FRAMEBUFFER_ATTACHMENT_BLUE_SIZE: GLenum = 0x8214;
507    pub const FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING: GLenum = 0x8210;
508    pub const FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE: GLenum = 0x8211;
509    pub const FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE: GLenum = 0x8216;
510    pub const FRAMEBUFFER_ATTACHMENT_GREEN_SIZE: GLenum = 0x8213;
511    pub const FRAMEBUFFER_ATTACHMENT_LAYERED: GLenum = 0x8DA7;
512    pub const FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: GLenum = 0x8CD1;
513    pub const FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: GLenum = 0x8CD0;
514    pub const FRAMEBUFFER_ATTACHMENT_RED_SIZE: GLenum = 0x8212;
515    pub const FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE: GLenum = 0x8217;
516    pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: GLenum = 0x8CD3;
517    pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER: GLenum = 0x8CD4;
518    pub const FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: GLenum = 0x8CD2;
519    pub const FRAMEBUFFER_BINDING: GLenum = 0x8CA6;
520    pub const FRAMEBUFFER_COMPLETE: GLenum = 0x8CD5;
521    pub const FRAMEBUFFER_DEFAULT: GLenum = 0x8218;
522    pub const FRAMEBUFFER_INCOMPLETE_ATTACHMENT: GLenum = 0x8CD6;
523    pub const FRAMEBUFFER_INCOMPLETE_DIMENSIONS: GLenum = 0x8CD9;
524    pub const FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: GLenum = 0x8CDB;
525    pub const FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS: GLenum = 0x8DA8;
526    pub const FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: GLenum = 0x8CD7;
527    pub const FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: GLenum = 0x8D56;
528    pub const FRAMEBUFFER_INCOMPLETE_READ_BUFFER: GLenum = 0x8CDC;
529    pub const FRAMEBUFFER_SRGB: GLenum = 0x8DB9;
530    pub const FRAMEBUFFER_UNDEFINED: GLenum = 0x8219;
531    pub const FRAMEBUFFER_UNSUPPORTED: GLenum = 0x8CDD;
532    pub const FRONT: GLenum = 0x0404;
533    pub const FRONT_AND_BACK: GLenum = 0x0408;
534    pub const FRONT_FACE: GLenum = 0x0B46;
535    pub const FRONT_LEFT: GLenum = 0x0400;
536    pub const FRONT_RIGHT: GLenum = 0x0401;
537    pub const FUNC_ADD: GLenum = 0x8006;
538    pub const FUNC_REVERSE_SUBTRACT: GLenum = 0x800B;
539    pub const FUNC_SUBTRACT: GLenum = 0x800A;
540    pub const GENERATE_MIPMAP: GLenum = 0x8191;
541    pub const GENERATE_MIPMAP_HINT: GLenum = 0x8192;
542    pub const GEOMETRY_INPUT_TYPE: GLenum = 0x8917;
543    pub const GEOMETRY_OUTPUT_TYPE: GLenum = 0x8918;
544    pub const GEOMETRY_SHADER: GLenum = 0x8DD9;
545    pub const GEOMETRY_VERTICES_OUT: GLenum = 0x8916;
546    pub const GEQUAL: GLenum = 0x0206;
547    pub const GPU_DISJOINT_EXT: GLenum = 0x8FBB;
548    pub const GREATER: GLenum = 0x0204;
549    pub const GREEN: GLenum = 0x1904;
550    pub const GREEN_BIAS: GLenum = 0x0D19;
551    pub const GREEN_BITS: GLenum = 0x0D53;
552    pub const GREEN_INTEGER: GLenum = 0x8D95;
553    pub const GREEN_SCALE: GLenum = 0x0D18;
554    pub const HALF_FLOAT: GLenum = 0x140B;
555    pub const HALF_FLOAT_OES: GLenum = 0x8D61;
556    pub const HARDLIGHT_KHR: GLenum = 0x929B;
557    pub const HIGH_FLOAT: GLenum = 0x8DF2;
558    pub const HIGH_INT: GLenum = 0x8DF5;
559    pub const HINT_BIT: GLenum = 0x00008000;
560    pub const HSL_COLOR_KHR: GLenum = 0x92AF;
561    pub const HSL_HUE_KHR: GLenum = 0x92AD;
562    pub const HSL_LUMINOSITY_KHR: GLenum = 0x92B0;
563    pub const HSL_SATURATION_KHR: GLenum = 0x92AE;
564    pub const IMPLEMENTATION_COLOR_READ_FORMAT: GLenum = 0x8B9B;
565    pub const IMPLEMENTATION_COLOR_READ_TYPE: GLenum = 0x8B9A;
566    pub const INCR: GLenum = 0x1E02;
567    pub const INCR_WRAP: GLenum = 0x8507;
568    pub const INDEX: GLenum = 0x8222;
569    pub const INDEX_ARRAY: GLenum = 0x8077;
570    pub const INDEX_ARRAY_BUFFER_BINDING: GLenum = 0x8899;
571    pub const INDEX_ARRAY_POINTER: GLenum = 0x8091;
572    pub const INDEX_ARRAY_STRIDE: GLenum = 0x8086;
573    pub const INDEX_ARRAY_TYPE: GLenum = 0x8085;
574    pub const INDEX_BITS: GLenum = 0x0D51;
575    pub const INDEX_CLEAR_VALUE: GLenum = 0x0C20;
576    pub const INDEX_LOGIC_OP: GLenum = 0x0BF1;
577    pub const INDEX_MODE: GLenum = 0x0C30;
578    pub const INDEX_OFFSET: GLenum = 0x0D13;
579    pub const INDEX_SHIFT: GLenum = 0x0D12;
580    pub const INDEX_WRITEMASK: GLenum = 0x0C21;
581    pub const INFO_LOG_LENGTH: GLenum = 0x8B84;
582    pub const INT: GLenum = 0x1404;
583    pub const INTENSITY: GLenum = 0x8049;
584    pub const INTENSITY12: GLenum = 0x804C;
585    pub const INTENSITY16: GLenum = 0x804D;
586    pub const INTENSITY4: GLenum = 0x804A;
587    pub const INTENSITY8: GLenum = 0x804B;
588    pub const INTERLEAVED_ATTRIBS: GLenum = 0x8C8C;
589    pub const INTERPOLATE: GLenum = 0x8575;
590    pub const INT_2_10_10_10_REV: GLenum = 0x8D9F;
591    pub const INT_SAMPLER_1D: GLenum = 0x8DC9;
592    pub const INT_SAMPLER_1D_ARRAY: GLenum = 0x8DCE;
593    pub const INT_SAMPLER_2D: GLenum = 0x8DCA;
594    pub const INT_SAMPLER_2D_ARRAY: GLenum = 0x8DCF;
595    pub const INT_SAMPLER_2D_MULTISAMPLE: GLenum = 0x9109;
596    pub const INT_SAMPLER_2D_MULTISAMPLE_ARRAY: GLenum = 0x910C;
597    pub const INT_SAMPLER_2D_RECT: GLenum = 0x8DCD;
598    pub const INT_SAMPLER_3D: GLenum = 0x8DCB;
599    pub const INT_SAMPLER_BUFFER: GLenum = 0x8DD0;
600    pub const INT_SAMPLER_CUBE: GLenum = 0x8DCC;
601    pub const INT_VEC2: GLenum = 0x8B53;
602    pub const INT_VEC3: GLenum = 0x8B54;
603    pub const INT_VEC4: GLenum = 0x8B55;
604    pub const INVALID_ENUM: GLenum = 0x0500;
605    pub const INVALID_FRAMEBUFFER_OPERATION: GLenum = 0x0506;
606    pub const INVALID_INDEX: GLenum = 0xFFFFFFFF;
607    pub const INVALID_OPERATION: GLenum = 0x0502;
608    pub const INVALID_VALUE: GLenum = 0x0501;
609    pub const INVERT: GLenum = 0x150A;
610    pub const KEEP: GLenum = 0x1E00;
611    pub const LAST_VERTEX_CONVENTION: GLenum = 0x8E4E;
612    pub const LEFT: GLenum = 0x0406;
613    pub const LEQUAL: GLenum = 0x0203;
614    pub const LESS: GLenum = 0x0201;
615    pub const LIGHT0: GLenum = 0x4000;
616    pub const LIGHT1: GLenum = 0x4001;
617    pub const LIGHT2: GLenum = 0x4002;
618    pub const LIGHT3: GLenum = 0x4003;
619    pub const LIGHT4: GLenum = 0x4004;
620    pub const LIGHT5: GLenum = 0x4005;
621    pub const LIGHT6: GLenum = 0x4006;
622    pub const LIGHT7: GLenum = 0x4007;
623    pub const LIGHTEN_KHR: GLenum = 0x9298;
624    pub const LIGHTING: GLenum = 0x0B50;
625    pub const LIGHTING_BIT: GLenum = 0x00000040;
626    pub const LIGHT_MODEL_AMBIENT: GLenum = 0x0B53;
627    pub const LIGHT_MODEL_COLOR_CONTROL: GLenum = 0x81F8;
628    pub const LIGHT_MODEL_LOCAL_VIEWER: GLenum = 0x0B51;
629    pub const LIGHT_MODEL_TWO_SIDE: GLenum = 0x0B52;
630    pub const LINE: GLenum = 0x1B01;
631    pub const LINEAR: GLenum = 0x2601;
632    pub const LINEAR_ATTENUATION: GLenum = 0x1208;
633    pub const LINEAR_MIPMAP_LINEAR: GLenum = 0x2703;
634    pub const LINEAR_MIPMAP_NEAREST: GLenum = 0x2701;
635    pub const LINES: GLenum = 0x0001;
636    pub const LINES_ADJACENCY: GLenum = 0x000A;
637    pub const LINE_BIT: GLenum = 0x00000004;
638    pub const LINE_LOOP: GLenum = 0x0002;
639    pub const LINE_RESET_TOKEN: GLenum = 0x0707;
640    pub const LINE_SMOOTH: GLenum = 0x0B20;
641    pub const LINE_SMOOTH_HINT: GLenum = 0x0C52;
642    pub const LINE_STIPPLE: GLenum = 0x0B24;
643    pub const LINE_STIPPLE_PATTERN: GLenum = 0x0B25;
644    pub const LINE_STIPPLE_REPEAT: GLenum = 0x0B26;
645    pub const LINE_STRIP: GLenum = 0x0003;
646    pub const LINE_STRIP_ADJACENCY: GLenum = 0x000B;
647    pub const LINE_TOKEN: GLenum = 0x0702;
648    pub const LINE_WIDTH: GLenum = 0x0B21;
649    pub const LINE_WIDTH_GRANULARITY: GLenum = 0x0B23;
650    pub const LINE_WIDTH_RANGE: GLenum = 0x0B22;
651    pub const LINK_STATUS: GLenum = 0x8B82;
652    pub const LIST_BASE: GLenum = 0x0B32;
653    pub const LIST_BIT: GLenum = 0x00020000;
654    pub const LIST_INDEX: GLenum = 0x0B33;
655    pub const LIST_MODE: GLenum = 0x0B30;
656    pub const LOAD: GLenum = 0x0101;
657    pub const LOGIC_OP: GLenum = 0x0BF1;
658    pub const LOGIC_OP_MODE: GLenum = 0x0BF0;
659    pub const LOWER_LEFT: GLenum = 0x8CA1;
660    pub const LOW_FLOAT: GLenum = 0x8DF0;
661    pub const LOW_INT: GLenum = 0x8DF3;
662    pub const LUMINANCE: GLenum = 0x1909;
663    pub const LUMINANCE12: GLenum = 0x8041;
664    pub const LUMINANCE12_ALPHA12: GLenum = 0x8047;
665    pub const LUMINANCE12_ALPHA4: GLenum = 0x8046;
666    pub const LUMINANCE16: GLenum = 0x8042;
667    pub const LUMINANCE16F_EXT: GLenum = 0x881E;
668    pub const LUMINANCE16_ALPHA16: GLenum = 0x8048;
669    pub const LUMINANCE32F_EXT: GLenum = 0x8818;
670    pub const LUMINANCE4: GLenum = 0x803F;
671    pub const LUMINANCE4_ALPHA4: GLenum = 0x8043;
672    pub const LUMINANCE6_ALPHA2: GLenum = 0x8044;
673    pub const LUMINANCE8: GLenum = 0x8040;
674    pub const LUMINANCE8_ALPHA8: GLenum = 0x8045;
675    pub const LUMINANCE8_ALPHA8_EXT: GLenum = 0x8045;
676    pub const LUMINANCE8_EXT: GLenum = 0x8040;
677    pub const LUMINANCE_ALPHA: GLenum = 0x190A;
678    pub const LUMINANCE_ALPHA16F_EXT: GLenum = 0x881F;
679    pub const LUMINANCE_ALPHA32F_EXT: GLenum = 0x8819;
680    pub const MAJOR_VERSION: GLenum = 0x821B;
681    pub const MAP1_COLOR_4: GLenum = 0x0D90;
682    pub const MAP1_GRID_DOMAIN: GLenum = 0x0DD0;
683    pub const MAP1_GRID_SEGMENTS: GLenum = 0x0DD1;
684    pub const MAP1_INDEX: GLenum = 0x0D91;
685    pub const MAP1_NORMAL: GLenum = 0x0D92;
686    pub const MAP1_TEXTURE_COORD_1: GLenum = 0x0D93;
687    pub const MAP1_TEXTURE_COORD_2: GLenum = 0x0D94;
688    pub const MAP1_TEXTURE_COORD_3: GLenum = 0x0D95;
689    pub const MAP1_TEXTURE_COORD_4: GLenum = 0x0D96;
690    pub const MAP1_VERTEX_3: GLenum = 0x0D97;
691    pub const MAP1_VERTEX_4: GLenum = 0x0D98;
692    pub const MAP2_COLOR_4: GLenum = 0x0DB0;
693    pub const MAP2_GRID_DOMAIN: GLenum = 0x0DD2;
694    pub const MAP2_GRID_SEGMENTS: GLenum = 0x0DD3;
695    pub const MAP2_INDEX: GLenum = 0x0DB1;
696    pub const MAP2_NORMAL: GLenum = 0x0DB2;
697    pub const MAP2_TEXTURE_COORD_1: GLenum = 0x0DB3;
698    pub const MAP2_TEXTURE_COORD_2: GLenum = 0x0DB4;
699    pub const MAP2_TEXTURE_COORD_3: GLenum = 0x0DB5;
700    pub const MAP2_TEXTURE_COORD_4: GLenum = 0x0DB6;
701    pub const MAP2_VERTEX_3: GLenum = 0x0DB7;
702    pub const MAP2_VERTEX_4: GLenum = 0x0DB8;
703    pub const MAP_COLOR: GLenum = 0x0D10;
704    pub const MAP_FLUSH_EXPLICIT_BIT: GLenum = 0x0010;
705    pub const MAP_INVALIDATE_BUFFER_BIT: GLenum = 0x0008;
706    pub const MAP_INVALIDATE_RANGE_BIT: GLenum = 0x0004;
707    pub const MAP_READ_BIT: GLenum = 0x0001;
708    pub const MAP_STENCIL: GLenum = 0x0D11;
709    pub const MAP_UNSYNCHRONIZED_BIT: GLenum = 0x0020;
710    pub const MAP_WRITE_BIT: GLenum = 0x0002;
711    pub const MATRIX_MODE: GLenum = 0x0BA0;
712    pub const MAX: GLenum = 0x8008;
713    pub const MAX_3D_TEXTURE_SIZE: GLenum = 0x8073;
714    pub const MAX_ARRAY_TEXTURE_LAYERS: GLenum = 0x88FF;
715    pub const MAX_ATTRIB_STACK_DEPTH: GLenum = 0x0D35;
716    pub const MAX_CLIENT_ATTRIB_STACK_DEPTH: GLenum = 0x0D3B;
717    pub const MAX_CLIP_DISTANCES: GLenum = 0x0D32;
718    pub const MAX_CLIP_PLANES: GLenum = 0x0D32;
719    pub const MAX_COLOR_ATTACHMENTS: GLenum = 0x8CDF;
720    pub const MAX_COLOR_TEXTURE_SAMPLES: GLenum = 0x910E;
721    pub const MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: GLenum = 0x8A33;
722    pub const MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS: GLenum = 0x8A32;
723    pub const MAX_COMBINED_TEXTURE_IMAGE_UNITS: GLenum = 0x8B4D;
724    pub const MAX_COMBINED_UNIFORM_BLOCKS: GLenum = 0x8A2E;
725    pub const MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: GLenum = 0x8A31;
726    pub const MAX_CUBE_MAP_TEXTURE_SIZE: GLenum = 0x851C;
727    pub const MAX_DEBUG_GROUP_STACK_DEPTH: GLenum = 0x826C;
728    pub const MAX_DEBUG_GROUP_STACK_DEPTH_KHR: GLenum = 0x826C;
729    pub const MAX_DEBUG_LOGGED_MESSAGES: GLenum = 0x9144;
730    pub const MAX_DEBUG_LOGGED_MESSAGES_KHR: GLenum = 0x9144;
731    pub const MAX_DEBUG_MESSAGE_LENGTH: GLenum = 0x9143;
732    pub const MAX_DEBUG_MESSAGE_LENGTH_KHR: GLenum = 0x9143;
733    pub const MAX_DEPTH_TEXTURE_SAMPLES: GLenum = 0x910F;
734    pub const MAX_DRAW_BUFFERS: GLenum = 0x8824;
735    pub const MAX_DUAL_SOURCE_DRAW_BUFFERS: GLenum = 0x88FC;
736    pub const MAX_ELEMENTS_INDICES: GLenum = 0x80E9;
737    pub const MAX_ELEMENTS_VERTICES: GLenum = 0x80E8;
738    pub const MAX_ELEMENT_INDEX: GLenum = 0x8D6B;
739    pub const MAX_EVAL_ORDER: GLenum = 0x0D30;
740    pub const MAX_FRAGMENT_INPUT_COMPONENTS: GLenum = 0x9125;
741    pub const MAX_FRAGMENT_UNIFORM_BLOCKS: GLenum = 0x8A2D;
742    pub const MAX_FRAGMENT_UNIFORM_COMPONENTS: GLenum = 0x8B49;
743    pub const MAX_FRAGMENT_UNIFORM_VECTORS: GLenum = 0x8DFD;
744    pub const MAX_GEOMETRY_INPUT_COMPONENTS: GLenum = 0x9123;
745    pub const MAX_GEOMETRY_OUTPUT_COMPONENTS: GLenum = 0x9124;
746    pub const MAX_GEOMETRY_OUTPUT_VERTICES: GLenum = 0x8DE0;
747    pub const MAX_GEOMETRY_TEXTURE_IMAGE_UNITS: GLenum = 0x8C29;
748    pub const MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS: GLenum = 0x8DE1;
749    pub const MAX_GEOMETRY_UNIFORM_BLOCKS: GLenum = 0x8A2C;
750    pub const MAX_GEOMETRY_UNIFORM_COMPONENTS: GLenum = 0x8DDF;
751    pub const MAX_INTEGER_SAMPLES: GLenum = 0x9110;
752    pub const MAX_LABEL_LENGTH: GLenum = 0x82E8;
753    pub const MAX_LABEL_LENGTH_KHR: GLenum = 0x82E8;
754    pub const MAX_LIGHTS: GLenum = 0x0D31;
755    pub const MAX_LIST_NESTING: GLenum = 0x0B31;
756    pub const MAX_MODELVIEW_STACK_DEPTH: GLenum = 0x0D36;
757    pub const MAX_NAME_STACK_DEPTH: GLenum = 0x0D37;
758    pub const MAX_PIXEL_MAP_TABLE: GLenum = 0x0D34;
759    pub const MAX_PROGRAM_TEXEL_OFFSET: GLenum = 0x8905;
760    pub const MAX_PROJECTION_STACK_DEPTH: GLenum = 0x0D38;
761    pub const MAX_RECTANGLE_TEXTURE_SIZE: GLenum = 0x84F8;
762    pub const MAX_RECTANGLE_TEXTURE_SIZE_ARB: GLenum = 0x84F8;
763    pub const MAX_RENDERBUFFER_SIZE: GLenum = 0x84E8;
764    pub const MAX_SAMPLES: GLenum = 0x8D57;
765    pub const MAX_SAMPLE_MASK_WORDS: GLenum = 0x8E59;
766    pub const MAX_SERVER_WAIT_TIMEOUT: GLenum = 0x9111;
767    pub const MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT: GLenum = 0x8F63;
768    pub const MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT: GLenum = 0x8F67;
769    pub const MAX_TEXTURE_BUFFER_SIZE: GLenum = 0x8C2B;
770    pub const MAX_TEXTURE_COORDS: GLenum = 0x8871;
771    pub const MAX_TEXTURE_IMAGE_UNITS: GLenum = 0x8872;
772    pub const MAX_TEXTURE_LOD_BIAS: GLenum = 0x84FD;
773    pub const MAX_TEXTURE_MAX_ANISOTROPY_EXT: GLenum = 0x84FF;
774    pub const MAX_TEXTURE_SIZE: GLenum = 0x0D33;
775    pub const MAX_TEXTURE_STACK_DEPTH: GLenum = 0x0D39;
776    pub const MAX_TEXTURE_UNITS: GLenum = 0x84E2;
777    pub const MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: GLenum = 0x8C8A;
778    pub const MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: GLenum = 0x8C8B;
779    pub const MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: GLenum = 0x8C80;
780    pub const MAX_UNIFORM_BLOCK_SIZE: GLenum = 0x8A30;
781    pub const MAX_UNIFORM_BUFFER_BINDINGS: GLenum = 0x8A2F;
782    pub const MAX_VARYING_COMPONENTS: GLenum = 0x8B4B;
783    pub const MAX_VARYING_FLOATS: GLenum = 0x8B4B;
784    pub const MAX_VARYING_VECTORS: GLenum = 0x8DFC;
785    pub const MAX_VERTEX_ATTRIBS: GLenum = 0x8869;
786    pub const MAX_VERTEX_OUTPUT_COMPONENTS: GLenum = 0x9122;
787    pub const MAX_VERTEX_TEXTURE_IMAGE_UNITS: GLenum = 0x8B4C;
788    pub const MAX_VERTEX_UNIFORM_BLOCKS: GLenum = 0x8A2B;
789    pub const MAX_VERTEX_UNIFORM_COMPONENTS: GLenum = 0x8B4A;
790    pub const MAX_VERTEX_UNIFORM_VECTORS: GLenum = 0x8DFB;
791    pub const MAX_VIEWPORT_DIMS: GLenum = 0x0D3A;
792    pub const MEDIUM_FLOAT: GLenum = 0x8DF1;
793    pub const MEDIUM_INT: GLenum = 0x8DF4;
794    pub const MIN: GLenum = 0x8007;
795    pub const MINOR_VERSION: GLenum = 0x821C;
796    pub const MIN_PROGRAM_TEXEL_OFFSET: GLenum = 0x8904;
797    pub const MIRRORED_REPEAT: GLenum = 0x8370;
798    pub const MODELVIEW: GLenum = 0x1700;
799    pub const MODELVIEW_MATRIX: GLenum = 0x0BA6;
800    pub const MODELVIEW_STACK_DEPTH: GLenum = 0x0BA3;
801    pub const MODULATE: GLenum = 0x2100;
802    pub const MULT: GLenum = 0x0103;
803    pub const MULTIPLY_KHR: GLenum = 0x9294;
804    pub const MULTISAMPLE: GLenum = 0x809D;
805    pub const MULTISAMPLE_BIT: GLenum = 0x20000000;
806    pub const N3F_V3F: GLenum = 0x2A25;
807    pub const NAME_STACK_DEPTH: GLenum = 0x0D70;
808    pub const NAND: GLenum = 0x150E;
809    pub const NEAREST: GLenum = 0x2600;
810    pub const NEAREST_MIPMAP_LINEAR: GLenum = 0x2702;
811    pub const NEAREST_MIPMAP_NEAREST: GLenum = 0x2700;
812    pub const NEVER: GLenum = 0x0200;
813    pub const NICEST: GLenum = 0x1102;
814    pub const NONE: GLenum = 0;
815    pub const NOOP: GLenum = 0x1505;
816    pub const NOR: GLenum = 0x1508;
817    pub const NORMALIZE: GLenum = 0x0BA1;
818    pub const NORMAL_ARRAY: GLenum = 0x8075;
819    pub const NORMAL_ARRAY_BUFFER_BINDING: GLenum = 0x8897;
820    pub const NORMAL_ARRAY_POINTER: GLenum = 0x808F;
821    pub const NORMAL_ARRAY_STRIDE: GLenum = 0x807F;
822    pub const NORMAL_ARRAY_TYPE: GLenum = 0x807E;
823    pub const NORMAL_MAP: GLenum = 0x8511;
824    pub const NOTEQUAL: GLenum = 0x0205;
825    pub const NO_ERROR: GLenum = 0;
826    pub const NUM_COMPRESSED_TEXTURE_FORMATS: GLenum = 0x86A2;
827    pub const NUM_EXTENSIONS: GLenum = 0x821D;
828    pub const NUM_PROGRAM_BINARY_FORMATS: GLenum = 0x87FE;
829    pub const NUM_SAMPLE_COUNTS: GLenum = 0x9380;
830    pub const NUM_SHADER_BINARY_FORMATS: GLenum = 0x8DF9;
831    pub const OBJECT_LINEAR: GLenum = 0x2401;
832    pub const OBJECT_PLANE: GLenum = 0x2501;
833    pub const OBJECT_TYPE: GLenum = 0x9112;
834    pub const ONE: GLenum = 1;
835    pub const ONE_MINUS_CONSTANT_ALPHA: GLenum = 0x8004;
836    pub const ONE_MINUS_CONSTANT_COLOR: GLenum = 0x8002;
837    pub const ONE_MINUS_DST_ALPHA: GLenum = 0x0305;
838    pub const ONE_MINUS_DST_COLOR: GLenum = 0x0307;
839    pub const ONE_MINUS_SRC1_ALPHA: GLenum = 0x88FB;
840    pub const ONE_MINUS_SRC1_COLOR: GLenum = 0x88FA;
841    pub const ONE_MINUS_SRC_ALPHA: GLenum = 0x0303;
842    pub const ONE_MINUS_SRC_COLOR: GLenum = 0x0301;
843    pub const OPERAND0_ALPHA: GLenum = 0x8598;
844    pub const OPERAND0_RGB: GLenum = 0x8590;
845    pub const OPERAND1_ALPHA: GLenum = 0x8599;
846    pub const OPERAND1_RGB: GLenum = 0x8591;
847    pub const OPERAND2_ALPHA: GLenum = 0x859A;
848    pub const OPERAND2_RGB: GLenum = 0x8592;
849    pub const OR: GLenum = 0x1507;
850    pub const ORDER: GLenum = 0x0A01;
851    pub const OR_INVERTED: GLenum = 0x150D;
852    pub const OR_REVERSE: GLenum = 0x150B;
853    pub const OUT_OF_MEMORY: GLenum = 0x0505;
854    pub const OVERLAY_KHR: GLenum = 0x9296;
855    pub const PACK_ALIGNMENT: GLenum = 0x0D05;
856    pub const PACK_IMAGE_HEIGHT: GLenum = 0x806C;
857    pub const PACK_LSB_FIRST: GLenum = 0x0D01;
858    pub const PACK_ROW_LENGTH: GLenum = 0x0D02;
859    pub const PACK_SKIP_IMAGES: GLenum = 0x806B;
860    pub const PACK_SKIP_PIXELS: GLenum = 0x0D04;
861    pub const PACK_SKIP_ROWS: GLenum = 0x0D03;
862    pub const PACK_SWAP_BYTES: GLenum = 0x0D00;
863    pub const PASS_THROUGH_TOKEN: GLenum = 0x0700;
864    pub const PERSPECTIVE_CORRECTION_HINT: GLenum = 0x0C50;
865    pub const PIXEL_MAP_A_TO_A: GLenum = 0x0C79;
866    pub const PIXEL_MAP_A_TO_A_SIZE: GLenum = 0x0CB9;
867    pub const PIXEL_MAP_B_TO_B: GLenum = 0x0C78;
868    pub const PIXEL_MAP_B_TO_B_SIZE: GLenum = 0x0CB8;
869    pub const PIXEL_MAP_G_TO_G: GLenum = 0x0C77;
870    pub const PIXEL_MAP_G_TO_G_SIZE: GLenum = 0x0CB7;
871    pub const PIXEL_MAP_I_TO_A: GLenum = 0x0C75;
872    pub const PIXEL_MAP_I_TO_A_SIZE: GLenum = 0x0CB5;
873    pub const PIXEL_MAP_I_TO_B: GLenum = 0x0C74;
874    pub const PIXEL_MAP_I_TO_B_SIZE: GLenum = 0x0CB4;
875    pub const PIXEL_MAP_I_TO_G: GLenum = 0x0C73;
876    pub const PIXEL_MAP_I_TO_G_SIZE: GLenum = 0x0CB3;
877    pub const PIXEL_MAP_I_TO_I: GLenum = 0x0C70;
878    pub const PIXEL_MAP_I_TO_I_SIZE: GLenum = 0x0CB0;
879    pub const PIXEL_MAP_I_TO_R: GLenum = 0x0C72;
880    pub const PIXEL_MAP_I_TO_R_SIZE: GLenum = 0x0CB2;
881    pub const PIXEL_MAP_R_TO_R: GLenum = 0x0C76;
882    pub const PIXEL_MAP_R_TO_R_SIZE: GLenum = 0x0CB6;
883    pub const PIXEL_MAP_S_TO_S: GLenum = 0x0C71;
884    pub const PIXEL_MAP_S_TO_S_SIZE: GLenum = 0x0CB1;
885    pub const PIXEL_MODE_BIT: GLenum = 0x00000020;
886    pub const PIXEL_PACK_BUFFER: GLenum = 0x88EB;
887    pub const PIXEL_PACK_BUFFER_BINDING: GLenum = 0x88ED;
888    pub const PIXEL_UNPACK_BUFFER: GLenum = 0x88EC;
889    pub const PIXEL_UNPACK_BUFFER_BINDING: GLenum = 0x88EF;
890    pub const POINT: GLenum = 0x1B00;
891    pub const POINTS: GLenum = 0x0000;
892    pub const POINT_BIT: GLenum = 0x00000002;
893    pub const POINT_DISTANCE_ATTENUATION: GLenum = 0x8129;
894    pub const POINT_FADE_THRESHOLD_SIZE: GLenum = 0x8128;
895    pub const POINT_SIZE: GLenum = 0x0B11;
896    pub const POINT_SIZE_GRANULARITY: GLenum = 0x0B13;
897    pub const POINT_SIZE_MAX: GLenum = 0x8127;
898    pub const POINT_SIZE_MIN: GLenum = 0x8126;
899    pub const POINT_SIZE_RANGE: GLenum = 0x0B12;
900    pub const POINT_SMOOTH: GLenum = 0x0B10;
901    pub const POINT_SMOOTH_HINT: GLenum = 0x0C51;
902    pub const POINT_SPRITE: GLenum = 0x8861;
903    pub const POINT_SPRITE_COORD_ORIGIN: GLenum = 0x8CA0;
904    pub const POINT_TOKEN: GLenum = 0x0701;
905    pub const POLYGON: GLenum = 0x0009;
906    pub const POLYGON_BIT: GLenum = 0x00000008;
907    pub const POLYGON_MODE: GLenum = 0x0B40;
908    pub const POLYGON_OFFSET_FACTOR: GLenum = 0x8038;
909    pub const POLYGON_OFFSET_FILL: GLenum = 0x8037;
910    pub const POLYGON_OFFSET_LINE: GLenum = 0x2A02;
911    pub const POLYGON_OFFSET_POINT: GLenum = 0x2A01;
912    pub const POLYGON_OFFSET_UNITS: GLenum = 0x2A00;
913    pub const POLYGON_SMOOTH: GLenum = 0x0B41;
914    pub const POLYGON_SMOOTH_HINT: GLenum = 0x0C53;
915    pub const POLYGON_STIPPLE: GLenum = 0x0B42;
916    pub const POLYGON_STIPPLE_BIT: GLenum = 0x00000010;
917    pub const POLYGON_TOKEN: GLenum = 0x0703;
918    pub const POSITION: GLenum = 0x1203;
919    pub const PREVIOUS: GLenum = 0x8578;
920    pub const PRIMARY_COLOR: GLenum = 0x8577;
921    pub const PRIMITIVES_GENERATED: GLenum = 0x8C87;
922    pub const PRIMITIVE_RESTART: GLenum = 0x8F9D;
923    pub const PRIMITIVE_RESTART_FIXED_INDEX: GLenum = 0x8D69;
924    pub const PRIMITIVE_RESTART_INDEX: GLenum = 0x8F9E;
925    pub const PROGRAM: GLenum = 0x82E2;
926    pub const PROGRAM_BINARY_FORMATS: GLenum = 0x87FF;
927    pub const PROGRAM_BINARY_LENGTH: GLenum = 0x8741;
928    pub const PROGRAM_BINARY_RETRIEVABLE_HINT: GLenum = 0x8257;
929    pub const PROGRAM_KHR: GLenum = 0x82E2;
930    pub const PROGRAM_PIPELINE: GLenum = 0x82E4;
931    pub const PROGRAM_PIPELINE_KHR: GLenum = 0x82E4;
932    pub const PROGRAM_POINT_SIZE: GLenum = 0x8642;
933    pub const PROJECTION: GLenum = 0x1701;
934    pub const PROJECTION_MATRIX: GLenum = 0x0BA7;
935    pub const PROJECTION_STACK_DEPTH: GLenum = 0x0BA4;
936    pub const PROVOKING_VERTEX: GLenum = 0x8E4F;
937    pub const PROXY_TEXTURE_1D: GLenum = 0x8063;
938    pub const PROXY_TEXTURE_1D_ARRAY: GLenum = 0x8C19;
939    pub const PROXY_TEXTURE_2D: GLenum = 0x8064;
940    pub const PROXY_TEXTURE_2D_ARRAY: GLenum = 0x8C1B;
941    pub const PROXY_TEXTURE_2D_MULTISAMPLE: GLenum = 0x9101;
942    pub const PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY: GLenum = 0x9103;
943    pub const PROXY_TEXTURE_3D: GLenum = 0x8070;
944    pub const PROXY_TEXTURE_CUBE_MAP: GLenum = 0x851B;
945    pub const PROXY_TEXTURE_RECTANGLE: GLenum = 0x84F7;
946    pub const PROXY_TEXTURE_RECTANGLE_ARB: GLenum = 0x84F7;
947    pub const Q: GLenum = 0x2003;
948    pub const QUADRATIC_ATTENUATION: GLenum = 0x1209;
949    pub const QUADS: GLenum = 0x0007;
950    pub const QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: GLenum = 0x8E4C;
951    pub const QUAD_STRIP: GLenum = 0x0008;
952    pub const QUERY: GLenum = 0x82E3;
953    pub const QUERY_BY_REGION_NO_WAIT: GLenum = 0x8E16;
954    pub const QUERY_BY_REGION_WAIT: GLenum = 0x8E15;
955    pub const QUERY_COUNTER_BITS: GLenum = 0x8864;
956    pub const QUERY_COUNTER_BITS_EXT: GLenum = 0x8864;
957    pub const QUERY_KHR: GLenum = 0x82E3;
958    pub const QUERY_NO_WAIT: GLenum = 0x8E14;
959    pub const QUERY_RESULT: GLenum = 0x8866;
960    pub const QUERY_RESULT_AVAILABLE: GLenum = 0x8867;
961    pub const QUERY_RESULT_AVAILABLE_EXT: GLenum = 0x8867;
962    pub const QUERY_RESULT_EXT: GLenum = 0x8866;
963    pub const QUERY_WAIT: GLenum = 0x8E13;
964    pub const R: GLenum = 0x2002;
965    pub const R11F_G11F_B10F: GLenum = 0x8C3A;
966    pub const R16: GLenum = 0x822A;
967    pub const R16F: GLenum = 0x822D;
968    pub const R16F_EXT: GLenum = 0x822D;
969    pub const R16I: GLenum = 0x8233;
970    pub const R16UI: GLenum = 0x8234;
971    pub const R16_SNORM: GLenum = 0x8F98;
972    pub const R32F: GLenum = 0x822E;
973    pub const R32F_EXT: GLenum = 0x822E;
974    pub const R32I: GLenum = 0x8235;
975    pub const R32UI: GLenum = 0x8236;
976    pub const R3_G3_B2: GLenum = 0x2A10;
977    pub const R8: GLenum = 0x8229;
978    pub const R8I: GLenum = 0x8231;
979    pub const R8UI: GLenum = 0x8232;
980    pub const R8_EXT: GLenum = 0x8229;
981    pub const R8_SNORM: GLenum = 0x8F94;
982    pub const RASTERIZER_DISCARD: GLenum = 0x8C89;
983    pub const READ_BUFFER: GLenum = 0x0C02;
984    pub const READ_FRAMEBUFFER: GLenum = 0x8CA8;
985    pub const READ_FRAMEBUFFER_BINDING: GLenum = 0x8CAA;
986    pub const READ_ONLY: GLenum = 0x88B8;
987    pub const READ_WRITE: GLenum = 0x88BA;
988    pub const RED: GLenum = 0x1903;
989    pub const RED_BIAS: GLenum = 0x0D15;
990    pub const RED_BITS: GLenum = 0x0D52;
991    pub const RED_INTEGER: GLenum = 0x8D94;
992    pub const RED_SCALE: GLenum = 0x0D14;
993    pub const REFLECTION_MAP: GLenum = 0x8512;
994    pub const RENDER: GLenum = 0x1C00;
995    pub const RENDERBUFFER: GLenum = 0x8D41;
996    pub const RENDERBUFFER_ALPHA_SIZE: GLenum = 0x8D53;
997    pub const RENDERBUFFER_BINDING: GLenum = 0x8CA7;
998    pub const RENDERBUFFER_BLUE_SIZE: GLenum = 0x8D52;
999    pub const RENDERBUFFER_DEPTH_SIZE: GLenum = 0x8D54;
1000    pub const RENDERBUFFER_GREEN_SIZE: GLenum = 0x8D51;
1001    pub const RENDERBUFFER_HEIGHT: GLenum = 0x8D43;
1002    pub const RENDERBUFFER_INTERNAL_FORMAT: GLenum = 0x8D44;
1003    pub const RENDERBUFFER_RED_SIZE: GLenum = 0x8D50;
1004    pub const RENDERBUFFER_SAMPLES: GLenum = 0x8CAB;
1005    pub const RENDERBUFFER_STENCIL_SIZE: GLenum = 0x8D55;
1006    pub const RENDERBUFFER_WIDTH: GLenum = 0x8D42;
1007    pub const RENDERER: GLenum = 0x1F01;
1008    pub const RENDER_MODE: GLenum = 0x0C40;
1009    pub const REPEAT: GLenum = 0x2901;
1010    pub const REPLACE: GLenum = 0x1E01;
1011    pub const REQUIRED_TEXTURE_IMAGE_UNITS_OES: GLenum = 0x8D68;
1012    pub const RESCALE_NORMAL: GLenum = 0x803A;
1013    pub const RETURN: GLenum = 0x0102;
1014    pub const RG: GLenum = 0x8227;
1015    pub const RG16: GLenum = 0x822C;
1016    pub const RG16F: GLenum = 0x822F;
1017    pub const RG16F_EXT: GLenum = 0x822F;
1018    pub const RG16I: GLenum = 0x8239;
1019    pub const RG16UI: GLenum = 0x823A;
1020    pub const RG16_SNORM: GLenum = 0x8F99;
1021    pub const RG32F: GLenum = 0x8230;
1022    pub const RG32F_EXT: GLenum = 0x8230;
1023    pub const RG32I: GLenum = 0x823B;
1024    pub const RG32UI: GLenum = 0x823C;
1025    pub const RG8: GLenum = 0x822B;
1026    pub const RG8I: GLenum = 0x8237;
1027    pub const RG8UI: GLenum = 0x8238;
1028    pub const RG8_EXT: GLenum = 0x822B;
1029    pub const RG8_SNORM: GLenum = 0x8F95;
1030    pub const RGB: GLenum = 0x1907;
1031    pub const RGB10: GLenum = 0x8052;
1032    pub const RGB10_A2: GLenum = 0x8059;
1033    pub const RGB10_A2UI: GLenum = 0x906F;
1034    pub const RGB10_A2_EXT: GLenum = 0x8059;
1035    pub const RGB10_EXT: GLenum = 0x8052;
1036    pub const RGB12: GLenum = 0x8053;
1037    pub const RGB16: GLenum = 0x8054;
1038    pub const RGB16F: GLenum = 0x881B;
1039    pub const RGB16F_EXT: GLenum = 0x881B;
1040    pub const RGB16I: GLenum = 0x8D89;
1041    pub const RGB16UI: GLenum = 0x8D77;
1042    pub const RGB16_SNORM: GLenum = 0x8F9A;
1043    pub const RGB32F: GLenum = 0x8815;
1044    pub const RGB32F_EXT: GLenum = 0x8815;
1045    pub const RGB32I: GLenum = 0x8D83;
1046    pub const RGB32UI: GLenum = 0x8D71;
1047    pub const RGB4: GLenum = 0x804F;
1048    pub const RGB5: GLenum = 0x8050;
1049    pub const RGB565: GLenum = 0x8D62;
1050    pub const RGB5_A1: GLenum = 0x8057;
1051    pub const RGB8: GLenum = 0x8051;
1052    pub const RGB8I: GLenum = 0x8D8F;
1053    pub const RGB8UI: GLenum = 0x8D7D;
1054    pub const RGB8_SNORM: GLenum = 0x8F96;
1055    pub const RGB9_E5: GLenum = 0x8C3D;
1056    pub const RGBA: GLenum = 0x1908;
1057    pub const RGBA12: GLenum = 0x805A;
1058    pub const RGBA16: GLenum = 0x805B;
1059    pub const RGBA16F: GLenum = 0x881A;
1060    pub const RGBA16F_EXT: GLenum = 0x881A;
1061    pub const RGBA16I: GLenum = 0x8D88;
1062    pub const RGBA16UI: GLenum = 0x8D76;
1063    pub const RGBA16_SNORM: GLenum = 0x8F9B;
1064    pub const RGBA2: GLenum = 0x8055;
1065    pub const RGBA32F: GLenum = 0x8814;
1066    pub const RGBA32F_EXT: GLenum = 0x8814;
1067    pub const RGBA32I: GLenum = 0x8D82;
1068    pub const RGBA32UI: GLenum = 0x8D70;
1069    pub const RGBA4: GLenum = 0x8056;
1070    pub const RGBA8: GLenum = 0x8058;
1071    pub const RGBA8I: GLenum = 0x8D8E;
1072    pub const RGBA8UI: GLenum = 0x8D7C;
1073    pub const RGBA8_SNORM: GLenum = 0x8F97;
1074    pub const RGBA_INTEGER: GLenum = 0x8D99;
1075    pub const RGBA_MODE: GLenum = 0x0C31;
1076    pub const RGB_INTEGER: GLenum = 0x8D98;
1077    pub const RGB_SCALE: GLenum = 0x8573;
1078    pub const RG_INTEGER: GLenum = 0x8228;
1079    pub const RIGHT: GLenum = 0x0407;
1080    pub const S: GLenum = 0x2000;
1081    pub const SAMPLER: GLenum = 0x82E6;
1082    pub const SAMPLER_1D: GLenum = 0x8B5D;
1083    pub const SAMPLER_1D_ARRAY: GLenum = 0x8DC0;
1084    pub const SAMPLER_1D_ARRAY_SHADOW: GLenum = 0x8DC3;
1085    pub const SAMPLER_1D_SHADOW: GLenum = 0x8B61;
1086    pub const SAMPLER_2D: GLenum = 0x8B5E;
1087    pub const SAMPLER_2D_ARRAY: GLenum = 0x8DC1;
1088    pub const SAMPLER_2D_ARRAY_SHADOW: GLenum = 0x8DC4;
1089    pub const SAMPLER_2D_MULTISAMPLE: GLenum = 0x9108;
1090    pub const SAMPLER_2D_MULTISAMPLE_ARRAY: GLenum = 0x910B;
1091    pub const SAMPLER_2D_RECT: GLenum = 0x8B63;
1092    pub const SAMPLER_2D_RECT_SHADOW: GLenum = 0x8B64;
1093    pub const SAMPLER_2D_SHADOW: GLenum = 0x8B62;
1094    pub const SAMPLER_3D: GLenum = 0x8B5F;
1095    pub const SAMPLER_BINDING: GLenum = 0x8919;
1096    pub const SAMPLER_BUFFER: GLenum = 0x8DC2;
1097    pub const SAMPLER_CUBE: GLenum = 0x8B60;
1098    pub const SAMPLER_CUBE_SHADOW: GLenum = 0x8DC5;
1099    pub const SAMPLER_EXTERNAL_OES: GLenum = 0x8D66;
1100    pub const SAMPLER_KHR: GLenum = 0x82E6;
1101    pub const SAMPLES: GLenum = 0x80A9;
1102    pub const SAMPLES_PASSED: GLenum = 0x8914;
1103    pub const SAMPLE_ALPHA_TO_COVERAGE: GLenum = 0x809E;
1104    pub const SAMPLE_ALPHA_TO_ONE: GLenum = 0x809F;
1105    pub const SAMPLE_BUFFERS: GLenum = 0x80A8;
1106    pub const SAMPLE_COVERAGE: GLenum = 0x80A0;
1107    pub const SAMPLE_COVERAGE_INVERT: GLenum = 0x80AB;
1108    pub const SAMPLE_COVERAGE_VALUE: GLenum = 0x80AA;
1109    pub const SAMPLE_MASK: GLenum = 0x8E51;
1110    pub const SAMPLE_MASK_VALUE: GLenum = 0x8E52;
1111    pub const SAMPLE_POSITION: GLenum = 0x8E50;
1112    pub const SCISSOR_BIT: GLenum = 0x00080000;
1113    pub const SCISSOR_BOX: GLenum = 0x0C10;
1114    pub const SCISSOR_TEST: GLenum = 0x0C11;
1115    pub const SCREEN_KHR: GLenum = 0x9295;
1116    pub const SECONDARY_COLOR_ARRAY: GLenum = 0x845E;
1117    pub const SECONDARY_COLOR_ARRAY_BUFFER_BINDING: GLenum = 0x889C;
1118    pub const SECONDARY_COLOR_ARRAY_POINTER: GLenum = 0x845D;
1119    pub const SECONDARY_COLOR_ARRAY_SIZE: GLenum = 0x845A;
1120    pub const SECONDARY_COLOR_ARRAY_STRIDE: GLenum = 0x845C;
1121    pub const SECONDARY_COLOR_ARRAY_TYPE: GLenum = 0x845B;
1122    pub const SELECT: GLenum = 0x1C02;
1123    pub const SELECTION_BUFFER_POINTER: GLenum = 0x0DF3;
1124    pub const SELECTION_BUFFER_SIZE: GLenum = 0x0DF4;
1125    pub const SEPARATE_ATTRIBS: GLenum = 0x8C8D;
1126    pub const SEPARATE_SPECULAR_COLOR: GLenum = 0x81FA;
1127    pub const SET: GLenum = 0x150F;
1128    pub const SHADER: GLenum = 0x82E1;
1129    pub const SHADER_BINARY_FORMATS: GLenum = 0x8DF8;
1130    pub const SHADER_COMPILER: GLenum = 0x8DFA;
1131    pub const SHADER_KHR: GLenum = 0x82E1;
1132    pub const SHADER_PIXEL_LOCAL_STORAGE_EXT: GLenum = 0x8F64;
1133    pub const SHADER_SOURCE_LENGTH: GLenum = 0x8B88;
1134    pub const SHADER_TYPE: GLenum = 0x8B4F;
1135    pub const SHADE_MODEL: GLenum = 0x0B54;
1136    pub const SHADING_LANGUAGE_VERSION: GLenum = 0x8B8C;
1137    pub const SHININESS: GLenum = 0x1601;
1138    pub const SHORT: GLenum = 0x1402;
1139    pub const SIGNALED: GLenum = 0x9119;
1140    pub const SIGNED_NORMALIZED: GLenum = 0x8F9C;
1141    pub const SINGLE_COLOR: GLenum = 0x81F9;
1142    pub const SLUMINANCE: GLenum = 0x8C46;
1143    pub const SLUMINANCE8: GLenum = 0x8C47;
1144    pub const SLUMINANCE8_ALPHA8: GLenum = 0x8C45;
1145    pub const SLUMINANCE_ALPHA: GLenum = 0x8C44;
1146    pub const SMOOTH: GLenum = 0x1D01;
1147    pub const SMOOTH_LINE_WIDTH_GRANULARITY: GLenum = 0x0B23;
1148    pub const SMOOTH_LINE_WIDTH_RANGE: GLenum = 0x0B22;
1149    pub const SMOOTH_POINT_SIZE_GRANULARITY: GLenum = 0x0B13;
1150    pub const SMOOTH_POINT_SIZE_RANGE: GLenum = 0x0B12;
1151    pub const SOFTLIGHT_KHR: GLenum = 0x929C;
1152    pub const SOURCE0_ALPHA: GLenum = 0x8588;
1153    pub const SOURCE0_RGB: GLenum = 0x8580;
1154    pub const SOURCE1_ALPHA: GLenum = 0x8589;
1155    pub const SOURCE1_RGB: GLenum = 0x8581;
1156    pub const SOURCE2_ALPHA: GLenum = 0x858A;
1157    pub const SOURCE2_RGB: GLenum = 0x8582;
1158    pub const SPECULAR: GLenum = 0x1202;
1159    pub const SPHERE_MAP: GLenum = 0x2402;
1160    pub const SPOT_CUTOFF: GLenum = 0x1206;
1161    pub const SPOT_DIRECTION: GLenum = 0x1204;
1162    pub const SPOT_EXPONENT: GLenum = 0x1205;
1163    pub const SRC0_ALPHA: GLenum = 0x8588;
1164    pub const SRC0_RGB: GLenum = 0x8580;
1165    pub const SRC1_ALPHA: GLenum = 0x8589;
1166    pub const SRC1_COLOR: GLenum = 0x88F9;
1167    pub const SRC1_RGB: GLenum = 0x8581;
1168    pub const SRC2_ALPHA: GLenum = 0x858A;
1169    pub const SRC2_RGB: GLenum = 0x8582;
1170    pub const SRC_ALPHA: GLenum = 0x0302;
1171    pub const SRC_ALPHA_SATURATE: GLenum = 0x0308;
1172    pub const SRC_COLOR: GLenum = 0x0300;
1173    pub const SRGB: GLenum = 0x8C40;
1174    pub const SRGB8: GLenum = 0x8C41;
1175    pub const SRGB8_ALPHA8: GLenum = 0x8C43;
1176    pub const SRGB_ALPHA: GLenum = 0x8C42;
1177    pub const STACK_OVERFLOW: GLenum = 0x0503;
1178    pub const STACK_OVERFLOW_KHR: GLenum = 0x0503;
1179    pub const STACK_UNDERFLOW: GLenum = 0x0504;
1180    pub const STACK_UNDERFLOW_KHR: GLenum = 0x0504;
1181    pub const STATIC_COPY: GLenum = 0x88E6;
1182    pub const STATIC_DRAW: GLenum = 0x88E4;
1183    pub const STATIC_READ: GLenum = 0x88E5;
1184    pub const STENCIL: GLenum = 0x1802;
1185    pub const STENCIL_ATTACHMENT: GLenum = 0x8D20;
1186    pub const STENCIL_BACK_FAIL: GLenum = 0x8801;
1187    pub const STENCIL_BACK_FUNC: GLenum = 0x8800;
1188    pub const STENCIL_BACK_PASS_DEPTH_FAIL: GLenum = 0x8802;
1189    pub const STENCIL_BACK_PASS_DEPTH_PASS: GLenum = 0x8803;
1190    pub const STENCIL_BACK_REF: GLenum = 0x8CA3;
1191    pub const STENCIL_BACK_VALUE_MASK: GLenum = 0x8CA4;
1192    pub const STENCIL_BACK_WRITEMASK: GLenum = 0x8CA5;
1193    pub const STENCIL_BITS: GLenum = 0x0D57;
1194    pub const STENCIL_BUFFER_BIT: GLenum = 0x00000400;
1195    pub const STENCIL_CLEAR_VALUE: GLenum = 0x0B91;
1196    pub const STENCIL_FAIL: GLenum = 0x0B94;
1197    pub const STENCIL_FUNC: GLenum = 0x0B92;
1198    pub const STENCIL_INDEX: GLenum = 0x1901;
1199    pub const STENCIL_INDEX1: GLenum = 0x8D46;
1200    pub const STENCIL_INDEX16: GLenum = 0x8D49;
1201    pub const STENCIL_INDEX4: GLenum = 0x8D47;
1202    pub const STENCIL_INDEX8: GLenum = 0x8D48;
1203    pub const STENCIL_PASS_DEPTH_FAIL: GLenum = 0x0B95;
1204    pub const STENCIL_PASS_DEPTH_PASS: GLenum = 0x0B96;
1205    pub const STENCIL_REF: GLenum = 0x0B97;
1206    pub const STENCIL_TEST: GLenum = 0x0B90;
1207    pub const STENCIL_VALUE_MASK: GLenum = 0x0B93;
1208    pub const STENCIL_WRITEMASK: GLenum = 0x0B98;
1209    pub const STEREO: GLenum = 0x0C33;
1210    pub const STORAGE_CACHED_APPLE: GLenum = 0x85BE;
1211    pub const STORAGE_PRIVATE_APPLE: GLenum = 0x85BD;
1212    pub const STORAGE_SHARED_APPLE: GLenum = 0x85BF;
1213    pub const STREAM_COPY: GLenum = 0x88E2;
1214    pub const STREAM_DRAW: GLenum = 0x88E0;
1215    pub const STREAM_READ: GLenum = 0x88E1;
1216    pub const SUBPIXEL_BITS: GLenum = 0x0D50;
1217    pub const SUBTRACT: GLenum = 0x84E7;
1218    pub const SYNC_CONDITION: GLenum = 0x9113;
1219    pub const SYNC_FENCE: GLenum = 0x9116;
1220    pub const SYNC_FLAGS: GLenum = 0x9115;
1221    pub const SYNC_FLUSH_COMMANDS_BIT: GLenum = 0x00000001;
1222    pub const SYNC_GPU_COMMANDS_COMPLETE: GLenum = 0x9117;
1223    pub const SYNC_STATUS: GLenum = 0x9114;
1224    pub const T: GLenum = 0x2001;
1225    pub const T2F_C3F_V3F: GLenum = 0x2A2A;
1226    pub const T2F_C4F_N3F_V3F: GLenum = 0x2A2C;
1227    pub const T2F_C4UB_V3F: GLenum = 0x2A29;
1228    pub const T2F_N3F_V3F: GLenum = 0x2A2B;
1229    pub const T2F_V3F: GLenum = 0x2A27;
1230    pub const T4F_C4F_N3F_V4F: GLenum = 0x2A2D;
1231    pub const T4F_V4F: GLenum = 0x2A28;
1232    pub const TEXTURE: GLenum = 0x1702;
1233    pub const TEXTURE0: GLenum = 0x84C0;
1234    pub const TEXTURE1: GLenum = 0x84C1;
1235    pub const TEXTURE10: GLenum = 0x84CA;
1236    pub const TEXTURE11: GLenum = 0x84CB;
1237    pub const TEXTURE12: GLenum = 0x84CC;
1238    pub const TEXTURE13: GLenum = 0x84CD;
1239    pub const TEXTURE14: GLenum = 0x84CE;
1240    pub const TEXTURE15: GLenum = 0x84CF;
1241    pub const TEXTURE16: GLenum = 0x84D0;
1242    pub const TEXTURE17: GLenum = 0x84D1;
1243    pub const TEXTURE18: GLenum = 0x84D2;
1244    pub const TEXTURE19: GLenum = 0x84D3;
1245    pub const TEXTURE2: GLenum = 0x84C2;
1246    pub const TEXTURE20: GLenum = 0x84D4;
1247    pub const TEXTURE21: GLenum = 0x84D5;
1248    pub const TEXTURE22: GLenum = 0x84D6;
1249    pub const TEXTURE23: GLenum = 0x84D7;
1250    pub const TEXTURE24: GLenum = 0x84D8;
1251    pub const TEXTURE25: GLenum = 0x84D9;
1252    pub const TEXTURE26: GLenum = 0x84DA;
1253    pub const TEXTURE27: GLenum = 0x84DB;
1254    pub const TEXTURE28: GLenum = 0x84DC;
1255    pub const TEXTURE29: GLenum = 0x84DD;
1256    pub const TEXTURE3: GLenum = 0x84C3;
1257    pub const TEXTURE30: GLenum = 0x84DE;
1258    pub const TEXTURE31: GLenum = 0x84DF;
1259    pub const TEXTURE4: GLenum = 0x84C4;
1260    pub const TEXTURE5: GLenum = 0x84C5;
1261    pub const TEXTURE6: GLenum = 0x84C6;
1262    pub const TEXTURE7: GLenum = 0x84C7;
1263    pub const TEXTURE8: GLenum = 0x84C8;
1264    pub const TEXTURE9: GLenum = 0x84C9;
1265    pub const TEXTURE_1D: GLenum = 0x0DE0;
1266    pub const TEXTURE_1D_ARRAY: GLenum = 0x8C18;
1267    pub const TEXTURE_2D: GLenum = 0x0DE1;
1268    pub const TEXTURE_2D_ARRAY: GLenum = 0x8C1A;
1269    pub const TEXTURE_2D_MULTISAMPLE: GLenum = 0x9100;
1270    pub const TEXTURE_2D_MULTISAMPLE_ARRAY: GLenum = 0x9102;
1271    pub const TEXTURE_3D: GLenum = 0x806F;
1272    pub const TEXTURE_ALPHA_SIZE: GLenum = 0x805F;
1273    pub const TEXTURE_ALPHA_TYPE: GLenum = 0x8C13;
1274    pub const TEXTURE_BASE_LEVEL: GLenum = 0x813C;
1275    pub const TEXTURE_BINDING_1D: GLenum = 0x8068;
1276    pub const TEXTURE_BINDING_1D_ARRAY: GLenum = 0x8C1C;
1277    pub const TEXTURE_BINDING_2D: GLenum = 0x8069;
1278    pub const TEXTURE_BINDING_2D_ARRAY: GLenum = 0x8C1D;
1279    pub const TEXTURE_BINDING_2D_MULTISAMPLE: GLenum = 0x9104;
1280    pub const TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY: GLenum = 0x9105;
1281    pub const TEXTURE_BINDING_3D: GLenum = 0x806A;
1282    pub const TEXTURE_BINDING_BUFFER: GLenum = 0x8C2C;
1283    pub const TEXTURE_BINDING_CUBE_MAP: GLenum = 0x8514;
1284    pub const TEXTURE_BINDING_EXTERNAL_OES: GLenum = 0x8D67;
1285    pub const TEXTURE_BINDING_RECTANGLE: GLenum = 0x84F6;
1286    pub const TEXTURE_BINDING_RECTANGLE_ARB: GLenum = 0x84F6;
1287    pub const TEXTURE_BIT: GLenum = 0x00040000;
1288    pub const TEXTURE_BLUE_SIZE: GLenum = 0x805E;
1289    pub const TEXTURE_BLUE_TYPE: GLenum = 0x8C12;
1290    pub const TEXTURE_BORDER: GLenum = 0x1005;
1291    pub const TEXTURE_BORDER_COLOR: GLenum = 0x1004;
1292    pub const TEXTURE_BUFFER: GLenum = 0x8C2A;
1293    pub const TEXTURE_BUFFER_DATA_STORE_BINDING: GLenum = 0x8C2D;
1294    pub const TEXTURE_COMPARE_FUNC: GLenum = 0x884D;
1295    pub const TEXTURE_COMPARE_MODE: GLenum = 0x884C;
1296    pub const TEXTURE_COMPONENTS: GLenum = 0x1003;
1297    pub const TEXTURE_COMPRESSED: GLenum = 0x86A1;
1298    pub const TEXTURE_COMPRESSED_IMAGE_SIZE: GLenum = 0x86A0;
1299    pub const TEXTURE_COMPRESSION_HINT: GLenum = 0x84EF;
1300    pub const TEXTURE_COORD_ARRAY: GLenum = 0x8078;
1301    pub const TEXTURE_COORD_ARRAY_BUFFER_BINDING: GLenum = 0x889A;
1302    pub const TEXTURE_COORD_ARRAY_POINTER: GLenum = 0x8092;
1303    pub const TEXTURE_COORD_ARRAY_SIZE: GLenum = 0x8088;
1304    pub const TEXTURE_COORD_ARRAY_STRIDE: GLenum = 0x808A;
1305    pub const TEXTURE_COORD_ARRAY_TYPE: GLenum = 0x8089;
1306    pub const TEXTURE_CUBE_MAP: GLenum = 0x8513;
1307    pub const TEXTURE_CUBE_MAP_NEGATIVE_X: GLenum = 0x8516;
1308    pub const TEXTURE_CUBE_MAP_NEGATIVE_Y: GLenum = 0x8518;
1309    pub const TEXTURE_CUBE_MAP_NEGATIVE_Z: GLenum = 0x851A;
1310    pub const TEXTURE_CUBE_MAP_POSITIVE_X: GLenum = 0x8515;
1311    pub const TEXTURE_CUBE_MAP_POSITIVE_Y: GLenum = 0x8517;
1312    pub const TEXTURE_CUBE_MAP_POSITIVE_Z: GLenum = 0x8519;
1313    pub const TEXTURE_CUBE_MAP_SEAMLESS: GLenum = 0x884F;
1314    pub const TEXTURE_DEPTH: GLenum = 0x8071;
1315    pub const TEXTURE_DEPTH_SIZE: GLenum = 0x884A;
1316    pub const TEXTURE_DEPTH_TYPE: GLenum = 0x8C16;
1317    pub const TEXTURE_ENV: GLenum = 0x2300;
1318    pub const TEXTURE_ENV_COLOR: GLenum = 0x2201;
1319    pub const TEXTURE_ENV_MODE: GLenum = 0x2200;
1320    pub const TEXTURE_EXTERNAL_OES: GLenum = 0x8D65;
1321    pub const TEXTURE_FILTER_CONTROL: GLenum = 0x8500;
1322    pub const TEXTURE_FIXED_SAMPLE_LOCATIONS: GLenum = 0x9107;
1323    pub const TEXTURE_GEN_MODE: GLenum = 0x2500;
1324    pub const TEXTURE_GEN_Q: GLenum = 0x0C63;
1325    pub const TEXTURE_GEN_R: GLenum = 0x0C62;
1326    pub const TEXTURE_GEN_S: GLenum = 0x0C60;
1327    pub const TEXTURE_GEN_T: GLenum = 0x0C61;
1328    pub const TEXTURE_GREEN_SIZE: GLenum = 0x805D;
1329    pub const TEXTURE_GREEN_TYPE: GLenum = 0x8C11;
1330    pub const TEXTURE_HEIGHT: GLenum = 0x1001;
1331    pub const TEXTURE_IMMUTABLE_FORMAT: GLenum = 0x912F;
1332    pub const TEXTURE_IMMUTABLE_FORMAT_EXT: GLenum = 0x912F;
1333    pub const TEXTURE_IMMUTABLE_LEVELS: GLenum = 0x82DF;
1334    pub const TEXTURE_INTENSITY_SIZE: GLenum = 0x8061;
1335    pub const TEXTURE_INTENSITY_TYPE: GLenum = 0x8C15;
1336    pub const TEXTURE_INTERNAL_FORMAT: GLenum = 0x1003;
1337    pub const TEXTURE_LOD_BIAS: GLenum = 0x8501;
1338    pub const TEXTURE_LUMINANCE_SIZE: GLenum = 0x8060;
1339    pub const TEXTURE_LUMINANCE_TYPE: GLenum = 0x8C14;
1340    pub const TEXTURE_MAG_FILTER: GLenum = 0x2800;
1341    pub const TEXTURE_MATRIX: GLenum = 0x0BA8;
1342    pub const TEXTURE_MAX_ANISOTROPY_EXT: GLenum = 0x84FE;
1343    pub const TEXTURE_MAX_LEVEL: GLenum = 0x813D;
1344    pub const TEXTURE_MAX_LOD: GLenum = 0x813B;
1345    pub const TEXTURE_MIN_FILTER: GLenum = 0x2801;
1346    pub const TEXTURE_MIN_LOD: GLenum = 0x813A;
1347    pub const TEXTURE_PRIORITY: GLenum = 0x8066;
1348    pub const TEXTURE_RANGE_LENGTH_APPLE: GLenum = 0x85B7;
1349    pub const TEXTURE_RANGE_POINTER_APPLE: GLenum = 0x85B8;
1350    pub const TEXTURE_RECTANGLE: GLenum = 0x84F5;
1351    pub const TEXTURE_RECTANGLE_ARB: GLenum = 0x84F5;
1352    pub const TEXTURE_RED_SIZE: GLenum = 0x805C;
1353    pub const TEXTURE_RED_TYPE: GLenum = 0x8C10;
1354    pub const TEXTURE_RESIDENT: GLenum = 0x8067;
1355    pub const TEXTURE_SAMPLES: GLenum = 0x9106;
1356    pub const TEXTURE_SHARED_SIZE: GLenum = 0x8C3F;
1357    pub const TEXTURE_STACK_DEPTH: GLenum = 0x0BA5;
1358    pub const TEXTURE_STENCIL_SIZE: GLenum = 0x88F1;
1359    pub const TEXTURE_STORAGE_HINT_APPLE: GLenum = 0x85BC;
1360    pub const TEXTURE_SWIZZLE_A: GLenum = 0x8E45;
1361    pub const TEXTURE_SWIZZLE_B: GLenum = 0x8E44;
1362    pub const TEXTURE_SWIZZLE_G: GLenum = 0x8E43;
1363    pub const TEXTURE_SWIZZLE_R: GLenum = 0x8E42;
1364    pub const TEXTURE_SWIZZLE_RGBA: GLenum = 0x8E46;
1365    pub const TEXTURE_USAGE_ANGLE: GLenum = 0x93A2;
1366    pub const TEXTURE_WIDTH: GLenum = 0x1000;
1367    pub const TEXTURE_WRAP_R: GLenum = 0x8072;
1368    pub const TEXTURE_WRAP_S: GLenum = 0x2802;
1369    pub const TEXTURE_WRAP_T: GLenum = 0x2803;
1370    pub const TIMEOUT_EXPIRED: GLenum = 0x911B;
1371    pub const TIMEOUT_IGNORED: u64 = 0xFFFFFFFFFFFFFFFF;
1372    pub const TIMESTAMP: GLenum = 0x8E28;
1373    pub const TIMESTAMP_EXT: GLenum = 0x8E28;
1374    pub const TIME_ELAPSED: GLenum = 0x88BF;
1375    pub const TIME_ELAPSED_EXT: GLenum = 0x88BF;
1376    pub const TRANSFORM_BIT: GLenum = 0x00001000;
1377    pub const TRANSFORM_FEEDBACK: GLenum = 0x8E22;
1378    pub const TRANSFORM_FEEDBACK_ACTIVE: GLenum = 0x8E24;
1379    pub const TRANSFORM_FEEDBACK_BINDING: GLenum = 0x8E25;
1380    pub const TRANSFORM_FEEDBACK_BUFFER: GLenum = 0x8C8E;
1381    pub const TRANSFORM_FEEDBACK_BUFFER_BINDING: GLenum = 0x8C8F;
1382    pub const TRANSFORM_FEEDBACK_BUFFER_MODE: GLenum = 0x8C7F;
1383    pub const TRANSFORM_FEEDBACK_BUFFER_SIZE: GLenum = 0x8C85;
1384    pub const TRANSFORM_FEEDBACK_BUFFER_START: GLenum = 0x8C84;
1385    pub const TRANSFORM_FEEDBACK_PAUSED: GLenum = 0x8E23;
1386    pub const TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN: GLenum = 0x8C88;
1387    pub const TRANSFORM_FEEDBACK_VARYINGS: GLenum = 0x8C83;
1388    pub const TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: GLenum = 0x8C76;
1389    pub const TRANSPOSE_COLOR_MATRIX: GLenum = 0x84E6;
1390    pub const TRANSPOSE_MODELVIEW_MATRIX: GLenum = 0x84E3;
1391    pub const TRANSPOSE_PROJECTION_MATRIX: GLenum = 0x84E4;
1392    pub const TRANSPOSE_TEXTURE_MATRIX: GLenum = 0x84E5;
1393    pub const TRIANGLES: GLenum = 0x0004;
1394    pub const TRIANGLES_ADJACENCY: GLenum = 0x000C;
1395    pub const TRIANGLE_FAN: GLenum = 0x0006;
1396    pub const TRIANGLE_STRIP: GLenum = 0x0005;
1397    pub const TRIANGLE_STRIP_ADJACENCY: GLenum = 0x000D;
1398    pub const TRUE: GLenum = 1;
1399    pub const UNIFORM_ARRAY_STRIDE: GLenum = 0x8A3C;
1400    pub const UNIFORM_BLOCK_ACTIVE_UNIFORMS: GLenum = 0x8A42;
1401    pub const UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES: GLenum = 0x8A43;
1402    pub const UNIFORM_BLOCK_BINDING: GLenum = 0x8A3F;
1403    pub const UNIFORM_BLOCK_DATA_SIZE: GLenum = 0x8A40;
1404    pub const UNIFORM_BLOCK_INDEX: GLenum = 0x8A3A;
1405    pub const UNIFORM_BLOCK_NAME_LENGTH: GLenum = 0x8A41;
1406    pub const UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER: GLenum = 0x8A46;
1407    pub const UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER: GLenum = 0x8A45;
1408    pub const UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER: GLenum = 0x8A44;
1409    pub const UNIFORM_BUFFER: GLenum = 0x8A11;
1410    pub const UNIFORM_BUFFER_BINDING: GLenum = 0x8A28;
1411    pub const UNIFORM_BUFFER_OFFSET_ALIGNMENT: GLenum = 0x8A34;
1412    pub const UNIFORM_BUFFER_SIZE: GLenum = 0x8A2A;
1413    pub const UNIFORM_BUFFER_START: GLenum = 0x8A29;
1414    pub const UNIFORM_IS_ROW_MAJOR: GLenum = 0x8A3E;
1415    pub const UNIFORM_MATRIX_STRIDE: GLenum = 0x8A3D;
1416    pub const UNIFORM_NAME_LENGTH: GLenum = 0x8A39;
1417    pub const UNIFORM_OFFSET: GLenum = 0x8A3B;
1418    pub const UNIFORM_SIZE: GLenum = 0x8A38;
1419    pub const UNIFORM_TYPE: GLenum = 0x8A37;
1420    pub const UNPACK_ALIGNMENT: GLenum = 0x0CF5;
1421    pub const UNPACK_CLIENT_STORAGE_APPLE: GLenum = 0x85B2;
1422    pub const UNPACK_IMAGE_HEIGHT: GLenum = 0x806E;
1423    pub const UNPACK_LSB_FIRST: GLenum = 0x0CF1;
1424    pub const UNPACK_ROW_LENGTH: GLenum = 0x0CF2;
1425    pub const UNPACK_SKIP_IMAGES: GLenum = 0x806D;
1426    pub const UNPACK_SKIP_PIXELS: GLenum = 0x0CF4;
1427    pub const UNPACK_SKIP_ROWS: GLenum = 0x0CF3;
1428    pub const UNPACK_SWAP_BYTES: GLenum = 0x0CF0;
1429    pub const UNSIGNALED: GLenum = 0x9118;
1430    pub const UNSIGNED_BYTE: GLenum = 0x1401;
1431    pub const UNSIGNED_BYTE_2_3_3_REV: GLenum = 0x8362;
1432    pub const UNSIGNED_BYTE_3_3_2: GLenum = 0x8032;
1433    pub const UNSIGNED_INT: GLenum = 0x1405;
1434    pub const UNSIGNED_INT_10F_11F_11F_REV: GLenum = 0x8C3B;
1435    pub const UNSIGNED_INT_10_10_10_2: GLenum = 0x8036;
1436    pub const UNSIGNED_INT_24_8: GLenum = 0x84FA;
1437    pub const UNSIGNED_INT_2_10_10_10_REV: GLenum = 0x8368;
1438    pub const UNSIGNED_INT_5_9_9_9_REV: GLenum = 0x8C3E;
1439    pub const UNSIGNED_INT_8_8_8_8: GLenum = 0x8035;
1440    pub const UNSIGNED_INT_8_8_8_8_REV: GLenum = 0x8367;
1441    pub const UNSIGNED_INT_SAMPLER_1D: GLenum = 0x8DD1;
1442    pub const UNSIGNED_INT_SAMPLER_1D_ARRAY: GLenum = 0x8DD6;
1443    pub const UNSIGNED_INT_SAMPLER_2D: GLenum = 0x8DD2;
1444    pub const UNSIGNED_INT_SAMPLER_2D_ARRAY: GLenum = 0x8DD7;
1445    pub const UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE: GLenum = 0x910A;
1446    pub const UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY: GLenum = 0x910D;
1447    pub const UNSIGNED_INT_SAMPLER_2D_RECT: GLenum = 0x8DD5;
1448    pub const UNSIGNED_INT_SAMPLER_3D: GLenum = 0x8DD3;
1449    pub const UNSIGNED_INT_SAMPLER_BUFFER: GLenum = 0x8DD8;
1450    pub const UNSIGNED_INT_SAMPLER_CUBE: GLenum = 0x8DD4;
1451    pub const UNSIGNED_INT_VEC2: GLenum = 0x8DC6;
1452    pub const UNSIGNED_INT_VEC3: GLenum = 0x8DC7;
1453    pub const UNSIGNED_INT_VEC4: GLenum = 0x8DC8;
1454    pub const UNSIGNED_NORMALIZED: GLenum = 0x8C17;
1455    pub const UNSIGNED_SHORT: GLenum = 0x1403;
1456    pub const UNSIGNED_SHORT_1_5_5_5_REV: GLenum = 0x8366;
1457    pub const UNSIGNED_SHORT_4_4_4_4: GLenum = 0x8033;
1458    pub const UNSIGNED_SHORT_4_4_4_4_REV: GLenum = 0x8365;
1459    pub const UNSIGNED_SHORT_5_5_5_1: GLenum = 0x8034;
1460    pub const UNSIGNED_SHORT_5_6_5: GLenum = 0x8363;
1461    pub const UNSIGNED_SHORT_5_6_5_REV: GLenum = 0x8364;
1462    pub const UPPER_LEFT: GLenum = 0x8CA2;
1463    pub const V2F: GLenum = 0x2A20;
1464    pub const V3F: GLenum = 0x2A21;
1465    pub const VALIDATE_STATUS: GLenum = 0x8B83;
1466    pub const VENDOR: GLenum = 0x1F00;
1467    pub const VERSION: GLenum = 0x1F02;
1468    pub const VERTEX_ARRAY: GLenum = 0x8074;
1469    pub const VERTEX_ARRAY_BINDING: GLenum = 0x85B5;
1470    pub const VERTEX_ARRAY_BINDING_APPLE: GLenum = 0x85B5;
1471    pub const VERTEX_ARRAY_BUFFER_BINDING: GLenum = 0x8896;
1472    pub const VERTEX_ARRAY_KHR: GLenum = 0x8074;
1473    pub const VERTEX_ARRAY_POINTER: GLenum = 0x808E;
1474    pub const VERTEX_ARRAY_SIZE: GLenum = 0x807A;
1475    pub const VERTEX_ARRAY_STRIDE: GLenum = 0x807C;
1476    pub const VERTEX_ARRAY_TYPE: GLenum = 0x807B;
1477    pub const VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: GLenum = 0x889F;
1478    pub const VERTEX_ATTRIB_ARRAY_DIVISOR: GLenum = 0x88FE;
1479    pub const VERTEX_ATTRIB_ARRAY_ENABLED: GLenum = 0x8622;
1480    pub const VERTEX_ATTRIB_ARRAY_INTEGER: GLenum = 0x88FD;
1481    pub const VERTEX_ATTRIB_ARRAY_NORMALIZED: GLenum = 0x886A;
1482    pub const VERTEX_ATTRIB_ARRAY_POINTER: GLenum = 0x8645;
1483    pub const VERTEX_ATTRIB_ARRAY_SIZE: GLenum = 0x8623;
1484    pub const VERTEX_ATTRIB_ARRAY_STRIDE: GLenum = 0x8624;
1485    pub const VERTEX_ATTRIB_ARRAY_TYPE: GLenum = 0x8625;
1486    pub const VERTEX_PROGRAM_POINT_SIZE: GLenum = 0x8642;
1487    pub const VERTEX_PROGRAM_TWO_SIDE: GLenum = 0x8643;
1488    pub const VERTEX_SHADER: GLenum = 0x8B31;
1489    pub const VIEWPORT: GLenum = 0x0BA2;
1490    pub const VIEWPORT_BIT: GLenum = 0x00000800;
1491    pub const WAIT_FAILED: GLenum = 0x911D;
1492    pub const WEIGHT_ARRAY_BUFFER_BINDING: GLenum = 0x889E;
1493    pub const WRITE_ONLY: GLenum = 0x88B9;
1494    pub const XOR: GLenum = 0x1506;
1495    pub const ZERO: GLenum = 0;
1496    pub const ZOOM_X: GLenum = 0x0D16;
1497    pub const ZOOM_Y: GLenum = 0x0D17;
1498}
1499
1500pub use self::ctypes::*;
1501
1502/// Typedef for an OpenGL handle
1503pub type GLuint = u32;
1504pub type GLint = i32;
1505pub type GLint64 = i64;
1506pub type GLuint64 = u64;
1507pub type GLenum = u32;
1508pub type GLintptr = isize;
1509pub type GLboolean = u8;
1510pub type GLsizeiptr = isize;
1511pub type GLvoid = core::ffi::c_void;
1512pub type GLbitfield = u32;
1513pub type GLsizei = i32;
1514pub type GLclampf = f32;
1515pub type GLfloat = f32;
1516pub type GLchar = c_char; // = c_char
1517pub type GLclampd = f64;
1518pub type GLubyte = c_uchar;
1519
1520#[cfg(feature = "gleam_trait")]
1521pub type GLeglImageOES = gleam::gl::GLeglImageOES; // *const c_void;
1522#[cfg(not(feature = "gleam_trait"))]
1523pub type GLeglImageOES = *const c_void;
1524
1525#[cfg(feature = "gleam_trait")]
1526pub type GLsync = gleam::gl::GLsync;
1527#[cfg(not(feature = "gleam_trait"))]
1528pub type GLsync = *const c_void;
1529
1530#[cfg(feature = "gleam_trait")]
1531pub use gleam::gl::DebugMessage;
1532
1533#[cfg(not(feature = "gleam_trait"))]
1534#[repr(C)]
1535pub struct DebugMessage {
1536    pub message: String,
1537    pub source: GLenum,
1538    pub ty: GLenum,
1539    pub id: GLenum,
1540    pub severity: GLenum,
1541}
1542
1543#[cfg(feature = "gleam_trait")]
1544pub use gleam::gl::GlType;
1545
1546#[cfg(not(feature = "gleam_trait"))]
1547#[repr(C)]
1548#[derive(Debug, Clone, Copy, PartialEq, Eq)]
1549pub enum GlType {
1550    Gl,
1551    GlEs,
1552}
1553
1554pub struct GenericGlContext {
1555    pub glAccum: *mut c_void,
1556    pub glActiveTexture: *mut c_void,
1557    pub glAlphaFunc: *mut c_void,
1558    pub glAreTexturesResident: *mut c_void,
1559    pub glArrayElement: *mut c_void,
1560    pub glAttachShader: *mut c_void,
1561    pub glBegin: *mut c_void,
1562    pub glBeginConditionalRender: *mut c_void,
1563    pub glBeginQuery: *mut c_void,
1564    pub glBeginTransformFeedback: *mut c_void,
1565    pub glBindAttribLocation: *mut c_void,
1566    pub glBindBuffer: *mut c_void,
1567    pub glBindBufferBase: *mut c_void,
1568    pub glBindBufferRange: *mut c_void,
1569    pub glBindFragDataLocation: *mut c_void,
1570    pub glBindFragDataLocationIndexed: *mut c_void,
1571    pub glBindFramebuffer: *mut c_void,
1572    pub glBindRenderbuffer: *mut c_void,
1573    pub glBindSampler: *mut c_void,
1574    pub glBindTexture: *mut c_void,
1575    pub glBindVertexArray: *mut c_void,
1576    pub glBindVertexArrayAPPLE: *mut c_void,
1577    pub glBitmap: *mut c_void,
1578    pub glBlendBarrierKHR: *mut c_void,
1579    pub glBlendColor: *mut c_void,
1580    pub glBlendEquation: *mut c_void,
1581    pub glBlendEquationSeparate: *mut c_void,
1582    pub glBlendFunc: *mut c_void,
1583    pub glBlendFuncSeparate: *mut c_void,
1584    pub glBlitFramebuffer: *mut c_void,
1585    pub glBufferData: *mut c_void,
1586    pub glBufferStorage: *mut c_void,
1587    pub glBufferSubData: *mut c_void,
1588    pub glCallList: *mut c_void,
1589    pub glCallLists: *mut c_void,
1590    pub glCheckFramebufferStatus: *mut c_void,
1591    pub glClampColor: *mut c_void,
1592    pub glClear: *mut c_void,
1593    pub glClearAccum: *mut c_void,
1594    pub glClearBufferfi: *mut c_void,
1595    pub glClearBufferfv: *mut c_void,
1596    pub glClearBufferiv: *mut c_void,
1597    pub glClearBufferuiv: *mut c_void,
1598    pub glClearColor: *mut c_void,
1599    pub glClearDepth: *mut c_void,
1600    pub glClearIndex: *mut c_void,
1601    pub glClearStencil: *mut c_void,
1602    pub glClientActiveTexture: *mut c_void,
1603    pub glClientWaitSync: *mut c_void,
1604    pub glClipPlane: *mut c_void,
1605    pub glColor3b: *mut c_void,
1606    pub glColor3bv: *mut c_void,
1607    pub glColor3d: *mut c_void,
1608    pub glColor3dv: *mut c_void,
1609    pub glColor3f: *mut c_void,
1610    pub glColor3fv: *mut c_void,
1611    pub glColor3i: *mut c_void,
1612    pub glColor3iv: *mut c_void,
1613    pub glColor3s: *mut c_void,
1614    pub glColor3sv: *mut c_void,
1615    pub glColor3ub: *mut c_void,
1616    pub glColor3ubv: *mut c_void,
1617    pub glColor3ui: *mut c_void,
1618    pub glColor3uiv: *mut c_void,
1619    pub glColor3us: *mut c_void,
1620    pub glColor3usv: *mut c_void,
1621    pub glColor4b: *mut c_void,
1622    pub glColor4bv: *mut c_void,
1623    pub glColor4d: *mut c_void,
1624    pub glColor4dv: *mut c_void,
1625    pub glColor4f: *mut c_void,
1626    pub glColor4fv: *mut c_void,
1627    pub glColor4i: *mut c_void,
1628    pub glColor4iv: *mut c_void,
1629    pub glColor4s: *mut c_void,
1630    pub glColor4sv: *mut c_void,
1631    pub glColor4ub: *mut c_void,
1632    pub glColor4ubv: *mut c_void,
1633    pub glColor4ui: *mut c_void,
1634    pub glColor4uiv: *mut c_void,
1635    pub glColor4us: *mut c_void,
1636    pub glColor4usv: *mut c_void,
1637    pub glColorMask: *mut c_void,
1638    pub glColorMaski: *mut c_void,
1639    pub glColorMaterial: *mut c_void,
1640    pub glColorP3ui: *mut c_void,
1641    pub glColorP3uiv: *mut c_void,
1642    pub glColorP4ui: *mut c_void,
1643    pub glColorP4uiv: *mut c_void,
1644    pub glColorPointer: *mut c_void,
1645    pub glCompileShader: *mut c_void,
1646    pub glCompressedTexImage1D: *mut c_void,
1647    pub glCompressedTexImage2D: *mut c_void,
1648    pub glCompressedTexImage3D: *mut c_void,
1649    pub glCompressedTexSubImage1D: *mut c_void,
1650    pub glCompressedTexSubImage2D: *mut c_void,
1651    pub glCompressedTexSubImage3D: *mut c_void,
1652    pub glCopyBufferSubData: *mut c_void,
1653    pub glCopyImageSubData: *mut c_void,
1654    pub glCopyPixels: *mut c_void,
1655    pub glCopyTexImage1D: *mut c_void,
1656    pub glCopyTexImage2D: *mut c_void,
1657    pub glCopyTexSubImage1D: *mut c_void,
1658    pub glCopyTexSubImage2D: *mut c_void,
1659    pub glCopyTexSubImage3D: *mut c_void,
1660    pub glCreateProgram: *mut c_void,
1661    pub glCreateShader: *mut c_void,
1662    pub glCullFace: *mut c_void,
1663    pub glDebugMessageCallback: *mut c_void,
1664    pub glDebugMessageCallbackKHR: *mut c_void,
1665    pub glDebugMessageControl: *mut c_void,
1666    pub glDebugMessageControlKHR: *mut c_void,
1667    pub glDebugMessageInsert: *mut c_void,
1668    pub glDebugMessageInsertKHR: *mut c_void,
1669    pub glDeleteBuffers: *mut c_void,
1670    pub glDeleteFencesAPPLE: *mut c_void,
1671    pub glDeleteFramebuffers: *mut c_void,
1672    pub glDeleteLists: *mut c_void,
1673    pub glDeleteProgram: *mut c_void,
1674    pub glDeleteQueries: *mut c_void,
1675    pub glDeleteRenderbuffers: *mut c_void,
1676    pub glDeleteSamplers: *mut c_void,
1677    pub glDeleteShader: *mut c_void,
1678    pub glDeleteSync: *mut c_void,
1679    pub glDeleteTextures: *mut c_void,
1680    pub glDeleteVertexArrays: *mut c_void,
1681    pub glDeleteVertexArraysAPPLE: *mut c_void,
1682    pub glDepthFunc: *mut c_void,
1683    pub glDepthMask: *mut c_void,
1684    pub glDepthRange: *mut c_void,
1685    pub glDetachShader: *mut c_void,
1686    pub glDisable: *mut c_void,
1687    pub glDisableClientState: *mut c_void,
1688    pub glDisableVertexAttribArray: *mut c_void,
1689    pub glDisablei: *mut c_void,
1690    pub glDrawArrays: *mut c_void,
1691    pub glDrawArraysInstanced: *mut c_void,
1692    pub glDrawBuffer: *mut c_void,
1693    pub glDrawBuffers: *mut c_void,
1694    pub glDrawElements: *mut c_void,
1695    pub glDrawElementsBaseVertex: *mut c_void,
1696    pub glDrawElementsInstanced: *mut c_void,
1697    pub glDrawElementsInstancedBaseVertex: *mut c_void,
1698    pub glDrawPixels: *mut c_void,
1699    pub glDrawRangeElements: *mut c_void,
1700    pub glDrawRangeElementsBaseVertex: *mut c_void,
1701    pub glEdgeFlag: *mut c_void,
1702    pub glEdgeFlagPointer: *mut c_void,
1703    pub glEdgeFlagv: *mut c_void,
1704    pub glEnable: *mut c_void,
1705    pub glEnableClientState: *mut c_void,
1706    pub glEnableVertexAttribArray: *mut c_void,
1707    pub glEnablei: *mut c_void,
1708    pub glEnd: *mut c_void,
1709    pub glEndConditionalRender: *mut c_void,
1710    pub glEndList: *mut c_void,
1711    pub glEndQuery: *mut c_void,
1712    pub glEndTransformFeedback: *mut c_void,
1713    pub glEvalCoord1d: *mut c_void,
1714    pub glEvalCoord1dv: *mut c_void,
1715    pub glEvalCoord1f: *mut c_void,
1716    pub glEvalCoord1fv: *mut c_void,
1717    pub glEvalCoord2d: *mut c_void,
1718    pub glEvalCoord2dv: *mut c_void,
1719    pub glEvalCoord2f: *mut c_void,
1720    pub glEvalCoord2fv: *mut c_void,
1721    pub glEvalMesh1: *mut c_void,
1722    pub glEvalMesh2: *mut c_void,
1723    pub glEvalPoint1: *mut c_void,
1724    pub glEvalPoint2: *mut c_void,
1725    pub glFeedbackBuffer: *mut c_void,
1726    pub glFenceSync: *mut c_void,
1727    pub glFinish: *mut c_void,
1728    pub glFinishFenceAPPLE: *mut c_void,
1729    pub glFinishObjectAPPLE: *mut c_void,
1730    pub glFlush: *mut c_void,
1731    pub glFlushMappedBufferRange: *mut c_void,
1732    pub glFogCoordPointer: *mut c_void,
1733    pub glFogCoordd: *mut c_void,
1734    pub glFogCoorddv: *mut c_void,
1735    pub glFogCoordf: *mut c_void,
1736    pub glFogCoordfv: *mut c_void,
1737    pub glFogf: *mut c_void,
1738    pub glFogfv: *mut c_void,
1739    pub glFogi: *mut c_void,
1740    pub glFogiv: *mut c_void,
1741    pub glFramebufferRenderbuffer: *mut c_void,
1742    pub glFramebufferTexture: *mut c_void,
1743    pub glFramebufferTexture1D: *mut c_void,
1744    pub glFramebufferTexture2D: *mut c_void,
1745    pub glFramebufferTexture3D: *mut c_void,
1746    pub glFramebufferTextureLayer: *mut c_void,
1747    pub glFrontFace: *mut c_void,
1748    pub glFrustum: *mut c_void,
1749    pub glGenBuffers: *mut c_void,
1750    pub glGenFencesAPPLE: *mut c_void,
1751    pub glGenFramebuffers: *mut c_void,
1752    pub glGenLists: *mut c_void,
1753    pub glGenQueries: *mut c_void,
1754    pub glGenRenderbuffers: *mut c_void,
1755    pub glGenSamplers: *mut c_void,
1756    pub glGenTextures: *mut c_void,
1757    pub glGenVertexArrays: *mut c_void,
1758    pub glGenVertexArraysAPPLE: *mut c_void,
1759    pub glGenerateMipmap: *mut c_void,
1760    pub glGetActiveAttrib: *mut c_void,
1761    pub glGetActiveUniform: *mut c_void,
1762    pub glGetActiveUniformBlockName: *mut c_void,
1763    pub glGetActiveUniformBlockiv: *mut c_void,
1764    pub glGetActiveUniformName: *mut c_void,
1765    pub glGetActiveUniformsiv: *mut c_void,
1766    pub glGetAttachedShaders: *mut c_void,
1767    pub glGetAttribLocation: *mut c_void,
1768    pub glGetBooleani_v: *mut c_void,
1769    pub glGetBooleanv: *mut c_void,
1770    pub glGetBufferParameteri64v: *mut c_void,
1771    pub glGetBufferParameteriv: *mut c_void,
1772    pub glGetBufferPointerv: *mut c_void,
1773    pub glGetBufferSubData: *mut c_void,
1774    pub glGetClipPlane: *mut c_void,
1775    pub glGetCompressedTexImage: *mut c_void,
1776    pub glGetDebugMessageLog: *mut c_void,
1777    pub glGetDebugMessageLogKHR: *mut c_void,
1778    pub glGetDoublev: *mut c_void,
1779    pub glGetError: *mut c_void,
1780    pub glGetFloatv: *mut c_void,
1781    pub glGetFragDataIndex: *mut c_void,
1782    pub glGetFragDataLocation: *mut c_void,
1783    pub glGetFramebufferAttachmentParameteriv: *mut c_void,
1784    pub glGetInteger64i_v: *mut c_void,
1785    pub glGetInteger64v: *mut c_void,
1786    pub glGetIntegeri_v: *mut c_void,
1787    pub glGetIntegerv: *mut c_void,
1788    pub glGetLightfv: *mut c_void,
1789    pub glGetLightiv: *mut c_void,
1790    pub glGetMapdv: *mut c_void,
1791    pub glGetMapfv: *mut c_void,
1792    pub glGetMapiv: *mut c_void,
1793    pub glGetMaterialfv: *mut c_void,
1794    pub glGetMaterialiv: *mut c_void,
1795    pub glGetMultisamplefv: *mut c_void,
1796    pub glGetObjectLabel: *mut c_void,
1797    pub glGetObjectLabelKHR: *mut c_void,
1798    pub glGetObjectPtrLabel: *mut c_void,
1799    pub glGetObjectPtrLabelKHR: *mut c_void,
1800    pub glGetPixelMapfv: *mut c_void,
1801    pub glGetPixelMapuiv: *mut c_void,
1802    pub glGetPixelMapusv: *mut c_void,
1803    pub glGetPointerv: *mut c_void,
1804    pub glGetPointervKHR: *mut c_void,
1805    pub glGetPolygonStipple: *mut c_void,
1806    pub glGetProgramBinary: *mut c_void,
1807    pub glGetProgramInfoLog: *mut c_void,
1808    pub glGetProgramiv: *mut c_void,
1809    pub glGetQueryObjecti64v: *mut c_void,
1810    pub glGetQueryObjectiv: *mut c_void,
1811    pub glGetQueryObjectui64v: *mut c_void,
1812    pub glGetQueryObjectuiv: *mut c_void,
1813    pub glGetQueryiv: *mut c_void,
1814    pub glGetRenderbufferParameteriv: *mut c_void,
1815    pub glGetSamplerParameterIiv: *mut c_void,
1816    pub glGetSamplerParameterIuiv: *mut c_void,
1817    pub glGetSamplerParameterfv: *mut c_void,
1818    pub glGetSamplerParameteriv: *mut c_void,
1819    pub glGetShaderInfoLog: *mut c_void,
1820    pub glGetShaderSource: *mut c_void,
1821    pub glGetShaderiv: *mut c_void,
1822    pub glGetString: *mut c_void,
1823    pub glGetStringi: *mut c_void,
1824    pub glGetSynciv: *mut c_void,
1825    pub glGetTexEnvfv: *mut c_void,
1826    pub glGetTexEnviv: *mut c_void,
1827    pub glGetTexGendv: *mut c_void,
1828    pub glGetTexGenfv: *mut c_void,
1829    pub glGetTexGeniv: *mut c_void,
1830    pub glGetTexImage: *mut c_void,
1831    pub glGetTexLevelParameterfv: *mut c_void,
1832    pub glGetTexLevelParameteriv: *mut c_void,
1833    pub glGetTexParameterIiv: *mut c_void,
1834    pub glGetTexParameterIuiv: *mut c_void,
1835    pub glGetTexParameterPointervAPPLE: *mut c_void,
1836    pub glGetTexParameterfv: *mut c_void,
1837    pub glGetTexParameteriv: *mut c_void,
1838    pub glGetTransformFeedbackVarying: *mut c_void,
1839    pub glGetUniformBlockIndex: *mut c_void,
1840    pub glGetUniformIndices: *mut c_void,
1841    pub glGetUniformLocation: *mut c_void,
1842    pub glGetUniformfv: *mut c_void,
1843    pub glGetUniformiv: *mut c_void,
1844    pub glGetUniformuiv: *mut c_void,
1845    pub glGetVertexAttribIiv: *mut c_void,
1846    pub glGetVertexAttribIuiv: *mut c_void,
1847    pub glGetVertexAttribPointerv: *mut c_void,
1848    pub glGetVertexAttribdv: *mut c_void,
1849    pub glGetVertexAttribfv: *mut c_void,
1850    pub glGetVertexAttribiv: *mut c_void,
1851    pub glHint: *mut c_void,
1852    pub glIndexMask: *mut c_void,
1853    pub glIndexPointer: *mut c_void,
1854    pub glIndexd: *mut c_void,
1855    pub glIndexdv: *mut c_void,
1856    pub glIndexf: *mut c_void,
1857    pub glIndexfv: *mut c_void,
1858    pub glIndexi: *mut c_void,
1859    pub glIndexiv: *mut c_void,
1860    pub glIndexs: *mut c_void,
1861    pub glIndexsv: *mut c_void,
1862    pub glIndexub: *mut c_void,
1863    pub glIndexubv: *mut c_void,
1864    pub glInitNames: *mut c_void,
1865    pub glInsertEventMarkerEXT: *mut c_void,
1866    pub glInterleavedArrays: *mut c_void,
1867    pub glInvalidateBufferData: *mut c_void,
1868    pub glInvalidateBufferSubData: *mut c_void,
1869    pub glInvalidateFramebuffer: *mut c_void,
1870    pub glInvalidateSubFramebuffer: *mut c_void,
1871    pub glInvalidateTexImage: *mut c_void,
1872    pub glInvalidateTexSubImage: *mut c_void,
1873    pub glIsBuffer: *mut c_void,
1874    pub glIsEnabled: *mut c_void,
1875    pub glIsEnabledi: *mut c_void,
1876    pub glIsFenceAPPLE: *mut c_void,
1877    pub glIsFramebuffer: *mut c_void,
1878    pub glIsList: *mut c_void,
1879    pub glIsProgram: *mut c_void,
1880    pub glIsQuery: *mut c_void,
1881    pub glIsRenderbuffer: *mut c_void,
1882    pub glIsSampler: *mut c_void,
1883    pub glIsShader: *mut c_void,
1884    pub glIsSync: *mut c_void,
1885    pub glIsTexture: *mut c_void,
1886    pub glIsVertexArray: *mut c_void,
1887    pub glIsVertexArrayAPPLE: *mut c_void,
1888    pub glLightModelf: *mut c_void,
1889    pub glLightModelfv: *mut c_void,
1890    pub glLightModeli: *mut c_void,
1891    pub glLightModeliv: *mut c_void,
1892    pub glLightf: *mut c_void,
1893    pub glLightfv: *mut c_void,
1894    pub glLighti: *mut c_void,
1895    pub glLightiv: *mut c_void,
1896    pub glLineStipple: *mut c_void,
1897    pub glLineWidth: *mut c_void,
1898    pub glLinkProgram: *mut c_void,
1899    pub glListBase: *mut c_void,
1900    pub glLoadIdentity: *mut c_void,
1901    pub glLoadMatrixd: *mut c_void,
1902    pub glLoadMatrixf: *mut c_void,
1903    pub glLoadName: *mut c_void,
1904    pub glLoadTransposeMatrixd: *mut c_void,
1905    pub glLoadTransposeMatrixf: *mut c_void,
1906    pub glLogicOp: *mut c_void,
1907    pub glMap1d: *mut c_void,
1908    pub glMap1f: *mut c_void,
1909    pub glMap2d: *mut c_void,
1910    pub glMap2f: *mut c_void,
1911    pub glMapBuffer: *mut c_void,
1912    pub glMapBufferRange: *mut c_void,
1913    pub glMapGrid1d: *mut c_void,
1914    pub glMapGrid1f: *mut c_void,
1915    pub glMapGrid2d: *mut c_void,
1916    pub glMapGrid2f: *mut c_void,
1917    pub glMaterialf: *mut c_void,
1918    pub glMaterialfv: *mut c_void,
1919    pub glMateriali: *mut c_void,
1920    pub glMaterialiv: *mut c_void,
1921    pub glMatrixMode: *mut c_void,
1922    pub glMultMatrixd: *mut c_void,
1923    pub glMultMatrixf: *mut c_void,
1924    pub glMultTransposeMatrixd: *mut c_void,
1925    pub glMultTransposeMatrixf: *mut c_void,
1926    pub glMultiDrawArrays: *mut c_void,
1927    pub glMultiDrawElements: *mut c_void,
1928    pub glMultiDrawElementsBaseVertex: *mut c_void,
1929    pub glMultiTexCoord1d: *mut c_void,
1930    pub glMultiTexCoord1dv: *mut c_void,
1931    pub glMultiTexCoord1f: *mut c_void,
1932    pub glMultiTexCoord1fv: *mut c_void,
1933    pub glMultiTexCoord1i: *mut c_void,
1934    pub glMultiTexCoord1iv: *mut c_void,
1935    pub glMultiTexCoord1s: *mut c_void,
1936    pub glMultiTexCoord1sv: *mut c_void,
1937    pub glMultiTexCoord2d: *mut c_void,
1938    pub glMultiTexCoord2dv: *mut c_void,
1939    pub glMultiTexCoord2f: *mut c_void,
1940    pub glMultiTexCoord2fv: *mut c_void,
1941    pub glMultiTexCoord2i: *mut c_void,
1942    pub glMultiTexCoord2iv: *mut c_void,
1943    pub glMultiTexCoord2s: *mut c_void,
1944    pub glMultiTexCoord2sv: *mut c_void,
1945    pub glMultiTexCoord3d: *mut c_void,
1946    pub glMultiTexCoord3dv: *mut c_void,
1947    pub glMultiTexCoord3f: *mut c_void,
1948    pub glMultiTexCoord3fv: *mut c_void,
1949    pub glMultiTexCoord3i: *mut c_void,
1950    pub glMultiTexCoord3iv: *mut c_void,
1951    pub glMultiTexCoord3s: *mut c_void,
1952    pub glMultiTexCoord3sv: *mut c_void,
1953    pub glMultiTexCoord4d: *mut c_void,
1954    pub glMultiTexCoord4dv: *mut c_void,
1955    pub glMultiTexCoord4f: *mut c_void,
1956    pub glMultiTexCoord4fv: *mut c_void,
1957    pub glMultiTexCoord4i: *mut c_void,
1958    pub glMultiTexCoord4iv: *mut c_void,
1959    pub glMultiTexCoord4s: *mut c_void,
1960    pub glMultiTexCoord4sv: *mut c_void,
1961    pub glMultiTexCoordP1ui: *mut c_void,
1962    pub glMultiTexCoordP1uiv: *mut c_void,
1963    pub glMultiTexCoordP2ui: *mut c_void,
1964    pub glMultiTexCoordP2uiv: *mut c_void,
1965    pub glMultiTexCoordP3ui: *mut c_void,
1966    pub glMultiTexCoordP3uiv: *mut c_void,
1967    pub glMultiTexCoordP4ui: *mut c_void,
1968    pub glMultiTexCoordP4uiv: *mut c_void,
1969    pub glNewList: *mut c_void,
1970    pub glNormal3b: *mut c_void,
1971    pub glNormal3bv: *mut c_void,
1972    pub glNormal3d: *mut c_void,
1973    pub glNormal3dv: *mut c_void,
1974    pub glNormal3f: *mut c_void,
1975    pub glNormal3fv: *mut c_void,
1976    pub glNormal3i: *mut c_void,
1977    pub glNormal3iv: *mut c_void,
1978    pub glNormal3s: *mut c_void,
1979    pub glNormal3sv: *mut c_void,
1980    pub glNormalP3ui: *mut c_void,
1981    pub glNormalP3uiv: *mut c_void,
1982    pub glNormalPointer: *mut c_void,
1983    pub glObjectLabel: *mut c_void,
1984    pub glObjectLabelKHR: *mut c_void,
1985    pub glObjectPtrLabel: *mut c_void,
1986    pub glObjectPtrLabelKHR: *mut c_void,
1987    pub glOrtho: *mut c_void,
1988    pub glPassThrough: *mut c_void,
1989    pub glPixelMapfv: *mut c_void,
1990    pub glPixelMapuiv: *mut c_void,
1991    pub glPixelMapusv: *mut c_void,
1992    pub glPixelStoref: *mut c_void,
1993    pub glPixelStorei: *mut c_void,
1994    pub glPixelTransferf: *mut c_void,
1995    pub glPixelTransferi: *mut c_void,
1996    pub glPixelZoom: *mut c_void,
1997    pub glPointParameterf: *mut c_void,
1998    pub glPointParameterfv: *mut c_void,
1999    pub glPointParameteri: *mut c_void,
2000    pub glPointParameteriv: *mut c_void,
2001    pub glPointSize: *mut c_void,
2002    pub glPolygonMode: *mut c_void,
2003    pub glPolygonOffset: *mut c_void,
2004    pub glPolygonStipple: *mut c_void,
2005    pub glPopAttrib: *mut c_void,
2006    pub glPopClientAttrib: *mut c_void,
2007    pub glPopDebugGroup: *mut c_void,
2008    pub glPopDebugGroupKHR: *mut c_void,
2009    pub glPopGroupMarkerEXT: *mut c_void,
2010    pub glPopMatrix: *mut c_void,
2011    pub glPopName: *mut c_void,
2012    pub glPrimitiveRestartIndex: *mut c_void,
2013    pub glPrioritizeTextures: *mut c_void,
2014    pub glProgramBinary: *mut c_void,
2015    pub glProgramParameteri: *mut c_void,
2016    pub glProvokingVertex: *mut c_void,
2017    pub glPushAttrib: *mut c_void,
2018    pub glPushClientAttrib: *mut c_void,
2019    pub glPushDebugGroup: *mut c_void,
2020    pub glPushDebugGroupKHR: *mut c_void,
2021    pub glPushGroupMarkerEXT: *mut c_void,
2022    pub glPushMatrix: *mut c_void,
2023    pub glPushName: *mut c_void,
2024    pub glQueryCounter: *mut c_void,
2025    pub glRasterPos2d: *mut c_void,
2026    pub glRasterPos2dv: *mut c_void,
2027    pub glRasterPos2f: *mut c_void,
2028    pub glRasterPos2fv: *mut c_void,
2029    pub glRasterPos2i: *mut c_void,
2030    pub glRasterPos2iv: *mut c_void,
2031    pub glRasterPos2s: *mut c_void,
2032    pub glRasterPos2sv: *mut c_void,
2033    pub glRasterPos3d: *mut c_void,
2034    pub glRasterPos3dv: *mut c_void,
2035    pub glRasterPos3f: *mut c_void,
2036    pub glRasterPos3fv: *mut c_void,
2037    pub glRasterPos3i: *mut c_void,
2038    pub glRasterPos3iv: *mut c_void,
2039    pub glRasterPos3s: *mut c_void,
2040    pub glRasterPos3sv: *mut c_void,
2041    pub glRasterPos4d: *mut c_void,
2042    pub glRasterPos4dv: *mut c_void,
2043    pub glRasterPos4f: *mut c_void,
2044    pub glRasterPos4fv: *mut c_void,
2045    pub glRasterPos4i: *mut c_void,
2046    pub glRasterPos4iv: *mut c_void,
2047    pub glRasterPos4s: *mut c_void,
2048    pub glRasterPos4sv: *mut c_void,
2049    pub glReadBuffer: *mut c_void,
2050    pub glReadPixels: *mut c_void,
2051    pub glRectd: *mut c_void,
2052    pub glRectdv: *mut c_void,
2053    pub glRectf: *mut c_void,
2054    pub glRectfv: *mut c_void,
2055    pub glRecti: *mut c_void,
2056    pub glRectiv: *mut c_void,
2057    pub glRects: *mut c_void,
2058    pub glRectsv: *mut c_void,
2059    pub glRenderMode: *mut c_void,
2060    pub glRenderbufferStorage: *mut c_void,
2061    pub glRenderbufferStorageMultisample: *mut c_void,
2062    pub glRotated: *mut c_void,
2063    pub glRotatef: *mut c_void,
2064    pub glSampleCoverage: *mut c_void,
2065    pub glSampleMaski: *mut c_void,
2066    pub glSamplerParameterIiv: *mut c_void,
2067    pub glSamplerParameterIuiv: *mut c_void,
2068    pub glSamplerParameterf: *mut c_void,
2069    pub glSamplerParameterfv: *mut c_void,
2070    pub glSamplerParameteri: *mut c_void,
2071    pub glSamplerParameteriv: *mut c_void,
2072    pub glScaled: *mut c_void,
2073    pub glScalef: *mut c_void,
2074    pub glScissor: *mut c_void,
2075    pub glSecondaryColor3b: *mut c_void,
2076    pub glSecondaryColor3bv: *mut c_void,
2077    pub glSecondaryColor3d: *mut c_void,
2078    pub glSecondaryColor3dv: *mut c_void,
2079    pub glSecondaryColor3f: *mut c_void,
2080    pub glSecondaryColor3fv: *mut c_void,
2081    pub glSecondaryColor3i: *mut c_void,
2082    pub glSecondaryColor3iv: *mut c_void,
2083    pub glSecondaryColor3s: *mut c_void,
2084    pub glSecondaryColor3sv: *mut c_void,
2085    pub glSecondaryColor3ub: *mut c_void,
2086    pub glSecondaryColor3ubv: *mut c_void,
2087    pub glSecondaryColor3ui: *mut c_void,
2088    pub glSecondaryColor3uiv: *mut c_void,
2089    pub glSecondaryColor3us: *mut c_void,
2090    pub glSecondaryColor3usv: *mut c_void,
2091    pub glSecondaryColorP3ui: *mut c_void,
2092    pub glSecondaryColorP3uiv: *mut c_void,
2093    pub glSecondaryColorPointer: *mut c_void,
2094    pub glSelectBuffer: *mut c_void,
2095    pub glSetFenceAPPLE: *mut c_void,
2096    pub glShadeModel: *mut c_void,
2097    pub glShaderSource: *mut c_void,
2098    pub glShaderStorageBlockBinding: *mut c_void,
2099    pub glStencilFunc: *mut c_void,
2100    pub glStencilFuncSeparate: *mut c_void,
2101    pub glStencilMask: *mut c_void,
2102    pub glStencilMaskSeparate: *mut c_void,
2103    pub glStencilOp: *mut c_void,
2104    pub glStencilOpSeparate: *mut c_void,
2105    pub glTestFenceAPPLE: *mut c_void,
2106    pub glTestObjectAPPLE: *mut c_void,
2107    pub glTexBuffer: *mut c_void,
2108    pub glTexCoord1d: *mut c_void,
2109    pub glTexCoord1dv: *mut c_void,
2110    pub glTexCoord1f: *mut c_void,
2111    pub glTexCoord1fv: *mut c_void,
2112    pub glTexCoord1i: *mut c_void,
2113    pub glTexCoord1iv: *mut c_void,
2114    pub glTexCoord1s: *mut c_void,
2115    pub glTexCoord1sv: *mut c_void,
2116    pub glTexCoord2d: *mut c_void,
2117    pub glTexCoord2dv: *mut c_void,
2118    pub glTexCoord2f: *mut c_void,
2119    pub glTexCoord2fv: *mut c_void,
2120    pub glTexCoord2i: *mut c_void,
2121    pub glTexCoord2iv: *mut c_void,
2122    pub glTexCoord2s: *mut c_void,
2123    pub glTexCoord2sv: *mut c_void,
2124    pub glTexCoord3d: *mut c_void,
2125    pub glTexCoord3dv: *mut c_void,
2126    pub glTexCoord3f: *mut c_void,
2127    pub glTexCoord3fv: *mut c_void,
2128    pub glTexCoord3i: *mut c_void,
2129    pub glTexCoord3iv: *mut c_void,
2130    pub glTexCoord3s: *mut c_void,
2131    pub glTexCoord3sv: *mut c_void,
2132    pub glTexCoord4d: *mut c_void,
2133    pub glTexCoord4dv: *mut c_void,
2134    pub glTexCoord4f: *mut c_void,
2135    pub glTexCoord4fv: *mut c_void,
2136    pub glTexCoord4i: *mut c_void,
2137    pub glTexCoord4iv: *mut c_void,
2138    pub glTexCoord4s: *mut c_void,
2139    pub glTexCoord4sv: *mut c_void,
2140    pub glTexCoordP1ui: *mut c_void,
2141    pub glTexCoordP1uiv: *mut c_void,
2142    pub glTexCoordP2ui: *mut c_void,
2143    pub glTexCoordP2uiv: *mut c_void,
2144    pub glTexCoordP3ui: *mut c_void,
2145    pub glTexCoordP3uiv: *mut c_void,
2146    pub glTexCoordP4ui: *mut c_void,
2147    pub glTexCoordP4uiv: *mut c_void,
2148    pub glTexCoordPointer: *mut c_void,
2149    pub glTexEnvf: *mut c_void,
2150    pub glTexEnvfv: *mut c_void,
2151    pub glTexEnvi: *mut c_void,
2152    pub glTexEnviv: *mut c_void,
2153    pub glTexGend: *mut c_void,
2154    pub glTexGendv: *mut c_void,
2155    pub glTexGenf: *mut c_void,
2156    pub glTexGenfv: *mut c_void,
2157    pub glTexGeni: *mut c_void,
2158    pub glTexGeniv: *mut c_void,
2159    pub glTexImage1D: *mut c_void,
2160    pub glTexImage2D: *mut c_void,
2161    pub glTexImage2DMultisample: *mut c_void,
2162    pub glTexImage3D: *mut c_void,
2163    pub glTexImage3DMultisample: *mut c_void,
2164    pub glTexParameterIiv: *mut c_void,
2165    pub glTexParameterIuiv: *mut c_void,
2166    pub glTexParameterf: *mut c_void,
2167    pub glTexParameterfv: *mut c_void,
2168    pub glTexParameteri: *mut c_void,
2169    pub glTexParameteriv: *mut c_void,
2170    pub glTexStorage1D: *mut c_void,
2171    pub glTexStorage2D: *mut c_void,
2172    pub glTexStorage3D: *mut c_void,
2173    pub glTexSubImage1D: *mut c_void,
2174    pub glTexSubImage2D: *mut c_void,
2175    pub glTexSubImage3D: *mut c_void,
2176    pub glTextureRangeAPPLE: *mut c_void,
2177    pub glTransformFeedbackVaryings: *mut c_void,
2178    pub glTranslated: *mut c_void,
2179    pub glTranslatef: *mut c_void,
2180    pub glUniform1f: *mut c_void,
2181    pub glUniform1fv: *mut c_void,
2182    pub glUniform1i: *mut c_void,
2183    pub glUniform1iv: *mut c_void,
2184    pub glUniform1ui: *mut c_void,
2185    pub glUniform1uiv: *mut c_void,
2186    pub glUniform2f: *mut c_void,
2187    pub glUniform2fv: *mut c_void,
2188    pub glUniform2i: *mut c_void,
2189    pub glUniform2iv: *mut c_void,
2190    pub glUniform2ui: *mut c_void,
2191    pub glUniform2uiv: *mut c_void,
2192    pub glUniform3f: *mut c_void,
2193    pub glUniform3fv: *mut c_void,
2194    pub glUniform3i: *mut c_void,
2195    pub glUniform3iv: *mut c_void,
2196    pub glUniform3ui: *mut c_void,
2197    pub glUniform3uiv: *mut c_void,
2198    pub glUniform4f: *mut c_void,
2199    pub glUniform4fv: *mut c_void,
2200    pub glUniform4i: *mut c_void,
2201    pub glUniform4iv: *mut c_void,
2202    pub glUniform4ui: *mut c_void,
2203    pub glUniform4uiv: *mut c_void,
2204    pub glUniformBlockBinding: *mut c_void,
2205    pub glUniformMatrix2fv: *mut c_void,
2206    pub glUniformMatrix2x3fv: *mut c_void,
2207    pub glUniformMatrix2x4fv: *mut c_void,
2208    pub glUniformMatrix3fv: *mut c_void,
2209    pub glUniformMatrix3x2fv: *mut c_void,
2210    pub glUniformMatrix3x4fv: *mut c_void,
2211    pub glUniformMatrix4fv: *mut c_void,
2212    pub glUniformMatrix4x2fv: *mut c_void,
2213    pub glUniformMatrix4x3fv: *mut c_void,
2214    pub glUnmapBuffer: *mut c_void,
2215    pub glUseProgram: *mut c_void,
2216    pub glValidateProgram: *mut c_void,
2217    pub glVertex2d: *mut c_void,
2218    pub glVertex2dv: *mut c_void,
2219    pub glVertex2f: *mut c_void,
2220    pub glVertex2fv: *mut c_void,
2221    pub glVertex2i: *mut c_void,
2222    pub glVertex2iv: *mut c_void,
2223    pub glVertex2s: *mut c_void,
2224    pub glVertex2sv: *mut c_void,
2225    pub glVertex3d: *mut c_void,
2226    pub glVertex3dv: *mut c_void,
2227    pub glVertex3f: *mut c_void,
2228    pub glVertex3fv: *mut c_void,
2229    pub glVertex3i: *mut c_void,
2230    pub glVertex3iv: *mut c_void,
2231    pub glVertex3s: *mut c_void,
2232    pub glVertex3sv: *mut c_void,
2233    pub glVertex4d: *mut c_void,
2234    pub glVertex4dv: *mut c_void,
2235    pub glVertex4f: *mut c_void,
2236    pub glVertex4fv: *mut c_void,
2237    pub glVertex4i: *mut c_void,
2238    pub glVertex4iv: *mut c_void,
2239    pub glVertex4s: *mut c_void,
2240    pub glVertex4sv: *mut c_void,
2241    pub glVertexAttrib1d: *mut c_void,
2242    pub glVertexAttrib1dv: *mut c_void,
2243    pub glVertexAttrib1f: *mut c_void,
2244    pub glVertexAttrib1fv: *mut c_void,
2245    pub glVertexAttrib1s: *mut c_void,
2246    pub glVertexAttrib1sv: *mut c_void,
2247    pub glVertexAttrib2d: *mut c_void,
2248    pub glVertexAttrib2dv: *mut c_void,
2249    pub glVertexAttrib2f: *mut c_void,
2250    pub glVertexAttrib2fv: *mut c_void,
2251    pub glVertexAttrib2s: *mut c_void,
2252    pub glVertexAttrib2sv: *mut c_void,
2253    pub glVertexAttrib3d: *mut c_void,
2254    pub glVertexAttrib3dv: *mut c_void,
2255    pub glVertexAttrib3f: *mut c_void,
2256    pub glVertexAttrib3fv: *mut c_void,
2257    pub glVertexAttrib3s: *mut c_void,
2258    pub glVertexAttrib3sv: *mut c_void,
2259    pub glVertexAttrib4Nbv: *mut c_void,
2260    pub glVertexAttrib4Niv: *mut c_void,
2261    pub glVertexAttrib4Nsv: *mut c_void,
2262    pub glVertexAttrib4Nub: *mut c_void,
2263    pub glVertexAttrib4Nubv: *mut c_void,
2264    pub glVertexAttrib4Nuiv: *mut c_void,
2265    pub glVertexAttrib4Nusv: *mut c_void,
2266    pub glVertexAttrib4bv: *mut c_void,
2267    pub glVertexAttrib4d: *mut c_void,
2268    pub glVertexAttrib4dv: *mut c_void,
2269    pub glVertexAttrib4f: *mut c_void,
2270    pub glVertexAttrib4fv: *mut c_void,
2271    pub glVertexAttrib4iv: *mut c_void,
2272    pub glVertexAttrib4s: *mut c_void,
2273    pub glVertexAttrib4sv: *mut c_void,
2274    pub glVertexAttrib4ubv: *mut c_void,
2275    pub glVertexAttrib4uiv: *mut c_void,
2276    pub glVertexAttrib4usv: *mut c_void,
2277    pub glVertexAttribDivisor: *mut c_void,
2278    pub glVertexAttribI1i: *mut c_void,
2279    pub glVertexAttribI1iv: *mut c_void,
2280    pub glVertexAttribI1ui: *mut c_void,
2281    pub glVertexAttribI1uiv: *mut c_void,
2282    pub glVertexAttribI2i: *mut c_void,
2283    pub glVertexAttribI2iv: *mut c_void,
2284    pub glVertexAttribI2ui: *mut c_void,
2285    pub glVertexAttribI2uiv: *mut c_void,
2286    pub glVertexAttribI3i: *mut c_void,
2287    pub glVertexAttribI3iv: *mut c_void,
2288    pub glVertexAttribI3ui: *mut c_void,
2289    pub glVertexAttribI3uiv: *mut c_void,
2290    pub glVertexAttribI4bv: *mut c_void,
2291    pub glVertexAttribI4i: *mut c_void,
2292    pub glVertexAttribI4iv: *mut c_void,
2293    pub glVertexAttribI4sv: *mut c_void,
2294    pub glVertexAttribI4ubv: *mut c_void,
2295    pub glVertexAttribI4ui: *mut c_void,
2296    pub glVertexAttribI4uiv: *mut c_void,
2297    pub glVertexAttribI4usv: *mut c_void,
2298    pub glVertexAttribIPointer: *mut c_void,
2299    pub glVertexAttribP1ui: *mut c_void,
2300    pub glVertexAttribP1uiv: *mut c_void,
2301    pub glVertexAttribP2ui: *mut c_void,
2302    pub glVertexAttribP2uiv: *mut c_void,
2303    pub glVertexAttribP3ui: *mut c_void,
2304    pub glVertexAttribP3uiv: *mut c_void,
2305    pub glVertexAttribP4ui: *mut c_void,
2306    pub glVertexAttribP4uiv: *mut c_void,
2307    pub glVertexAttribPointer: *mut c_void,
2308    pub glVertexP2ui: *mut c_void,
2309    pub glVertexP2uiv: *mut c_void,
2310    pub glVertexP3ui: *mut c_void,
2311    pub glVertexP3uiv: *mut c_void,
2312    pub glVertexP4ui: *mut c_void,
2313    pub glVertexP4uiv: *mut c_void,
2314    pub glVertexPointer: *mut c_void,
2315    pub glViewport: *mut c_void,
2316    pub glWaitSync: *mut c_void,
2317    pub glWindowPos2d: *mut c_void,
2318    pub glWindowPos2dv: *mut c_void,
2319    pub glWindowPos2f: *mut c_void,
2320    pub glWindowPos2fv: *mut c_void,
2321    pub glWindowPos2i: *mut c_void,
2322    pub glWindowPos2iv: *mut c_void,
2323    pub glWindowPos2s: *mut c_void,
2324    pub glWindowPos2sv: *mut c_void,
2325    pub glWindowPos3d: *mut c_void,
2326    pub glWindowPos3dv: *mut c_void,
2327    pub glWindowPos3f: *mut c_void,
2328    pub glWindowPos3fv: *mut c_void,
2329    pub glWindowPos3i: *mut c_void,
2330    pub glWindowPos3iv: *mut c_void,
2331    pub glWindowPos3s: *mut c_void,
2332    pub glWindowPos3sv: *mut c_void,
2333    pub glStartTilingQCOM: *mut c_void,
2334    pub glEndTilingQCOM: *mut c_void,
2335}
2336
2337fn encode_ascii(input: &str) -> Vec<i8> {
2338    input
2339    .chars()
2340    .filter(|c| c.is_ascii())
2341    .map(|c| c as i8)
2342    .chain(Some(0).into_iter())
2343    .collect::<Vec<_>>()
2344}
2345
2346pub unsafe fn cstr_from_ptr<'a>(ptr: *const c_char) -> &'a str {
2347
2348    #[inline]
2349    unsafe fn strlen(mut s: *const c_char) -> usize {
2350        let mut result = 0;
2351        while *s != 0 {
2352            s = s.offset(1);
2353            result += 1;
2354        }
2355        result
2356    }
2357
2358    let len = strlen(ptr);
2359    let ptr = ptr as *const u8; // c_char is always one byte, safe cast
2360    core::str::from_utf8_unchecked(core::slice::from_raw_parts(ptr, len as usize + 1))
2361}
2362
2363macro_rules! impl_gl_context {
2364    ($($opt:ident)?) => {
2365        $( $opt )? fn get_type(&self) -> GlType {
2366            let version_string = self.get_string(gl::VERSION);
2367            if version_string.contains("OpenGL ES") {
2368                GlType::GlEs
2369            } else {
2370                GlType::Gl
2371            }
2372        }
2373
2374        $( $opt )? fn buffer_data_untyped(
2375            &self,
2376            target: GLenum,
2377            size: GLsizeiptr,
2378            data: *const GLvoid,
2379            usage: GLenum,
2380        ) {
2381
2382            #[cfg(feature = "debug")] { _gl_print_debug("glBufferData"); }
2383            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2384
2385            if self.glBufferData == ptr::null_mut() {
2386                _gl_impl_panic("glBufferData");
2387                return;
2388            }
2389
2390            unsafe {
2391                let func: extern "system" fn(GLenum, GLsizeiptr, *const GLvoid, GLenum) = mem::transmute(self.glBufferData);
2392                (func)(target, size, data, usage)
2393            }
2394        }
2395
2396        $( $opt )? fn buffer_sub_data_untyped(
2397            &self,
2398            target: GLenum,
2399            offset: isize,
2400            size: GLsizeiptr,
2401            data: *const GLvoid,
2402        ) {
2403
2404            #[cfg(feature = "debug")] { _gl_print_debug("glBufferSubData"); }
2405            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2406
2407            if self.glBufferSubData == ptr::null_mut() {
2408                _gl_impl_panic("glBufferSubData");
2409                return;
2410            }
2411
2412            unsafe {
2413                let func: extern "system" fn(GLenum, isize, GLsizeiptr, *const GLvoid) = mem::transmute(self.glBufferSubData);
2414                (func)(target, offset, size, data)
2415            }
2416        }
2417
2418        $( $opt )? fn map_buffer(&self, target: GLenum, access: GLbitfield) -> *mut GLvoid {
2419
2420            #[cfg(feature = "debug")] { _gl_print_debug("glMapBuffer"); }
2421            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2422
2423            if self.glMapBuffer == ptr::null_mut() {
2424                _gl_impl_panic("glMapBuffer");
2425                return ptr::null_mut();
2426            }
2427
2428            unsafe {
2429                let func: extern "system" fn(GLenum, GLbitfield) -> *mut GLvoid = mem::transmute(self.glMapBuffer);
2430                (func)(target, access)
2431            }
2432        }
2433
2434        $( $opt )? fn map_buffer_range(
2435            &self,
2436            target: GLenum,
2437            offset: GLintptr,
2438            length: GLsizeiptr,
2439            access: GLbitfield,
2440        ) -> *mut GLvoid {
2441
2442            #[cfg(feature = "debug")] { _gl_print_debug("glMapBufferRange"); }
2443            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2444
2445            if self.glMapBufferRange == ptr::null_mut() {
2446                _gl_impl_panic("glMapBufferRange");
2447                return ptr::null_mut();
2448            }
2449
2450            unsafe {
2451                let func: extern "system" fn( GLenum, GLintptr, GLsizeiptr, GLbitfield) -> *mut GLvoid = mem::transmute(self.glMapBufferRange);
2452                (func)(target, offset, length, access)
2453            }
2454        }
2455
2456        $( $opt )? fn unmap_buffer(&self, target: GLenum) -> GLboolean {
2457
2458            #[cfg(feature = "debug")] { _gl_print_debug("glUnmapBuffer"); }
2459            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2460
2461            if self.glUnmapBuffer == ptr::null_mut() {
2462                _gl_impl_panic("glUnmapBuffer");
2463                return 1;
2464            }
2465            unsafe {
2466                let func: extern "system" fn(GLenum) -> GLboolean = mem::transmute(self.glUnmapBuffer);
2467                (func)(target)
2468            }
2469        }
2470
2471        $( $opt )? fn tex_buffer(&self, target: GLenum, internal_format: GLenum, buffer: GLuint) {
2472
2473            #[cfg(feature = "debug")] { _gl_print_debug("glTexBuffer"); }
2474            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2475
2476            if self.glTexBuffer == ptr::null_mut() {
2477                _gl_impl_panic("glTexBuffer");
2478                return;
2479            }
2480            unsafe {
2481                let func: extern "system" fn(GLenum, GLenum, GLuint) = mem::transmute(self.glTexBuffer);
2482                (func)(target, internal_format, buffer)
2483            }
2484        }
2485
2486        $( $opt )? fn shader_source(&self, shader: GLuint, strings: &[&[u8]]) {
2487
2488            #[cfg(feature = "debug")] { _gl_print_debug("glShaderSource"); }
2489            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2490
2491            let pointers: Vec<*const u8> = strings.iter().map(|string| (*string).as_ptr()).collect();
2492            let lengths: Vec<GLint> = strings.iter().map(|string| string.len() as GLint).collect();
2493
2494            if self.glShaderSource == ptr::null_mut() {
2495                _gl_impl_panic("glShaderSource");
2496                return;
2497            }
2498
2499            unsafe {
2500                let func: extern "system" fn(GLuint, GLsizei, *const *const GLchar, *const GLint) = mem::transmute(self.glShaderSource);
2501                (func)(shader, pointers.len() as GLsizei, pointers.as_ptr() as *const *const GLchar, lengths.as_ptr())
2502            }
2503
2504            mem::drop(lengths);
2505            mem::drop(pointers);
2506        }
2507
2508        $( $opt )? fn read_buffer(&self, mode: GLenum) {
2509
2510            #[cfg(feature = "debug")] { _gl_print_debug("glReadBuffer"); }
2511            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2512
2513            if self.glReadBuffer == ptr::null_mut() {
2514                _gl_impl_panic("glReadBuffer");
2515                return;
2516            }
2517            unsafe {
2518                let func: extern "system" fn(GLenum) = mem::transmute(self.glReadBuffer);
2519                (func)(mode)
2520            }
2521        }
2522
2523        $( $opt )? fn read_pixels_into_buffer(
2524            &self,
2525            x: GLint,
2526            y: GLint,
2527            width: GLsizei,
2528            height: GLsizei,
2529            format: GLenum,
2530            pixel_type: GLenum,
2531            dst_buffer: &mut [u8],
2532        ) {
2533
2534            #[cfg(feature = "debug")] { _gl_print_debug("glReadPixels"); }
2535            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2536
2537            if self.glReadPixels == ptr::null_mut() {
2538                _gl_impl_panic("glReadPixels");
2539                return;
2540            }
2541
2542
2543            #[cfg(feature = "debug")] { _gl_print_debug("glPixelStorei"); }
2544            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2545
2546            if self.glPixelStorei == ptr::null_mut() {
2547                _gl_impl_panic("glPixelStorei");
2548                return;
2549            }
2550
2551            unsafe {
2552                let glPixelStorei: extern "system" fn(GLenum, GLint) = mem::transmute(self.glPixelStorei);
2553                (glPixelStorei)(gl::PACK_ALIGNMENT, 1);
2554
2555                let func: extern "system" fn(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, *mut u8) = mem::transmute(self.glReadPixels);
2556                (func)(x, y, width, height, format, pixel_type, dst_buffer.as_mut_ptr())
2557            }
2558        }
2559
2560        $( $opt )? fn read_pixels(
2561            &self,
2562            x: GLint,
2563            y: GLint,
2564            width: GLsizei,
2565            height: GLsizei,
2566            format: GLenum,
2567            pixel_type: GLenum,
2568        ) -> Vec<u8> {
2569
2570            use gl::*;
2571
2572            let bit_depth = match pixel_type {
2573
2574                UNSIGNED_BYTE |
2575                BYTE |
2576                UNSIGNED_BYTE_3_3_2 |
2577                UNSIGNED_BYTE_2_3_3_REV => 1,
2578
2579                UNSIGNED_SHORT |
2580                UNSIGNED_SHORT_5_6_5 |
2581                UNSIGNED_SHORT_5_6_5_REV |
2582                UNSIGNED_SHORT_4_4_4_4 |
2583                UNSIGNED_SHORT_4_4_4_4_REV |
2584                UNSIGNED_SHORT_5_5_5_1 |
2585                UNSIGNED_SHORT_1_5_5_5_REV |
2586                SHORT => 2,
2587
2588                UNSIGNED_INT |
2589                UNSIGNED_INT_8_8_8_8 |
2590                UNSIGNED_INT_8_8_8_8_REV |
2591                UNSIGNED_INT_10_10_10_2 |
2592                UNSIGNED_INT_2_10_10_10_REV |
2593                UNSIGNED_INT_24_8 |
2594                UNSIGNED_INT_10F_11F_11F_REV |
2595                UNSIGNED_INT_5_9_9_9_REV |
2596                INT => 4,
2597
2598                HALF_FLOAT => 2,
2599
2600                FLOAT |
2601                FLOAT_32_UNSIGNED_INT_24_8_REV => 4,
2602
2603                _ => 0,
2604            };
2605
2606            let mut v = vec![0;width as usize * height as usize * bit_depth];
2607            self.read_pixels_into_buffer(x, y, width, height, format, pixel_type, &mut v[..]);
2608            v
2609        }
2610
2611        $( $opt )? unsafe fn read_pixels_into_pbo(
2612            &self,
2613            x: GLint,
2614            y: GLint,
2615            width: GLsizei,
2616            height: GLsizei,
2617            format: GLenum,
2618            pixel_type: GLenum,
2619        ) {
2620
2621            #[cfg(feature = "debug")] { _gl_print_debug("glReadPixels"); }
2622            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2623
2624            if self.glReadPixels == ptr::null_mut() {
2625                _gl_impl_panic("glReadPixels");
2626                return;
2627            }
2628
2629            let func: extern "system" fn(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, *mut u8) = mem::transmute(self.glReadPixels);
2630            (func)(x, y, width, height, format, pixel_type, ptr::null_mut())
2631        }
2632
2633        $( $opt )? fn sample_coverage(&self, value: GLclampf, invert: bool) {
2634
2635            #[cfg(feature = "debug")] { _gl_print_debug("glSampleCoverage"); }
2636            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2637
2638            if self.glSampleCoverage == ptr::null_mut() {
2639                _gl_impl_panic("glSampleCoverage");
2640                return;
2641            }
2642
2643            unsafe {
2644                let func: extern "system" fn(GLclampf, bool) = mem::transmute(self.glSampleCoverage);
2645                (func)(value, invert)
2646            }
2647        }
2648
2649        $( $opt )? fn polygon_offset(&self, factor: GLfloat, units: GLfloat) {
2650
2651            #[cfg(feature = "debug")] { _gl_print_debug("glPolygonOffset"); }
2652            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2653
2654            if self.glPolygonOffset == ptr::null_mut() {
2655                _gl_impl_panic("glPolygonOffset");
2656                return;
2657            }
2658
2659            unsafe {
2660                let func: extern "system" fn(GLfloat, GLfloat) = mem::transmute(self.glPolygonOffset);
2661                (func)(factor, units)
2662            }
2663        }
2664
2665        $( $opt )? fn pixel_store_i(&self, name: GLenum, param: GLint) {
2666
2667            #[cfg(feature = "debug")] { _gl_print_debug("glPixelStorei"); }
2668            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2669
2670            if self.glPixelStorei == ptr::null_mut() {
2671                _gl_impl_panic("glPixelStorei");
2672                return;
2673            }
2674
2675            unsafe {
2676                let func: extern "system" fn(GLenum, GLint) = mem::transmute(self.glPixelStorei);
2677                (func)(name, param)
2678            }
2679        }
2680
2681        $( $opt )? fn gen_buffers(&self, n: GLsizei) -> Vec<GLuint> {
2682
2683            #[cfg(feature = "debug")] { _gl_print_debug("glGenBuffers"); }
2684            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2685
2686            if self.glGenBuffers == ptr::null_mut() {
2687                _gl_impl_panic("glGenBuffers");
2688                return Vec::new();
2689            }
2690
2691            let mut v = vec![0;n.max(0) as usize];
2692            unsafe {
2693                let func: extern "system" fn(GLsizei, *mut GLuint) = mem::transmute(self.glGenBuffers);
2694                (func)(n, v.as_mut_ptr());
2695            }
2696            v
2697        }
2698
2699        $( $opt )? fn gen_renderbuffers(&self, n: GLsizei) -> Vec<GLuint> {
2700
2701            #[cfg(feature = "debug")] { _gl_print_debug("glGenRenderbuffers"); }
2702            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2703
2704            if self.glGenRenderbuffers == ptr::null_mut() {
2705                _gl_impl_panic("glGenRenderbuffers");
2706                return Vec::new();
2707            }
2708
2709            let mut v = vec![0;n.max(0) as usize];
2710            unsafe {
2711                let func: extern "system" fn(GLsizei, *mut GLuint) = mem::transmute(self.glGenRenderbuffers);
2712                (func)(n, v.as_mut_ptr());
2713            }
2714            v
2715        }
2716
2717        $( $opt )? fn gen_framebuffers(&self, n: GLsizei) -> Vec<GLuint> {
2718
2719            #[cfg(feature = "debug")] { _gl_print_debug("glGenFramebuffers"); }
2720            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2721
2722            if self.glGenFramebuffers == ptr::null_mut() {
2723                _gl_impl_panic("glGenFramebuffers");
2724                return Vec::new();
2725            }
2726
2727            let mut v = vec![0;n.max(0) as usize];
2728            unsafe {
2729                let func: extern "system" fn(GLsizei, *mut GLuint) = mem::transmute(self.glGenFramebuffers);
2730                (func)(n, v.as_mut_ptr());
2731            }
2732            v
2733        }
2734
2735        $( $opt )? fn gen_textures(&self, n: GLsizei) -> Vec<GLuint> {
2736
2737            #[cfg(feature = "debug")] { _gl_print_debug("glGenTextures"); }
2738            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2739
2740            if self.glGenTextures == ptr::null_mut() {
2741                _gl_impl_panic("glGenTextures");
2742                return Vec::new();
2743            }
2744
2745            let mut v = vec![0;n.max(0) as usize];
2746            unsafe {
2747                let func: extern "system" fn(GLsizei, *mut GLuint) = mem::transmute(self.glGenTextures);
2748                (func)(n, v.as_mut_ptr());
2749            }
2750            v
2751        }
2752
2753        $( $opt )? fn gen_vertex_arrays(&self, n: GLsizei) -> Vec<GLuint> {
2754
2755            #[cfg(feature = "debug")] { _gl_print_debug("glGenVertexArrays"); }
2756            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2757
2758            if self.glGenVertexArrays == ptr::null_mut() {
2759                _gl_impl_panic("glGenVertexArrays");
2760                return Vec::new();
2761            }
2762
2763            let mut v = vec![0;n.max(0) as usize];
2764            unsafe {
2765                let func: extern "system" fn(GLsizei, *mut GLuint) = mem::transmute(self.glGenVertexArrays);
2766                (func)(n, v.as_mut_ptr());
2767            }
2768            v
2769        }
2770
2771        $( $opt )? fn gen_vertex_arrays_apple(&self, n: GLsizei) -> Vec<GLuint> {
2772
2773            #[cfg(feature = "debug")] { _gl_print_debug("glGenVertexArraysAPPLE"); }
2774            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2775
2776            if self.glGenVertexArraysAPPLE == ptr::null_mut() {
2777                _gl_impl_panic("glGenVertexArraysAPPLE");
2778                return Vec::new();
2779            }
2780
2781            let mut v = vec![0;n.max(0) as usize];
2782            unsafe {
2783                let func: extern "system" fn(GLsizei, *mut GLuint) = mem::transmute(self.glGenVertexArraysAPPLE);
2784                (func)(n, v.as_mut_ptr());
2785            }
2786            v
2787        }
2788
2789        $( $opt )? fn gen_queries(&self, n: GLsizei) -> Vec<GLuint> {
2790
2791            #[cfg(feature = "debug")] { _gl_print_debug("glGenQueries"); }
2792            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2793
2794            if self.glGenQueries == ptr::null_mut() {
2795                _gl_impl_panic("glGenQueries");
2796                return Vec::new();
2797            }
2798
2799            let mut v = vec![0;n.max(0) as usize];
2800            unsafe {
2801                let func: extern "system" fn(GLsizei, *mut GLuint) = mem::transmute(self.glGenQueries);
2802                (func)(n, v.as_mut_ptr());
2803            }
2804            v
2805        }
2806
2807        $( $opt )? fn begin_query(&self, target: GLenum, id: GLuint) {
2808
2809            #[cfg(feature = "debug")] { _gl_print_debug("glBeginQuery"); }
2810            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2811
2812            if self.glBeginQuery == ptr::null_mut() {
2813                _gl_impl_panic("glBeginQuery");
2814                return;
2815            }
2816
2817            unsafe {
2818                let func: extern "system" fn(GLenum, GLuint) = mem::transmute(self.glBeginQuery);
2819                (func)(target, id)
2820            }
2821        }
2822
2823        $( $opt )? fn end_query(&self, target: GLenum) {
2824
2825            #[cfg(feature = "debug")] { _gl_print_debug("glEndQuery"); }
2826            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2827
2828            if self.glEndQuery == ptr::null_mut() {
2829                _gl_impl_panic("glEndQuery");
2830                return;
2831            }
2832
2833            unsafe {
2834                let func: extern "system" fn(GLenum) = mem::transmute(self.glEndQuery);
2835                (func)(target)
2836            }
2837        }
2838
2839        $( $opt )? fn query_counter(&self, id: GLuint, target: GLenum) {
2840
2841            #[cfg(feature = "debug")] { _gl_print_debug("glQueryCounter"); }
2842            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2843
2844            if self.glQueryCounter == ptr::null_mut() {
2845                _gl_impl_panic("glQueryCounter");
2846                return;
2847            }
2848
2849            unsafe {
2850                let func: extern "system" fn(GLuint, GLenum) = mem::transmute(self.glQueryCounter);
2851                (func)(id, target)
2852            }
2853        }
2854
2855        $( $opt )? fn get_query_object_iv(&self, id: GLuint, pname: GLenum) -> i32 {
2856
2857            #[cfg(feature = "debug")] { _gl_print_debug("glGetQueryObjectiv"); }
2858            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2859
2860            if self.glGetQueryObjectiv == ptr::null_mut() {
2861                _gl_impl_panic("glGetQueryObjectiv");
2862                return 0;
2863            }
2864
2865            unsafe {
2866                let func: extern "system" fn(GLuint, GLenum) -> i32 = mem::transmute(self.glGetQueryObjectiv);
2867                (func)(id, pname)
2868            }
2869        }
2870
2871        $( $opt )? fn get_query_object_uiv(&self, id: GLuint, pname: GLenum) -> u32 {
2872
2873            #[cfg(feature = "debug")] { _gl_print_debug("glGetQueryObjectuiv"); }
2874            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2875
2876            if self.glGetQueryObjectuiv == ptr::null_mut() {
2877                _gl_impl_panic("glGetQueryObjectuiv");
2878                return 0;
2879            }
2880
2881            unsafe {
2882                let func: extern "system" fn(GLuint, GLenum) -> u32 = mem::transmute(self.glGetQueryObjectuiv);
2883                (func)(id, pname)
2884            }
2885        }
2886
2887        $( $opt )? fn get_query_object_i64v(&self, id: GLuint, pname: GLenum) -> i64 {
2888
2889            #[cfg(feature = "debug")] { _gl_print_debug("glGetQueryObjecti64v"); }
2890            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2891
2892            if self.glGetQueryObjecti64v == ptr::null_mut() {
2893                _gl_impl_panic("glGetQueryObjecti64v");
2894                return 0;
2895            }
2896
2897            unsafe {
2898                let func: extern "system" fn(GLuint, GLenum) -> i64 = mem::transmute(self.glGetQueryObjecti64v);
2899                (func)(id, pname)
2900            }
2901        }
2902
2903        $( $opt )? fn get_query_object_ui64v(&self, id: GLuint, pname: GLenum) -> u64 {
2904
2905            #[cfg(feature = "debug")] { _gl_print_debug("glGetQueryObjectui64v"); }
2906            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2907
2908            if self.glGetQueryObjectui64v == ptr::null_mut() {
2909                _gl_impl_panic("glGetQueryObjectui64v");
2910                return 0;
2911            }
2912
2913            unsafe {
2914                let func: extern "system" fn(GLuint, GLenum) -> u64 = mem::transmute(self.glGetQueryObjectui64v);
2915                (func)(id, pname)
2916            }
2917        }
2918
2919        $( $opt )? fn delete_queries(&self, queries: &[GLuint]) {
2920
2921            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteQueries"); }
2922            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2923
2924            if self.glDeleteQueries == ptr::null_mut() {
2925                _gl_impl_panic("glDeleteQueries");
2926                return;
2927            }
2928
2929            unsafe {
2930                let func: extern "system" fn(GLsizei, *const GLuint) = mem::transmute(self.glDeleteQueries);
2931                (func)(queries.len() as GLsizei, queries.as_ptr())
2932            }
2933        }
2934
2935        $( $opt )? fn delete_vertex_arrays(&self, vertex_arrays: &[GLuint]) {
2936
2937            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteVertexArrays"); }
2938            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2939
2940            if self.glDeleteVertexArrays == ptr::null_mut() {
2941                _gl_impl_panic("glDeleteVertexArrays");
2942                return;
2943            }
2944
2945            unsafe {
2946                let func: extern "system" fn(GLsizei, *const GLuint) = mem::transmute(self.glDeleteVertexArrays);
2947                (func)(vertex_arrays.len() as GLsizei, vertex_arrays.as_ptr())
2948            }
2949        }
2950
2951        $( $opt )? fn delete_vertex_arrays_apple(&self, vertex_arrays: &[GLuint]) {
2952
2953            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteVertexArraysAPPLE"); }
2954            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2955
2956            if self.glDeleteVertexArraysAPPLE == ptr::null_mut() {
2957                _gl_impl_panic("glDeleteVertexArraysAPPLE");
2958                return;
2959            }
2960
2961            unsafe {
2962                let func: extern "system" fn(GLsizei, *const GLuint) = mem::transmute(self.glDeleteVertexArraysAPPLE);
2963                (func)(vertex_arrays.len() as GLsizei, vertex_arrays.as_ptr())
2964            }
2965        }
2966
2967        $( $opt )? fn delete_buffers(&self, buffers: &[GLuint]) {
2968
2969            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteBuffers"); }
2970            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2971
2972            if self.glDeleteBuffers == ptr::null_mut() {
2973                _gl_impl_panic("glDeleteBuffers");
2974                return;
2975            }
2976
2977            unsafe {
2978                let func: extern "system" fn(GLsizei, *const GLuint) = mem::transmute(self.glDeleteBuffers);
2979                (func)(buffers.len() as GLsizei, buffers.as_ptr())
2980            }
2981        }
2982
2983        $( $opt )? fn delete_renderbuffers(&self, renderbuffers: &[GLuint]) {
2984
2985            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteRenderbuffers"); }
2986            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
2987
2988            if self.glDeleteRenderbuffers == ptr::null_mut() {
2989                _gl_impl_panic("glDeleteRenderbuffers");
2990                return;
2991            }
2992
2993            unsafe {
2994                let func: extern "system" fn(GLsizei, *const GLuint) = mem::transmute(self.glDeleteRenderbuffers);
2995                (func)(renderbuffers.len() as GLsizei, renderbuffers.as_ptr())
2996            }
2997        }
2998
2999        $( $opt )? fn delete_framebuffers(&self, framebuffers: &[GLuint]) {
3000
3001            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteFramebuffers"); }
3002            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3003
3004            if self.glDeleteFramebuffers == ptr::null_mut() {
3005                _gl_impl_panic("glDeleteFramebuffers");
3006                return;
3007            }
3008
3009            unsafe {
3010                let func: extern "system" fn(GLsizei, *const GLuint) = mem::transmute(self.glDeleteFramebuffers);
3011                (func)(framebuffers.len() as GLsizei, framebuffers.as_ptr())
3012            }
3013        }
3014
3015        $( $opt )? fn delete_textures(&self, textures: &[GLuint]) {
3016
3017            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteTextures"); }
3018            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3019
3020            if self.glDeleteTextures == ptr::null_mut() {
3021                _gl_impl_panic("glDeleteTextures");
3022                return;
3023            }
3024
3025            unsafe {
3026                let func: extern "system" fn(GLsizei, *const GLuint) = mem::transmute(self.glDeleteTextures);
3027                (func)(textures.len() as GLsizei, textures.as_ptr())
3028            }
3029        }
3030
3031        $( $opt )? fn framebuffer_renderbuffer(
3032            &self,
3033            target: GLenum,
3034            attachment: GLenum,
3035            renderbuffertarget: GLenum,
3036            renderbuffer: GLuint,
3037        ) {
3038
3039            #[cfg(feature = "debug")] { _gl_print_debug("glFramebufferRenderbuffer"); }
3040            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3041
3042            if self.glFramebufferRenderbuffer == ptr::null_mut() {
3043                _gl_impl_panic("glFramebufferRenderbuffer");
3044                return;
3045            }
3046
3047            unsafe {
3048                let func: extern "system" fn(GLenum, GLenum, GLenum, GLuint) = mem::transmute(self.glFramebufferRenderbuffer);
3049                (func)( target, attachment, renderbuffertarget, renderbuffer)
3050            }
3051        }
3052
3053        $( $opt )? fn renderbuffer_storage(
3054            &self,
3055            target: GLenum,
3056            internalformat: GLenum,
3057            width: GLsizei,
3058            height: GLsizei,
3059        ) {
3060
3061            #[cfg(feature = "debug")] { _gl_print_debug("glRenderbufferStorage"); }
3062            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3063
3064            if self.glRenderbufferStorage == ptr::null_mut() {
3065                _gl_impl_panic("glRenderbufferStorage");
3066                return;
3067            }
3068
3069            unsafe {
3070                let func: extern "system" fn(GLenum, GLenum, GLsizei, GLsizei) = mem::transmute(self.glRenderbufferStorage);
3071                (func)(target, internalformat, width, height)
3072            }
3073        }
3074
3075        $( $opt )? fn depth_func(&self, func: GLenum) {
3076
3077            #[cfg(feature = "debug")] { _gl_print_debug("glDepthFunc"); }
3078            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3079
3080            if self.glDepthFunc == ptr::null_mut() {
3081                _gl_impl_panic("glDepthFunc");
3082                return;
3083            }
3084
3085            unsafe {
3086                let glDepthFunc: extern "system" fn(GLenum) = mem::transmute(self.glDepthFunc);
3087                (glDepthFunc)(func)
3088            }
3089        }
3090
3091        $( $opt )? fn active_texture(&self, texture: GLenum) {
3092
3093            #[cfg(feature = "debug")] { _gl_print_debug("glActiveTexture"); }
3094            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3095
3096            if self.glActiveTexture == ptr::null_mut() {
3097                _gl_impl_panic("glActiveTexture");
3098                return;
3099            }
3100
3101            unsafe {
3102                let func: extern "system" fn(GLenum) = mem::transmute(self.glActiveTexture);
3103                (func)(texture)
3104            }
3105        }
3106
3107        $( $opt )? fn attach_shader(&self, program: GLuint, shader: GLuint) {
3108
3109            #[cfg(feature = "debug")] { _gl_print_debug("glAttachShader"); }
3110            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3111
3112            if self.glAttachShader == ptr::null_mut() {
3113                _gl_impl_panic("glAttachShader");
3114                return;
3115            }
3116
3117            unsafe {
3118                let func: extern "system" fn(GLuint, GLuint) = mem::transmute(self.glAttachShader);
3119                (func)(program, shader)
3120            }
3121        }
3122
3123        $( $opt )? fn bind_attrib_location(&self, program: GLuint, index: GLuint, name: &str) {
3124
3125
3126            #[cfg(feature = "debug")] { _gl_print_debug("glBindAttribLocation"); }
3127            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3128
3129            if self.glBindAttribLocation == ptr::null_mut() {
3130                _gl_impl_panic("glBindAttribLocation");
3131                return;
3132            }
3133
3134            let cstr = encode_ascii(name);
3135
3136            unsafe {
3137                let func: extern "system" fn(GLuint, GLuint, *const c_char) = mem::transmute(self.glBindAttribLocation);
3138                (func)(program, index, cstr.as_ptr())
3139            }
3140        }
3141
3142        $( $opt )? unsafe fn get_uniform_iv(&self, program: GLuint, location: GLint, result: &mut [GLint]) {
3143
3144            #[cfg(feature = "debug")] { _gl_print_debug("glGetUniformiv"); }
3145            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3146
3147            if self.glGetUniformiv == ptr::null_mut() {
3148                _gl_impl_panic("glGetUniformiv");
3149                return;
3150            }
3151
3152            let func: extern "system" fn(GLuint, GLint, *mut GLint) = mem::transmute(self.glGetUniformiv);
3153            (func)(program, location, result.as_mut_ptr())
3154        }
3155
3156        $( $opt )? unsafe fn get_uniform_fv(&self, program: GLuint, location: GLint, result: &mut [GLfloat]) {
3157
3158            #[cfg(feature = "debug")] { _gl_print_debug("glGetUniformfv"); }
3159            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3160
3161            if self.glGetUniformfv == ptr::null_mut() {
3162                _gl_impl_panic("glGetUniformfv");
3163                return;
3164            }
3165
3166            let func: extern "system" fn(GLuint, GLint, *mut GLfloat) = mem::transmute(self.glGetUniformfv);
3167            (func)(program, location, result.as_mut_ptr())
3168        }
3169
3170        $( $opt )? fn get_uniform_block_index(&self, program: GLuint, name: &str) -> GLuint {
3171
3172            #[cfg(feature = "debug")] { _gl_print_debug("glGetUniformBlockIndex"); }
3173            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3174
3175            if self.glGetUniformBlockIndex == ptr::null_mut() {
3176                _gl_impl_panic("glGetUniformBlockIndex");
3177                return 0;
3178            }
3179
3180            let cstr = encode_ascii(name);
3181
3182            unsafe {
3183                let func: extern "system" fn(GLuint, *const c_char) -> GLuint = mem::transmute(self.glGetUniformBlockIndex);
3184                (func)(program, cstr.as_ptr())
3185            }
3186        }
3187
3188        // ---------------------------------------------------------------------------------------------------------------------------
3189        // ---------------------------------------------------------------------------------------------------------------------------
3190        // ---------------------------------------------------------------------------------------------------------------------------
3191        // ---------------------------------------------------------------------------------------------------------------------------
3192
3193        $( $opt )? fn get_uniform_indices(&self, program: GLuint, names: &[&str]) -> Vec<GLuint> {
3194
3195
3196            #[cfg(feature = "debug")] { _gl_print_debug("glGetUniformIndices"); }
3197            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3198
3199            if self.glGetUniformIndices == ptr::null_mut() {
3200                _gl_impl_panic("glGetUniformIndices");
3201                return Vec::new();
3202            }
3203
3204            let c_strings: Vec<Vec<i8>> = names.iter().map(|n| encode_ascii(*n)).collect();
3205            let pointers: Vec<*const GLchar> = c_strings.iter().map(|string| string.as_ptr()).collect();
3206            let mut result = vec![0;c_strings.len()];
3207            unsafe {
3208                let func: extern "system" fn(GLuint, GLsizei, *const *const GLchar, *const GLuint) -> GLuint = mem::transmute(self.glGetUniformIndices);
3209                (func)(
3210                    program,
3211                    pointers.len() as GLsizei,
3212                    pointers.as_ptr(),
3213                    result.as_mut_ptr(),
3214                );
3215            }
3216            result
3217        }
3218
3219        $( $opt )? fn bind_buffer_base(&self, target: GLenum, index: GLuint, buffer: GLuint) {
3220
3221
3222            #[cfg(feature = "debug")] { _gl_print_debug("glBindBufferBase"); }
3223            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3224
3225            if self.glBindBufferBase == ptr::null_mut() {
3226                _gl_impl_panic("glBindBufferBase");
3227                return;
3228            }
3229
3230            unsafe {
3231                let func: extern "system" fn(GLenum, GLuint, GLuint) = mem::transmute(self.glBindBufferBase);
3232                (func)(target, index, buffer);
3233            }
3234        }
3235
3236        $( $opt )? fn bind_buffer_range(
3237            &self,
3238            target: GLenum,
3239            index: GLuint,
3240            buffer: GLuint,
3241            offset: GLintptr,
3242            size: GLsizeiptr,
3243        ) {
3244
3245
3246            #[cfg(feature = "debug")] { _gl_print_debug("glBindBufferRange"); }
3247            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3248
3249            if self.glBindBufferRange == ptr::null_mut() {
3250                _gl_impl_panic("glBindBufferRange");
3251                return;
3252            }
3253
3254            unsafe {
3255                let func: extern "system" fn(GLenum, GLuint, GLuint, GLintptr, GLsizeiptr) = mem::transmute(self.glBindBufferRange);
3256                (func)(target, index, buffer, offset, size);
3257            }
3258        }
3259
3260        $( $opt )? fn uniform_block_binding(
3261            &self,
3262            program: GLuint,
3263            uniform_block_index: GLuint,
3264            uniform_block_binding: GLuint,
3265        ) {
3266
3267
3268            #[cfg(feature = "debug")] { _gl_print_debug("glUniformBlockBinding"); }
3269            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3270
3271            if self.glUniformBlockBinding == ptr::null_mut() {
3272                _gl_impl_panic("glUniformBlockBinding");
3273                return;
3274            }
3275
3276            unsafe {
3277                let func: extern "system" fn(GLuint, GLuint, GLuint) = mem::transmute(self.glUniformBlockBinding);
3278                (func)(program, uniform_block_index, uniform_block_binding);
3279            }
3280        }
3281
3282        $( $opt )? fn bind_buffer(&self, target: GLenum, buffer: GLuint) {
3283
3284
3285            #[cfg(feature = "debug")] { _gl_print_debug("glBindBuffer"); }
3286            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3287
3288            if self.glBindBuffer == ptr::null_mut() {
3289                _gl_impl_panic("glBindBuffer");
3290                return;
3291            }
3292
3293            unsafe {
3294                let func: extern "system" fn(GLenum, GLuint) = mem::transmute(self.glBindBuffer);
3295                (func)(target, buffer);
3296            }
3297        }
3298
3299        $( $opt )? fn bind_vertex_array(&self, vao: GLuint) {
3300
3301
3302            #[cfg(feature = "debug")] { _gl_print_debug("glBindVertexArray"); }
3303            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3304
3305            if self.glBindVertexArray == ptr::null_mut() {
3306                _gl_impl_panic("glBindVertexArray");
3307                return;
3308            }
3309
3310            unsafe {
3311                let func: extern "system" fn(GLuint) = mem::transmute(self.glBindVertexArray);
3312                (func)(vao);
3313            }
3314        }
3315
3316        $( $opt )? fn bind_vertex_array_apple(&self, vao: GLuint) {
3317
3318
3319            #[cfg(feature = "debug")] { _gl_print_debug("glBindVertexArrayAPPLE"); }
3320            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3321
3322            if self.glBindVertexArrayAPPLE == ptr::null_mut() {
3323                _gl_impl_panic("glBindVertexArrayAPPLE");
3324                return;
3325            }
3326
3327            unsafe {
3328                let func: extern "system" fn(GLuint) = mem::transmute(self.glBindVertexArrayAPPLE);
3329                (func)(vao)
3330            }
3331        }
3332
3333        $( $opt )? fn bind_renderbuffer(&self, target: GLenum, renderbuffer: GLuint) {
3334
3335
3336            #[cfg(feature = "debug")] { _gl_print_debug("glBindRenderbuffer"); }
3337            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3338
3339            if self.glBindRenderbuffer == ptr::null_mut() {
3340                _gl_impl_panic("glBindRenderbuffer");
3341                return;
3342            }
3343
3344            unsafe {
3345                let func: extern "system" fn(GLenum, GLuint) = mem::transmute(self.glBindRenderbuffer);
3346                (func)(target, renderbuffer);
3347            }
3348        }
3349
3350        $( $opt )? fn bind_framebuffer(&self, target: GLenum, framebuffer: GLuint) {
3351
3352
3353            #[cfg(feature = "debug")] { _gl_print_debug("glBindFramebuffer"); }
3354            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3355
3356            if self.glBindFramebuffer == ptr::null_mut() {
3357                _gl_impl_panic("glBindFramebuffer");
3358                return;
3359            }
3360
3361            unsafe {
3362                let func: extern "system" fn(GLenum, GLuint) = mem::transmute(self.glBindFramebuffer);
3363                (func)(target, framebuffer);
3364            }
3365        }
3366
3367        $( $opt )? fn bind_texture(&self, target: GLenum, texture: GLuint) {
3368
3369
3370            #[cfg(feature = "debug")] { _gl_print_debug("glBindTexture"); }
3371            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3372
3373            if self.glBindTexture == ptr::null_mut() {
3374                _gl_impl_panic("glBindTexture");
3375                return;
3376            }
3377
3378            unsafe {
3379                let func: extern "system" fn(GLenum, GLuint) = mem::transmute(self.glBindTexture);
3380                (func)(target, texture);
3381            }
3382        }
3383
3384        $( $opt )? fn draw_buffers(&self, bufs: &[GLenum]) {
3385
3386
3387            #[cfg(feature = "debug")] { _gl_print_debug("glDrawBuffers"); }
3388            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3389
3390            if self.glDrawBuffers == ptr::null_mut() {
3391                _gl_impl_panic("glDrawBuffers");
3392                return;
3393            }
3394
3395            unsafe {
3396                let func: extern "system" fn(GLsizei, *const GLenum) = mem::transmute(self.glDrawBuffers);
3397                (func)(bufs.len() as GLsizei, bufs.as_ptr());
3398            }
3399        }
3400
3401        // FIXME: Does not verify buffer size -- unsafe!
3402        $( $opt )? fn tex_image_2d(
3403            &self,
3404            target: GLenum,
3405            level: GLint,
3406            internal_format: GLint,
3407            width: GLsizei,
3408            height: GLsizei,
3409            border: GLint,
3410            format: GLenum,
3411            ty: GLenum,
3412            opt_data: Option<&[u8]>,
3413        ) {
3414
3415            #[cfg(feature = "debug")] { _gl_print_debug("glTexImage2D"); }
3416            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3417
3418            if self.glTexImage2D == ptr::null_mut() {
3419                _gl_impl_panic("glTexImage2D");
3420                return;
3421            }
3422
3423            unsafe {
3424                let func: extern "system" fn(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, *const GLvoid) = mem::transmute(self.glTexImage2D);
3425
3426                match opt_data {
3427                    Some(data) => {
3428                        (func)(
3429                            target,
3430                            level,
3431                            internal_format,
3432                            width,
3433                            height,
3434                            border,
3435                            format,
3436                            ty,
3437                            data.as_ptr() as *const GLvoid,
3438                        );
3439                    },
3440                    None => {
3441                        (func)(
3442                            target,
3443                            level,
3444                            internal_format,
3445                            width,
3446                            height,
3447                            border,
3448                            format,
3449                            ty,
3450                            ptr::null(),
3451                        );
3452                    },
3453                }
3454            }
3455        }
3456
3457        $( $opt )? fn compressed_tex_image_2d(
3458            &self,
3459            target: GLenum,
3460            level: GLint,
3461            internal_format: GLenum,
3462            width: GLsizei,
3463            height: GLsizei,
3464            border: GLint,
3465            data: &[u8],
3466        ) {
3467
3468
3469            #[cfg(feature = "debug")] { _gl_print_debug("glCompressedTexImage2D"); }
3470            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3471
3472            if self.glCompressedTexImage2D == ptr::null_mut() {
3473                _gl_impl_panic("glCompressedTexImage2D");
3474                return;
3475            }
3476
3477            unsafe {
3478                let func: extern "system" fn(GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, *const GLvoid) = mem::transmute(self.glCompressedTexImage2D);
3479                (func)(
3480                    target,
3481                    level,
3482                    internal_format,
3483                    width,
3484                    height,
3485                    border,
3486                    data.len() as GLsizei,
3487                    data.as_ptr() as *const GLvoid,
3488                );
3489            }
3490        }
3491
3492        $( $opt )? fn compressed_tex_sub_image_2d(
3493            &self,
3494            target: GLenum,
3495            level: GLint,
3496            xoffset: GLint,
3497            yoffset: GLint,
3498            width: GLsizei,
3499            height: GLsizei,
3500            format: GLenum,
3501            data: &[u8],
3502        ) {
3503
3504            #[cfg(feature = "debug")] { _gl_print_debug("glCompressedTexSubImage2D"); }
3505            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3506
3507            if self.glCompressedTexSubImage2D == ptr::null_mut() {
3508                _gl_impl_panic("glCompressedTexSubImage2D");
3509                return;
3510            }
3511
3512            unsafe {
3513                let func: extern "system" fn(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, *const GLvoid) = mem::transmute(self.glCompressedTexSubImage2D);
3514                (func)(
3515                    target,
3516                    level,
3517                    xoffset,
3518                    yoffset,
3519                    width,
3520                    height,
3521                    format,
3522                    data.len() as GLsizei,
3523                    data.as_ptr() as *const GLvoid,
3524                );
3525            }
3526        }
3527
3528        // FIXME: Does not verify buffer size -- unsafe!
3529        $( $opt )? fn tex_image_3d(
3530            &self,
3531            target: GLenum,
3532            level: GLint,
3533            internal_format: GLint,
3534            width: GLsizei,
3535            height: GLsizei,
3536            depth: GLsizei,
3537            border: GLint,
3538            format: GLenum,
3539            ty: GLenum,
3540            opt_data: Option<&[u8]>,
3541        ) {
3542
3543            #[cfg(feature = "debug")] { _gl_print_debug("glTexImage3D"); }
3544            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3545
3546            if self.glTexImage3D == ptr::null_mut() {
3547                _gl_impl_panic("glTexImage3D");
3548                return;
3549            }
3550
3551            unsafe {
3552                let pdata = match opt_data {
3553                    Some(data) => mem::transmute(data.as_ptr()),
3554                    None => ptr::null(),
3555                };
3556                let func: extern "system" fn(GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, *const GLvoid) = mem::transmute(self.glTexImage3D);
3557                (func)(
3558                    target,
3559                    level,
3560                    internal_format,
3561                    width,
3562                    height,
3563                    depth,
3564                    border,
3565                    format,
3566                    ty,
3567                    pdata,
3568                );
3569            }
3570        }
3571
3572        $( $opt )? fn copy_tex_image_2d(
3573            &self,
3574            target: GLenum,
3575            level: GLint,
3576            internal_format: GLenum,
3577            x: GLint,
3578            y: GLint,
3579            width: GLsizei,
3580            height: GLsizei,
3581            border: GLint,
3582        ) {
3583
3584            #[cfg(feature = "debug")] { _gl_print_debug("glCopyTexImage2D"); }
3585            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3586
3587            if self.glCopyTexImage2D == ptr::null_mut() {
3588                _gl_impl_panic("glCopyTexImage2D");
3589                return;
3590            }
3591
3592            unsafe {
3593                let func: extern "system" fn(GLenum,GLint,GLenum,GLint,GLint,GLsizei,GLsizei,GLint) = mem::transmute(self.glCopyTexImage2D);
3594                (func)(
3595                    target,
3596                    level,
3597                    internal_format,
3598                    x,
3599                    y,
3600                    width,
3601                    height,
3602                    border,
3603                );
3604            }
3605        }
3606
3607        $( $opt )? fn copy_tex_sub_image_2d(
3608            &self,
3609            target: GLenum,
3610            level: GLint,
3611            xoffset: GLint,
3612            yoffset: GLint,
3613            x: GLint,
3614            y: GLint,
3615            width: GLsizei,
3616            height: GLsizei,
3617        ) {
3618
3619            #[cfg(feature = "debug")] { _gl_print_debug("glCopyTexSubImage2D"); }
3620            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3621
3622            if self.glCopyTexSubImage2D == ptr::null_mut() {
3623                _gl_impl_panic("glCopyTexSubImage2D");
3624                return;
3625            }
3626
3627            unsafe {
3628                let func: extern "system" fn(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = mem::transmute(self.glCopyTexSubImage2D);
3629                (func)(target, level, xoffset, yoffset, x, y, width, height);
3630            }
3631        }
3632
3633        $( $opt )? fn copy_tex_sub_image_3d(
3634            &self,
3635            target: GLenum,
3636            level: GLint,
3637            xoffset: GLint,
3638            yoffset: GLint,
3639            zoffset: GLint,
3640            x: GLint,
3641            y: GLint,
3642            width: GLsizei,
3643            height: GLsizei,
3644        ) {
3645
3646            #[cfg(feature = "debug")] { _gl_print_debug("glCopyTexSubImage3D"); }
3647            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3648
3649            if self.glCopyTexSubImage3D == ptr::null_mut() {
3650                _gl_impl_panic("glCopyTexSubImage3D");
3651                return;
3652            }
3653
3654            unsafe {
3655                let func: extern "system" fn(GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = mem::transmute(self.glCopyTexSubImage3D);
3656                (func)(
3657                    target, level, xoffset, yoffset, zoffset, x, y, width, height,
3658                );
3659            }
3660        }
3661
3662        $( $opt )? fn tex_sub_image_2d(
3663            &self,
3664            target: GLenum,
3665            level: GLint,
3666            xoffset: GLint,
3667            yoffset: GLint,
3668            width: GLsizei,
3669            height: GLsizei,
3670            format: GLenum,
3671            ty: GLenum,
3672            data: &[u8],
3673        ) {
3674
3675            #[cfg(feature = "debug")] { _gl_print_debug("glTexSubImage2D"); }
3676            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3677
3678            if self.glTexSubImage2D == ptr::null_mut() {
3679                _gl_impl_panic("glTexSubImage2D");
3680                return;
3681            }
3682
3683            unsafe {
3684                let func: extern "system" fn(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, *const c_void) = mem::transmute(self.glTexSubImage2D);
3685                (func)(
3686                    target,
3687                    level,
3688                    xoffset,
3689                    yoffset,
3690                    width,
3691                    height,
3692                    format,
3693                    ty,
3694                    data.as_ptr() as *const c_void,
3695                );
3696            }
3697        }
3698
3699        $( $opt )? fn tex_sub_image_2d_pbo(
3700            &self,
3701            target: GLenum,
3702            level: GLint,
3703            xoffset: GLint,
3704            yoffset: GLint,
3705            width: GLsizei,
3706            height: GLsizei,
3707            format: GLenum,
3708            ty: GLenum,
3709            offset: usize,
3710        ) {
3711
3712            #[cfg(feature = "debug")] { _gl_print_debug("glTexSubImage2D"); }
3713            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3714
3715            if self.glTexSubImage2D == ptr::null_mut() {
3716                _gl_impl_panic("glTexSubImage2D");
3717                return;
3718            }
3719
3720            unsafe {
3721                let func: extern "system" fn(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, *const c_void) = mem::transmute(self.glTexSubImage2D);
3722                (func)(
3723                    target,
3724                    level,
3725                    xoffset,
3726                    yoffset,
3727                    width,
3728                    height,
3729                    format,
3730                    ty,
3731                    offset as *const c_void,
3732                );
3733            }
3734        }
3735
3736        $( $opt )? fn tex_sub_image_3d(
3737            &self,
3738            target: GLenum,
3739            level: GLint,
3740            xoffset: GLint,
3741            yoffset: GLint,
3742            zoffset: GLint,
3743            width: GLsizei,
3744            height: GLsizei,
3745            depth: GLsizei,
3746            format: GLenum,
3747            ty: GLenum,
3748            data: &[u8],
3749        ) {
3750
3751            #[cfg(feature = "debug")] { _gl_print_debug("glTexSubImage3D"); }
3752            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3753
3754            if self.glTexSubImage3D == ptr::null_mut() {
3755                _gl_impl_panic("glTexSubImage3D");
3756                return;
3757            }
3758
3759            unsafe {
3760                let func: extern "system" fn(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, *const c_void) = mem::transmute(self.glTexSubImage3D);
3761                (func)(
3762                    target,
3763                    level,
3764                    xoffset,
3765                    yoffset,
3766                    zoffset,
3767                    width,
3768                    height,
3769                    depth,
3770                    format,
3771                    ty,
3772                    data.as_ptr() as *const c_void,
3773                );
3774            }
3775        }
3776
3777        $( $opt )? fn tex_sub_image_3d_pbo(
3778            &self,
3779            target: GLenum,
3780            level: GLint,
3781            xoffset: GLint,
3782            yoffset: GLint,
3783            zoffset: GLint,
3784            width: GLsizei,
3785            height: GLsizei,
3786            depth: GLsizei,
3787            format: GLenum,
3788            ty: GLenum,
3789            offset: usize,
3790        ) {
3791
3792            #[cfg(feature = "debug")] { _gl_print_debug("glTexSubImage3D"); }
3793            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3794
3795            if self.glTexSubImage3D == ptr::null_mut() {
3796                _gl_impl_panic("glTexSubImage3D");
3797                return;
3798            }
3799
3800            unsafe {
3801                let func: extern "system" fn(GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, *const c_void) = mem::transmute(self.glTexSubImage3D);
3802                (func)(
3803                    target,
3804                    level,
3805                    xoffset,
3806                    yoffset,
3807                    zoffset,
3808                    width,
3809                    height,
3810                    depth,
3811                    format,
3812                    ty,
3813                    offset as *const c_void,
3814                );
3815            }
3816        }
3817
3818        $( $opt )? fn tex_storage_2d(
3819            &self,
3820            target: GLenum,
3821            levels: GLint,
3822            internal_format: GLenum,
3823            width: GLsizei,
3824            height: GLsizei,
3825        ) {
3826
3827            #[cfg(feature = "debug")] { _gl_print_debug("glTexStorage2D"); }
3828            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3829
3830            if self.glTexStorage2D == ptr::null_mut() {
3831                _gl_impl_panic("glTexStorage2D");
3832                return;
3833            }
3834
3835            unsafe {
3836                let func: extern "system" fn(GLenum, GLsizei, GLenum, GLsizei, GLsizei) = mem::transmute(self.glTexStorage2D);
3837                (func)(target, levels, internal_format, width, height);
3838            }
3839        }
3840
3841        $( $opt )? fn tex_storage_3d(
3842            &self,
3843            target: GLenum,
3844            levels: GLint,
3845            internal_format: GLenum,
3846            width: GLsizei,
3847            height: GLsizei,
3848            depth: GLsizei,
3849        ) {
3850
3851            #[cfg(feature = "debug")] { _gl_print_debug("glTexStorage3D"); }
3852            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3853
3854            if self.glTexStorage3D == ptr::null_mut() {
3855                _gl_impl_panic("glTexStorage3D");
3856                return;
3857            }
3858
3859            unsafe {
3860                let func: extern "system" fn(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei) = mem::transmute(self.glTexStorage3D);
3861                (func)(target, levels, internal_format, width, height, depth);
3862            }
3863        }
3864
3865        $( $opt )? fn get_tex_image_into_buffer(
3866            &self,
3867            target: GLenum,
3868            level: GLint,
3869            format: GLenum,
3870            ty: GLenum,
3871            output: &mut [u8],
3872        ) {
3873
3874            #[cfg(feature = "debug")] { _gl_print_debug("glGetTexImage"); }
3875            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3876
3877            if self.glGetTexImage == ptr::null_mut() {
3878                _gl_impl_panic("glGetTexImage");
3879                return;
3880            }
3881
3882            unsafe {
3883                let func: extern "system" fn(GLenum, GLint, GLenum, GLenum, *mut GLvoid) = mem::transmute(self.glGetTexImage);
3884                (func)(target, level, format, ty, output.as_mut_ptr() as *mut _);
3885            }
3886        }
3887
3888        $( $opt )? unsafe fn copy_image_sub_data(
3889            &self,
3890            src_name: GLuint,
3891            src_target: GLenum,
3892            src_level: GLint,
3893            src_x: GLint,
3894            src_y: GLint,
3895            src_z: GLint,
3896            dst_name: GLuint,
3897            dst_target: GLenum,
3898            dst_level: GLint,
3899            dst_x: GLint,
3900            dst_y: GLint,
3901            dst_z: GLint,
3902            src_width: GLsizei,
3903            src_height: GLsizei,
3904            src_depth: GLsizei,
3905        ) {
3906
3907            #[cfg(feature = "debug")] { _gl_print_debug("glCopyImageSubData"); }
3908            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3909
3910            if self.glCopyImageSubData == ptr::null_mut() {
3911                _gl_impl_panic("glCopyImageSubData");
3912                return;
3913            }
3914
3915            let func: extern "system" fn(GLuint, GLenum, GLint, GLint, GLint, GLint, GLuint, GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei) = mem::transmute(self.glCopyImageSubData);
3916            (func)(
3917                src_name, src_target, src_level, src_x, src_y, src_z, dst_name, dst_target, dst_level,
3918                dst_x, dst_y, dst_z, src_width, src_height, src_depth,
3919            );
3920        }
3921
3922        $( $opt )? fn invalidate_framebuffer(&self, target: GLenum, attachments: &[GLenum]) {
3923
3924
3925            #[cfg(feature = "debug")] { _gl_print_debug("glInvalidateFramebuffer"); }
3926            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3927
3928            if self.glInvalidateFramebuffer == ptr::null_mut() {
3929                _gl_impl_panic("glInvalidateFramebuffer");
3930                return;
3931            }
3932
3933            unsafe {
3934                let func: extern "system" fn(GLenum, GLsizei, *const GLenum) = mem::transmute(self.glInvalidateFramebuffer);
3935                (func)(
3936                    target,
3937                    attachments.len() as GLsizei,
3938                    attachments.as_ptr(),
3939                );
3940            }
3941        }
3942
3943        $( $opt )? fn invalidate_sub_framebuffer(
3944            &self,
3945            target: GLenum,
3946            attachments: &[GLenum],
3947            xoffset: GLint,
3948            yoffset: GLint,
3949            width: GLsizei,
3950            height: GLsizei,
3951        ) {
3952
3953
3954            #[cfg(feature = "debug")] { _gl_print_debug("glInvalidateSubFramebuffer"); }
3955            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3956
3957            if self.glInvalidateSubFramebuffer == ptr::null_mut() {
3958                _gl_impl_panic("glInvalidateSubFramebuffer");
3959                return;
3960            }
3961
3962            unsafe {
3963                let func: extern "system" fn(GLenum, GLsizei, *const GLenum, GLint, GLint, GLsizei, GLsizei) = mem::transmute(self.glInvalidateSubFramebuffer);
3964                (func)(
3965                    target,
3966                    attachments.len() as GLsizei,
3967                    attachments.as_ptr(),
3968                    xoffset,
3969                    yoffset,
3970                    width,
3971                    height,
3972                );
3973            }
3974        }
3975
3976        $( $opt )? unsafe fn get_integer_v(&self, name: GLenum, result: &mut [GLint]) {
3977
3978            #[cfg(feature = "debug")] { _gl_print_debug("glGetIntegerv"); }
3979            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3980
3981            if self.glGetIntegerv == ptr::null_mut() {
3982                _gl_impl_panic("glGetIntegerv");
3983                return;
3984            }
3985
3986            let func: extern "system" fn(GLenum, *mut GLint) = mem::transmute(self.glGetIntegerv);
3987            (func)(name, result.as_mut_ptr());
3988        }
3989
3990        $( $opt )? unsafe fn get_integer_64v(&self, name: GLenum, result: &mut [GLint64]) {
3991
3992            #[cfg(feature = "debug")] { _gl_print_debug("glGetInteger64v"); }
3993            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
3994
3995            if self.glGetInteger64v == ptr::null_mut() {
3996                _gl_impl_panic("glGetInteger64v");
3997                return;
3998            }
3999            let func: extern "system" fn(GLenum, *mut GLint64) = mem::transmute(self.glGetInteger64v);
4000            (func)(name, result.as_mut_ptr());
4001        }
4002
4003        $( $opt )? unsafe fn get_integer_iv(&self, name: GLenum, index: GLuint, result: &mut [GLint]) {
4004
4005            #[cfg(feature = "debug")] { _gl_print_debug("glGetIntegeri_v"); }
4006            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4007
4008            if self.glGetIntegeri_v == ptr::null_mut() {
4009                _gl_impl_panic("glGetIntegeri_v");
4010                return;
4011            }
4012            let func: extern "system" fn(GLenum, GLuint, *mut GLint) = mem::transmute(self.glGetIntegeri_v);
4013            (func)(name, index, result.as_mut_ptr());
4014        }
4015
4016        #[inline]
4017        $( $opt )? unsafe fn get_integer_64iv(&self, name: GLenum, index: GLuint, result: &mut [GLint64]) {
4018
4019            #[cfg(feature = "debug")] { _gl_print_debug("glGetInteger64i_v"); }
4020            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4021
4022            if self.glGetInteger64i_v == ptr::null_mut() {
4023                _gl_impl_panic("glGetInteger64i_v");
4024                return;
4025            }
4026            let func: extern "system" fn(GLenum, GLuint, *mut GLint64) = mem::transmute(self.glGetInteger64i_v);
4027            (func)(name, index, result.as_mut_ptr());
4028        }
4029
4030        #[inline]
4031        $( $opt )? unsafe fn get_boolean_v(&self, name: GLenum, result: &mut [GLboolean]) {
4032
4033            #[cfg(feature = "debug")] { _gl_print_debug("glGetBooleanv"); }
4034            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4035
4036            if self.glGetBooleanv == ptr::null_mut() {
4037                _gl_impl_panic("glGetBooleanv");
4038                return;
4039            }
4040            let func: extern "system" fn(GLenum, *mut GLboolean) = mem::transmute(self.glGetBooleanv);
4041            (func)(name, result.as_mut_ptr());
4042        }
4043
4044        #[inline]
4045        $( $opt )? unsafe fn get_float_v(&self, name: GLenum, result: &mut [GLfloat]) {
4046
4047            #[cfg(feature = "debug")] { _gl_print_debug("glGetFloatv"); }
4048            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4049
4050            if self.glGetFloatv == ptr::null_mut() {
4051                _gl_impl_panic("glGetFloatv");
4052                return;
4053            }
4054            let func: extern "system" fn(GLenum, *mut GLfloat) = mem::transmute(self.glGetFloatv);
4055            (func)(name, result.as_mut_ptr());
4056        }
4057
4058        $( $opt )? fn get_framebuffer_attachment_parameter_iv(
4059            &self,
4060            target: GLenum,
4061            attachment: GLenum,
4062            pname: GLenum,
4063        ) -> GLint {
4064
4065            #[cfg(feature = "debug")] { _gl_print_debug("glGetFramebufferAttachmentParameteriv"); }
4066            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4067
4068            if self.glGetFramebufferAttachmentParameteriv == ptr::null_mut() {
4069                _gl_impl_panic("glGetFramebufferAttachmentParameteriv");
4070                return 0;
4071            }
4072            let mut result: GLint = 0;
4073            unsafe {
4074                let func: extern "system" fn(GLenum, GLenum, GLenum, *mut GLint) = mem::transmute(self.glGetFramebufferAttachmentParameteriv);
4075                (func)(
4076                    target,
4077                    attachment,
4078                    pname,
4079                    &mut result,
4080                );
4081            }
4082            result
4083        }
4084
4085        $( $opt )? fn get_renderbuffer_parameter_iv(&self, target: GLenum, pname: GLenum) -> GLint {
4086
4087            #[cfg(feature = "debug")] { _gl_print_debug("glGetRenderbufferParameteriv"); }
4088            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4089
4090            if self.glGetRenderbufferParameteriv == ptr::null_mut() {
4091                _gl_impl_panic("glGetRenderbufferParameteriv");
4092                return 0;
4093            }
4094
4095            let mut result: GLint = 0;
4096            unsafe {
4097                let func: extern "system" fn(GLenum, GLenum, *mut GLint) = mem::transmute(self.glGetRenderbufferParameteriv);
4098                (func)(target, pname, &mut result);
4099            }
4100            result
4101        }
4102
4103        $( $opt )? fn get_tex_parameter_iv(&self, target: GLenum, pname: GLenum) -> GLint {
4104
4105
4106            #[cfg(feature = "debug")] { _gl_print_debug("glGetTexParameteriv"); }
4107            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4108
4109            if self.glGetTexParameteriv == ptr::null_mut() {
4110                _gl_impl_panic("glGetTexParameteriv");
4111                return 0;
4112            }
4113
4114            let mut result: GLint = 0;
4115            unsafe {
4116                let func: extern "system" fn(GLenum, GLenum, *mut GLint) = mem::transmute(self.glGetTexParameteriv);
4117                (func)(target, pname, &mut result);
4118            }
4119            result
4120        }
4121
4122        $( $opt )? fn get_tex_parameter_fv(&self, target: GLenum, pname: GLenum) -> GLfloat {
4123
4124
4125            #[cfg(feature = "debug")] { _gl_print_debug("glGetTexParameterfv"); }
4126            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4127
4128            if self.glGetTexParameterfv == ptr::null_mut() {
4129                _gl_impl_panic("glGetTexParameterfv");
4130                return 0.0;
4131            }
4132
4133            let mut result: GLfloat = 0.0;
4134            unsafe {
4135                let func: extern "system" fn(GLenum, GLenum, *mut GLfloat) = mem::transmute(self.glGetTexParameterfv);
4136                (func)(target, pname, &mut result);
4137            }
4138            result
4139        }
4140
4141        $( $opt )? fn tex_parameter_i(&self, target: GLenum, pname: GLenum, param: GLint) {
4142
4143
4144            #[cfg(feature = "debug")] { _gl_print_debug("glTexParameteri"); }
4145            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4146
4147            if self.glTexParameteri == ptr::null_mut() {
4148                _gl_impl_panic("glTexParameteri");
4149                return;
4150            }
4151
4152            unsafe {
4153                let func: extern "system" fn(GLenum, GLenum, GLint) = mem::transmute(self.glTexParameteri);
4154                (func)(target, pname, param);
4155            }
4156        }
4157
4158        $( $opt )? fn tex_parameter_f(&self, target: GLenum, pname: GLenum, param: GLfloat) {
4159
4160
4161            #[cfg(feature = "debug")] { _gl_print_debug("glTexParameterf"); }
4162            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4163
4164            if self.glTexParameterf == ptr::null_mut() {
4165                _gl_impl_panic("glTexParameterf");
4166                return;
4167            }
4168
4169            unsafe {
4170                let func: extern "system" fn(GLenum, GLenum, GLfloat) = mem::transmute(self.glTexParameterf);
4171                (func)(target, pname, param);
4172            }
4173        }
4174
4175        $( $opt )? fn framebuffer_texture_2d(
4176            &self,
4177            target: GLenum,
4178            attachment: GLenum,
4179            textarget: GLenum,
4180            texture: GLuint,
4181            level: GLint,
4182        ) {
4183
4184
4185            #[cfg(feature = "debug")] { _gl_print_debug("glFramebufferTexture2D"); }
4186            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4187
4188            if self.glFramebufferTexture2D == ptr::null_mut() {
4189                _gl_impl_panic("glFramebufferTexture2D");
4190                return;
4191            }
4192
4193            unsafe {
4194                let func: extern "system" fn(GLenum, GLenum, GLenum, GLuint, GLint) = mem::transmute(self.glFramebufferTexture2D);
4195                (func)(target, attachment, textarget, texture, level);
4196            }
4197        }
4198
4199        $( $opt )? fn framebuffer_texture_layer(
4200            &self,
4201            target: GLenum,
4202            attachment: GLenum,
4203            texture: GLuint,
4204            level: GLint,
4205            layer: GLint,
4206        ) {
4207
4208            #[cfg(feature = "debug")] { _gl_print_debug("glFramebufferTextureLayer"); }
4209            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4210
4211            if self.glFramebufferTextureLayer == ptr::null_mut() {
4212                _gl_impl_panic("glFramebufferTextureLayer");
4213                return;
4214            }
4215
4216            unsafe {
4217                let func: extern "system" fn(GLenum, GLenum, GLuint, GLint, GLint) = mem::transmute(self.glFramebufferTextureLayer);
4218                (func)(target, attachment, texture, level, layer);
4219            }
4220        }
4221
4222        $( $opt )? fn blit_framebuffer(
4223            &self,
4224            src_x0: GLint,
4225            src_y0: GLint,
4226            src_x1: GLint,
4227            src_y1: GLint,
4228            dst_x0: GLint,
4229            dst_y0: GLint,
4230            dst_x1: GLint,
4231            dst_y1: GLint,
4232            mask: GLbitfield,
4233            filter: GLenum,
4234        ) {
4235
4236            #[cfg(feature = "debug")] { _gl_print_debug("glBlitFramebuffer"); }
4237            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4238
4239            if self.glBlitFramebuffer == ptr::null_mut() {
4240                _gl_impl_panic("glBlitFramebuffer");
4241                return;
4242            }
4243
4244            unsafe {
4245                let func: extern "system" fn(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum) = mem::transmute(self.glBlitFramebuffer);
4246                (func)(
4247                    src_x0, src_y0, src_x1, src_y1, dst_x0, dst_y0, dst_x1, dst_y1, mask, filter,
4248                );
4249            }
4250        }
4251
4252        $( $opt )? fn vertex_attrib_4f(&self, index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) {
4253
4254            #[cfg(feature = "debug")] { _gl_print_debug("glVertexAttrib4f"); }
4255            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4256
4257            if self.glVertexAttrib4f == ptr::null_mut() {
4258                _gl_impl_panic("glVertexAttrib4f");
4259                return;
4260            }
4261
4262            unsafe {
4263                let func: extern "system" fn(GLuint, GLfloat, GLfloat, GLfloat, GLfloat) = mem::transmute(self.glVertexAttrib4f);
4264                (func)(index, x, y, z, w)
4265            }
4266        }
4267
4268        $( $opt )? fn vertex_attrib_pointer_f32(
4269            &self,
4270            index: GLuint,
4271            size: GLint,
4272            normalized: bool,
4273            stride: GLsizei,
4274            offset: GLuint,
4275        ) {
4276
4277            #[cfg(feature = "debug")] { _gl_print_debug("glVertexAttribPointer"); }
4278            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4279
4280            if self.glVertexAttribPointer == ptr::null_mut() {
4281                _gl_impl_panic("glVertexAttribPointer");
4282                return;
4283            }
4284
4285            unsafe {
4286                let func: extern "system" fn(GLuint, GLint, GLenum, GLboolean, GLsizei, *const GLvoid) = mem::transmute(self.glVertexAttribPointer);
4287                (func)(
4288                    index,
4289                    size,
4290                    gl::FLOAT,
4291                    normalized as GLboolean,
4292                    stride,
4293                    offset as *const GLvoid,
4294                )
4295            }
4296        }
4297
4298        $( $opt )? fn vertex_attrib_pointer(
4299            &self,
4300            index: GLuint,
4301            size: GLint,
4302            type_: GLenum,
4303            normalized: bool,
4304            stride: GLsizei,
4305            offset: GLuint,
4306        ) {
4307
4308            #[cfg(feature = "debug")] { _gl_print_debug("glVertexAttribPointer"); }
4309            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4310
4311            if self.glVertexAttribPointer == ptr::null_mut() {
4312                _gl_impl_panic("glVertexAttribPointer");
4313                return;
4314            }
4315
4316            unsafe {
4317                let func: extern "system" fn(GLuint, GLint, GLenum, GLboolean, GLsizei, *const GLvoid) = mem::transmute(self.glVertexAttribPointer);
4318                (func)(
4319                    index,
4320                    size,
4321                    type_,
4322                    normalized as GLboolean,
4323                    stride,
4324                    offset as *const GLvoid,
4325                )
4326            }
4327        }
4328
4329        $( $opt )? fn vertex_attrib_i_pointer(
4330            &self,
4331            index: GLuint,
4332            size: GLint,
4333            type_: GLenum,
4334            stride: GLsizei,
4335            offset: GLuint,
4336        ) {
4337
4338            #[cfg(feature = "debug")] { _gl_print_debug("glVertexAttribIPointer"); }
4339            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4340
4341            if self.glVertexAttribIPointer == ptr::null_mut() {
4342                _gl_impl_panic("glVertexAttribIPointer");
4343                return;
4344            }
4345
4346            unsafe {
4347                let func: extern "system" fn(GLuint, GLint, GLenum, GLsizei, *const GLvoid) = mem::transmute(self.glVertexAttribIPointer);
4348                (func)(index, size, type_, stride, offset as *const GLvoid)
4349            }
4350        }
4351
4352        $( $opt )? fn vertex_attrib_divisor(&self, index: GLuint, divisor: GLuint) {
4353
4354
4355            #[cfg(feature = "debug")] { _gl_print_debug("glVertexAttribDivisor"); }
4356            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4357
4358            if self.glVertexAttribDivisor == ptr::null_mut() {
4359                _gl_impl_panic("glVertexAttribDivisor");
4360                return;
4361            }
4362
4363            unsafe {
4364                let func: extern "system" fn(GLuint, GLuint) = mem::transmute(self.glVertexAttribDivisor);
4365                (func)(index, divisor)
4366            }
4367        }
4368
4369        $( $opt )? fn viewport(&self, x: GLint, y: GLint, width: GLsizei, height: GLsizei) {
4370
4371
4372            #[cfg(feature = "debug")] { _gl_print_debug("glViewport"); }
4373            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4374
4375            if self.glViewport == ptr::null_mut() {
4376                _gl_impl_panic("glViewport");
4377                return;
4378            }
4379
4380            unsafe {
4381                let func: extern "system" fn(GLint, GLint, GLsizei, GLsizei) = mem::transmute(self.glViewport);
4382                (func)(x, y, width, height);
4383            }
4384        }
4385
4386        $( $opt )? fn scissor(&self, x: GLint, y: GLint, width: GLsizei, height: GLsizei) {
4387
4388
4389            #[cfg(feature = "debug")] { _gl_print_debug("glScissor"); }
4390            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4391
4392            if self.glScissor == ptr::null_mut() {
4393                _gl_impl_panic("glScissor");
4394                return;
4395            }
4396
4397            unsafe {
4398                let func: extern "system" fn(GLint, GLint, GLsizei, GLsizei) = mem::transmute(self.glScissor);
4399                (func)(x, y, width, height);
4400            }
4401        }
4402
4403        $( $opt )? fn line_width(&self, width: GLfloat) {
4404
4405
4406            #[cfg(feature = "debug")] { _gl_print_debug("glLineWidth"); }
4407            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4408
4409            if self.glLineWidth == ptr::null_mut() {
4410                _gl_impl_panic("glLineWidth");
4411                return;
4412            }
4413
4414            unsafe {
4415                let func: extern "system" fn(GLfloat) = mem::transmute(self.glLineWidth);
4416                (func)(width);
4417            }
4418        }
4419
4420        $( $opt )? fn use_program(&self, program: GLuint) {
4421
4422
4423            #[cfg(feature = "debug")] { _gl_print_debug("glUseProgram"); }
4424            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4425
4426            if self.glUseProgram == ptr::null_mut() {
4427                _gl_impl_panic("glUseProgram");
4428                return;
4429            }
4430
4431            unsafe {
4432                let func: extern "system" fn(GLuint) = mem::transmute(self.glUseProgram);
4433                (func)(program);
4434            }
4435        }
4436
4437        $( $opt )? fn validate_program(&self, program: GLuint) {
4438
4439
4440            #[cfg(feature = "debug")] { _gl_print_debug("glValidateProgram"); }
4441            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4442
4443            if self.glValidateProgram == ptr::null_mut() {
4444                _gl_impl_panic("glValidateProgram");
4445                return;
4446            }
4447
4448            unsafe {
4449                let func: extern "system" fn(GLuint) = mem::transmute(self.glValidateProgram);
4450                (func)(program);
4451            }
4452        }
4453
4454        $( $opt )? fn draw_arrays(&self, mode: GLenum, first: GLint, count: GLsizei) {
4455
4456
4457            #[cfg(feature = "debug")] { _gl_print_debug("glDrawArrays"); }
4458            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4459
4460            if self.glDrawArrays == ptr::null_mut() {
4461                _gl_impl_panic("glDrawArrays");
4462                return;
4463            }
4464
4465            unsafe {
4466                let func: extern "system" fn(GLenum, GLint, GLsizei) = mem::transmute(self.glDrawArrays);
4467                return (func)(mode, first, count);
4468            }
4469        }
4470
4471        $( $opt )? fn draw_arrays_instanced(
4472            &self,
4473            mode: GLenum,
4474            first: GLint,
4475            count: GLsizei,
4476            primcount: GLsizei,
4477        ) {
4478
4479
4480            #[cfg(feature = "debug")] { _gl_print_debug("glDrawArraysInstanced"); }
4481            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4482
4483            if self.glDrawArraysInstanced == ptr::null_mut() {
4484                _gl_impl_panic("glDrawArraysInstanced");
4485                return;
4486            }
4487
4488            unsafe {
4489                let func: extern "system" fn(GLenum,GLint,GLsizei,GLsizei) = mem::transmute(self.glDrawArraysInstanced);
4490                return (func)(mode, first, count, primcount);
4491            }
4492        }
4493
4494        $( $opt )? fn draw_elements(
4495            &self,
4496            mode: GLenum,
4497            count: GLsizei,
4498            element_type: GLenum,
4499            indices_offset: GLuint,
4500        ) {
4501
4502            #[cfg(feature = "debug")] { _gl_print_debug("glDrawElements"); }
4503            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4504
4505            if self.glDrawElements == ptr::null_mut() {
4506                _gl_impl_panic("glDrawElements");
4507                return;
4508            }
4509
4510            unsafe {
4511                let func: extern "system" fn(GLenum, GLsizei, GLenum, *const c_void) = mem::transmute(self.glDrawElements);
4512                return (func)(
4513                    mode,
4514                    count,
4515                    element_type,
4516                    indices_offset as *const c_void,
4517                );
4518            }
4519        }
4520
4521        $( $opt )? fn draw_elements_instanced(
4522            &self,
4523            mode: GLenum,
4524            count: GLsizei,
4525            element_type: GLenum,
4526            indices_offset: GLuint,
4527            primcount: GLsizei,
4528        ) {
4529
4530            #[cfg(feature = "debug")] { _gl_print_debug("glDrawElementsInstanced"); }
4531            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4532
4533            if self.glDrawElementsInstanced == ptr::null_mut() {
4534                _gl_impl_panic("glDrawElementsInstanced");
4535                return;
4536            }
4537
4538            unsafe {
4539                let func: extern "system" fn(GLenum, GLsizei, GLenum, *const c_void, GLsizei) = mem::transmute(self.glDrawElementsInstanced);
4540                return (func)(
4541                    mode,
4542                    count,
4543                    element_type,
4544                    indices_offset as *const c_void,
4545                    primcount,
4546                );
4547            }
4548        }
4549
4550        $( $opt )? fn blend_color(&self, r: f32, g: f32, b: f32, a: f32) {
4551
4552
4553            #[cfg(feature = "debug")] { _gl_print_debug("glBlendColor"); }
4554            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4555
4556            if self.glBlendColor == ptr::null_mut() {
4557                _gl_impl_panic("glBlendColor");
4558                return;
4559            }
4560
4561            unsafe {
4562                let func: extern "system" fn(GLclampf, GLclampf, GLclampf, GLclampf) = mem::transmute(self.glBlendColor);
4563                (func)(r, g, b, a);
4564            }
4565        }
4566
4567        $( $opt )? fn blend_func(&self, sfactor: GLenum, dfactor: GLenum) {
4568
4569
4570            #[cfg(feature = "debug")] { _gl_print_debug("glBlendFunc"); }
4571            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4572
4573            if self.glBlendFunc == ptr::null_mut() {
4574                _gl_impl_panic("glBlendFunc");
4575                return;
4576            }
4577
4578            unsafe {
4579                let func: extern "system" fn(GLenum, GLenum) = mem::transmute(self.glBlendFunc);
4580                (func)(sfactor, dfactor);
4581            }
4582        }
4583
4584        $( $opt )? fn blend_func_separate(
4585            &self,
4586            src_rgb: GLenum,
4587            dest_rgb: GLenum,
4588            src_alpha: GLenum,
4589            dest_alpha: GLenum,
4590        ) {
4591
4592            #[cfg(feature = "debug")] { _gl_print_debug("glBlendFuncSeparate"); }
4593            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4594
4595            if self.glBlendFuncSeparate == ptr::null_mut() {
4596                _gl_impl_panic("glBlendFuncSeparate");
4597                return;
4598            }
4599
4600            unsafe {
4601                let func: extern "system" fn(GLenum, GLenum, GLenum, GLenum) = mem::transmute(self.glBlendFuncSeparate);
4602                (func)(src_rgb, dest_rgb, src_alpha, dest_alpha);
4603            }
4604        }
4605
4606        $( $opt )? fn blend_equation(&self, mode: GLenum) {
4607
4608
4609            #[cfg(feature = "debug")] { _gl_print_debug("glBlendEquation"); }
4610            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4611
4612            if self.glBlendEquation == ptr::null_mut() {
4613                _gl_impl_panic("glBlendEquation");
4614                return;
4615            }
4616
4617            unsafe {
4618                let func: extern "system" fn(GLenum) = mem::transmute(self.glBlendEquation);
4619                (func)(mode);
4620            }
4621        }
4622
4623        $( $opt )? fn blend_equation_separate(&self, mode_rgb: GLenum, mode_alpha: GLenum) {
4624
4625
4626            #[cfg(feature = "debug")] { _gl_print_debug("glBlendEquationSeparate"); }
4627            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4628
4629            if self.glBlendEquationSeparate == ptr::null_mut() {
4630                _gl_impl_panic("glBlendEquationSeparate");
4631                return;
4632            }
4633
4634            unsafe {
4635                let func: extern "system" fn(GLenum, GLenum) = mem::transmute(self.glBlendEquationSeparate);
4636                (func)(mode_rgb, mode_alpha);
4637            }
4638        }
4639
4640        $( $opt )? fn color_mask(&self, r: bool, g: bool, b: bool, a: bool) {
4641
4642
4643            #[cfg(feature = "debug")] { _gl_print_debug("glColorMask"); }
4644            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4645
4646            if self.glColorMask == ptr::null_mut() {
4647                _gl_impl_panic("glColorMask");
4648                return;
4649            }
4650
4651            unsafe {
4652                let func: extern "system" fn(GLboolean, GLboolean, GLboolean, GLboolean) = mem::transmute(self.glColorMask);
4653                (func)(
4654                    r as GLboolean,
4655                    g as GLboolean,
4656                    b as GLboolean,
4657                    a as GLboolean,
4658                );
4659            }
4660        }
4661
4662        $( $opt )? fn cull_face(&self, mode: GLenum) {
4663
4664
4665            #[cfg(feature = "debug")] { _gl_print_debug("glCullFace"); }
4666            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4667
4668            if self.glCullFace == ptr::null_mut() {
4669                _gl_impl_panic("glCullFace");
4670                return;
4671            }
4672
4673            unsafe {
4674                let func: extern "system" fn(GLenum) = mem::transmute(self.glCullFace);
4675                (func)(mode);
4676            }
4677        }
4678
4679        $( $opt )? fn front_face(&self, mode: GLenum) {
4680
4681
4682            #[cfg(feature = "debug")] { _gl_print_debug("glFrontFace"); }
4683            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4684
4685            if self.glFrontFace == ptr::null_mut() {
4686                _gl_impl_panic("glFrontFace");
4687                return;
4688            }
4689
4690            unsafe {
4691                let func: extern "system" fn(GLenum) = mem::transmute(self.glFrontFace);
4692                (func)(mode);
4693            }
4694        }
4695
4696        $( $opt )? fn enable(&self, cap: GLenum) {
4697
4698
4699            #[cfg(feature = "debug")] { _gl_print_debug("glEnable"); }
4700            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4701
4702            if self.glEnable == ptr::null_mut() {
4703                _gl_impl_panic("glEnable");
4704                return;
4705            }
4706
4707            unsafe {
4708                let func: extern "system" fn(GLenum) = mem::transmute(self.glEnable);
4709                (func)(cap);
4710            }
4711        }
4712
4713        $( $opt )? fn disable(&self, cap: GLenum) {
4714
4715
4716            #[cfg(feature = "debug")] { _gl_print_debug("glDisable"); }
4717            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4718
4719            if self.glDisable == ptr::null_mut() {
4720                _gl_impl_panic("glDisable");
4721                return;
4722            }
4723
4724            unsafe {
4725                let func: extern "system" fn(GLenum) = mem::transmute(self.glDisable);
4726                (func)(cap);
4727            }
4728        }
4729
4730        $( $opt )? fn hint(&self, param_name: GLenum, param_val: GLenum) {
4731
4732
4733            #[cfg(feature = "debug")] { _gl_print_debug("glHint"); }
4734            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4735
4736            if self.glHint == ptr::null_mut() {
4737                _gl_impl_panic("glHint");
4738                return;
4739            }
4740
4741            unsafe {
4742                let func: extern "system" fn(GLenum, GLenum) = mem::transmute(self.glHint);
4743                (func)(param_name, param_val);
4744            }
4745        }
4746
4747        $( $opt )? fn is_enabled(&self, cap: GLenum) -> GLboolean {
4748
4749
4750            #[cfg(feature = "debug")] { _gl_print_debug("glIsEnabled"); }
4751            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4752
4753            if self.glIsEnabled == ptr::null_mut() {
4754                _gl_impl_panic("glIsEnabled");
4755                return 0;
4756            }
4757
4758            unsafe {
4759                let func: extern "system" fn(GLenum) -> GLboolean = mem::transmute(self.glIsEnabled);
4760                (func)(cap)
4761            }
4762        }
4763
4764        $( $opt )? fn is_shader(&self, shader: GLuint) -> GLboolean {
4765
4766
4767            #[cfg(feature = "debug")] { _gl_print_debug("glIsShader"); }
4768            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4769
4770            if self.glIsShader == ptr::null_mut() {
4771                _gl_impl_panic("glIsShader");
4772                return 0;
4773            }
4774
4775            unsafe {
4776                let func: extern "system" fn(GLuint) -> GLboolean = mem::transmute(self.glIsShader);
4777                (func)(shader)
4778            }
4779        }
4780
4781        $( $opt )? fn is_texture(&self, texture: GLenum) -> GLboolean {
4782
4783
4784            #[cfg(feature = "debug")] { _gl_print_debug("glIsTexture"); }
4785            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4786
4787            if self.glIsTexture == ptr::null_mut() {
4788                _gl_impl_panic("glIsTexture");
4789                return 0;
4790            }
4791
4792            unsafe {
4793                let func: extern "system" fn(GLenum) -> GLboolean = mem::transmute(self.glIsTexture);
4794                (func)(texture)
4795            }
4796        }
4797
4798        $( $opt )? fn is_framebuffer(&self, framebuffer: GLenum) -> GLboolean {
4799
4800
4801            #[cfg(feature = "debug")] { _gl_print_debug("glIsFramebuffer"); }
4802            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4803
4804            if self.glIsFramebuffer == ptr::null_mut() {
4805                _gl_impl_panic("glIsFramebuffer");
4806                return 0;
4807            }
4808
4809            unsafe {
4810                let func: extern "system" fn(GLenum) -> GLboolean = mem::transmute(self.glIsFramebuffer);
4811                (func)(framebuffer)
4812            }
4813        }
4814
4815        $( $opt )? fn is_renderbuffer(&self, renderbuffer: GLenum) -> GLboolean {
4816
4817
4818            #[cfg(feature = "debug")] { _gl_print_debug("glIsRenderbuffer"); }
4819            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4820
4821            if self.glIsRenderbuffer == ptr::null_mut() {
4822                _gl_impl_panic("glIsRenderbuffer");
4823                return 0;
4824            }
4825
4826            unsafe {
4827                let func: extern "system" fn(GLenum) -> GLboolean = mem::transmute(self.glIsRenderbuffer);
4828                (func)(renderbuffer)
4829            }
4830        }
4831
4832        $( $opt )? fn check_frame_buffer_status(&self, target: GLenum) -> GLenum {
4833
4834
4835            #[cfg(feature = "debug")] { _gl_print_debug("glCheckFramebufferStatus"); }
4836            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4837
4838            if self.glCheckFramebufferStatus == ptr::null_mut() {
4839                _gl_impl_panic("glCheckFramebufferStatus");
4840                return 0;
4841            }
4842
4843            unsafe {
4844                let func: extern "system" fn(GLenum) -> GLenum = mem::transmute(self.glCheckFramebufferStatus);
4845                (func)(target)
4846            }
4847        }
4848
4849        $( $opt )? fn enable_vertex_attrib_array(&self, index: GLuint) {
4850
4851
4852            #[cfg(feature = "debug")] { _gl_print_debug("glEnableVertexAttribArray"); }
4853            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4854
4855            if self.glEnableVertexAttribArray == ptr::null_mut() {
4856                _gl_impl_panic("glEnableVertexAttribArray");
4857                return;
4858            }
4859
4860            unsafe {
4861                let func: extern "system" fn(GLuint) = mem::transmute(self.glEnableVertexAttribArray);
4862                (func)(index);
4863            }
4864        }
4865
4866        $( $opt )? fn disable_vertex_attrib_array(&self, index: GLuint) {
4867
4868
4869            #[cfg(feature = "debug")] { _gl_print_debug("glDisableVertexAttribArray"); }
4870            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4871
4872            if self.glDisableVertexAttribArray == ptr::null_mut() {
4873                _gl_impl_panic("glDisableVertexAttribArray");
4874                return;
4875            }
4876
4877            unsafe {
4878                let func: extern "system" fn(GLuint) = mem::transmute(self.glDisableVertexAttribArray);
4879                (func)(index);
4880            }
4881        }
4882
4883        $( $opt )? fn uniform_1f(&self, location: GLint, v0: GLfloat) {
4884
4885
4886            #[cfg(feature = "debug")] { _gl_print_debug("glUniform1f"); }
4887            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4888
4889            if self.glUniform1f == ptr::null_mut() {
4890                _gl_impl_panic("glUniform1f");
4891                return;
4892            }
4893
4894            unsafe {
4895                let func: extern "system" fn(GLint, GLfloat) = mem::transmute(self.glUniform1f);
4896                (func)(location, v0);
4897            }
4898        }
4899
4900        $( $opt )? fn uniform_1fv(&self, location: GLint, values: &[f32]) {
4901
4902
4903            #[cfg(feature = "debug")] { _gl_print_debug("glUniform1fv"); }
4904            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4905
4906            if self.glUniform1fv == ptr::null_mut() {
4907                _gl_impl_panic("glUniform1fv");
4908                return;
4909            }
4910
4911            unsafe {
4912                let func: extern "system" fn(GLint, GLsizei, *const GLfloat) = mem::transmute(self.glUniform1fv);
4913                (func)(location, values.len() as GLsizei, values.as_ptr());
4914            }
4915        }
4916
4917        $( $opt )? fn uniform_1i(&self, location: GLint, v0: GLint) {
4918
4919
4920            #[cfg(feature = "debug")] { _gl_print_debug("glUniform1i"); }
4921            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4922
4923            if self.glUniform1i == ptr::null_mut() {
4924                _gl_impl_panic("glUniform1i");
4925                return;
4926            }
4927
4928            unsafe {
4929                let func: extern "system" fn(GLint, GLint) = mem::transmute(self.glUniform1i);
4930                (func)(location, v0);
4931            }
4932        }
4933
4934        $( $opt )? fn uniform_1iv(&self, location: GLint, values: &[i32]) {
4935
4936
4937            #[cfg(feature = "debug")] { _gl_print_debug("glUniform1iv"); }
4938            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4939
4940            if self.glUniform1iv == ptr::null_mut() {
4941                _gl_impl_panic("glUniform1iv");
4942                return;
4943            }
4944
4945            unsafe {
4946                let func: extern "system" fn(GLint, GLsizei, *const GLint) = mem::transmute(self.glUniform1iv);
4947                (func)(location, values.len() as GLsizei, values.as_ptr());
4948            }
4949        }
4950
4951        $( $opt )? fn uniform_1ui(&self, location: GLint, v0: GLuint) {
4952
4953
4954            #[cfg(feature = "debug")] { _gl_print_debug("glUniform1ui"); }
4955            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4956
4957            if self.glUniform1ui == ptr::null_mut() {
4958                _gl_impl_panic("glUniform1ui");
4959                return;
4960            }
4961
4962            unsafe {
4963                let func: extern "system" fn(GLint, GLuint) = mem::transmute(self.glUniform1ui);
4964                (func)(location, v0);
4965            }
4966        }
4967
4968        $( $opt )? fn uniform_2f(&self, location: GLint, v0: GLfloat, v1: GLfloat) {
4969
4970
4971            #[cfg(feature = "debug")] { _gl_print_debug("glUniform2f"); }
4972            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4973
4974            if self.glUniform2f == ptr::null_mut() {
4975                _gl_impl_panic("glUniform2f");
4976                return;
4977            }
4978
4979            unsafe {
4980                let func: extern "system" fn(GLint, GLfloat, GLfloat) = mem::transmute(self.glUniform2f);
4981                (func)(location, v0, v1);
4982            }
4983        }
4984
4985        $( $opt )? fn uniform_2fv(&self, location: GLint, values: &[f32]) {
4986
4987
4988            #[cfg(feature = "debug")] { _gl_print_debug("glUniform2fv"); }
4989            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
4990
4991            if self.glUniform2fv == ptr::null_mut() {
4992                _gl_impl_panic("glUniform2fv");
4993                return;
4994            }
4995
4996            unsafe {
4997                let func: extern "system" fn(GLint, GLsizei, *const GLfloat) = mem::transmute(self.glUniform2fv);
4998                (func)(location, (values.len() / 2) as GLsizei, values.as_ptr());
4999            }
5000        }
5001
5002        $( $opt )? fn uniform_2i(&self, location: GLint, v0: GLint, v1: GLint) {
5003
5004
5005            #[cfg(feature = "debug")] { _gl_print_debug("glUniform2i"); }
5006            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5007
5008            if self.glUniform2i == ptr::null_mut() {
5009                _gl_impl_panic("glUniform2i");
5010                return;
5011            }
5012
5013            unsafe {
5014                let func: extern "system" fn(GLint, GLint, GLint) = mem::transmute(self.glUniform2i);
5015                (func)(location, v0, v1);
5016            }
5017        }
5018
5019        $( $opt )? fn uniform_2iv(&self, location: GLint, values: &[i32]) {
5020
5021
5022            #[cfg(feature = "debug")] { _gl_print_debug("glUniform2iv"); }
5023            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5024
5025            if self.glUniform2iv == ptr::null_mut() {
5026                _gl_impl_panic("glUniform2iv");
5027                return;
5028            }
5029
5030            unsafe {
5031                let func: extern "system" fn(GLint, GLsizei, *const GLint) = mem::transmute(self.glUniform2iv);
5032                (func)(location, (values.len() / 2) as GLsizei, values.as_ptr());
5033            }
5034        }
5035
5036        $( $opt )? fn uniform_2ui(&self, location: GLint, v0: GLuint, v1: GLuint) {
5037
5038
5039            #[cfg(feature = "debug")] { _gl_print_debug("glUniform2ui"); }
5040            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5041
5042            if self.glUniform2ui == ptr::null_mut() {
5043                _gl_impl_panic("glUniform2ui");
5044                return;
5045            }
5046
5047            unsafe {
5048                let func: extern "system" fn(GLint, GLuint, GLuint) = mem::transmute(self.glUniform2ui);
5049                (func)(location, v0, v1);
5050            }
5051        }
5052
5053        $( $opt )? fn uniform_3f(&self, location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat) {
5054
5055
5056            #[cfg(feature = "debug")] { _gl_print_debug("glUniform3f"); }
5057            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5058
5059            if self.glUniform3f == ptr::null_mut() {
5060                _gl_impl_panic("glUniform3f");
5061                return;
5062            }
5063
5064            unsafe {
5065                let func: extern "system" fn(GLint, GLfloat, GLfloat, GLfloat) = mem::transmute(self.glUniform3f);
5066                (func)(location, v0, v1, v2);
5067            }
5068        }
5069
5070        $( $opt )? fn uniform_3fv(&self, location: GLint, values: &[f32]) {
5071
5072
5073            #[cfg(feature = "debug")] { _gl_print_debug("glUniform3fv"); }
5074            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5075
5076            if self.glUniform3fv == ptr::null_mut() {
5077                _gl_impl_panic("glUniform3fv");
5078                return;
5079            }
5080
5081            unsafe {
5082                let func: extern "system" fn(GLint, GLsizei, *const GLfloat) = mem::transmute(self.glUniform3fv);
5083                (func)(location, (values.len() / 3) as GLsizei, values.as_ptr());
5084            }
5085        }
5086
5087        $( $opt )? fn uniform_3i(&self, location: GLint, v0: GLint, v1: GLint, v2: GLint) {
5088
5089
5090            #[cfg(feature = "debug")] { _gl_print_debug("glUniform3i"); }
5091            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5092
5093            if self.glUniform3i == ptr::null_mut() {
5094                _gl_impl_panic("glUniform3i");
5095                return;
5096            }
5097
5098            unsafe {
5099                let func: extern "system" fn(GLint, GLint, GLint, GLint) = mem::transmute(self.glUniform3i);
5100                (func)(location, v0, v1, v2);
5101            }
5102        }
5103
5104        $( $opt )? fn uniform_3iv(&self, location: GLint, values: &[i32]) {
5105
5106
5107            #[cfg(feature = "debug")] { _gl_print_debug("glUniform3iv"); }
5108            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5109
5110            if self.glUniform3iv == ptr::null_mut() {
5111                _gl_impl_panic("glUniform3iv");
5112                return;
5113            }
5114
5115            unsafe {
5116                let func: extern "system" fn(GLint, GLsizei, *const GLint) = mem::transmute(self.glUniform3iv);
5117                (func)(location, (values.len() / 3) as GLsizei, values.as_ptr());
5118            }
5119        }
5120
5121        $( $opt )? fn uniform_3ui(&self, location: GLint, v0: GLuint, v1: GLuint, v2: GLuint) {
5122
5123
5124            #[cfg(feature = "debug")] { _gl_print_debug("glUniform3ui"); }
5125            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5126
5127            if self.glUniform3ui == ptr::null_mut() {
5128                _gl_impl_panic("glUniform3ui");
5129                return;
5130            }
5131
5132            unsafe {
5133                let func: extern "system" fn(GLint, GLuint, GLuint, GLuint) = mem::transmute(self.glUniform3ui);
5134                (func)(location, v0, v1, v2);
5135            }
5136        }
5137
5138        $( $opt )? fn uniform_4f(&self, location: GLint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) {
5139
5140
5141            #[cfg(feature = "debug")] { _gl_print_debug("glUniform4f"); }
5142            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5143
5144            if self.glUniform4f == ptr::null_mut() {
5145                _gl_impl_panic("glUniform4f");
5146                return;
5147            }
5148
5149            unsafe {
5150                let func: extern "system" fn(GLint, GLfloat, GLfloat, GLfloat, GLfloat) = mem::transmute(self.glUniform4f);
5151                (func)(location, x, y, z, w);
5152            }
5153        }
5154
5155        $( $opt )? fn uniform_4i(&self, location: GLint, x: GLint, y: GLint, z: GLint, w: GLint) {
5156
5157
5158            #[cfg(feature = "debug")] { _gl_print_debug("glUniform4i"); }
5159            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5160
5161            if self.glUniform4i == ptr::null_mut() {
5162                _gl_impl_panic("glUniform4i");
5163                return;
5164            }
5165
5166            unsafe {
5167                let func: extern "system" fn(GLint, GLint, GLint, GLint, GLint) = mem::transmute(self.glUniform4i);
5168                (func)(location, x, y, z, w);
5169            }
5170        }
5171
5172        $( $opt )? fn uniform_4iv(&self, location: GLint, values: &[i32]) {
5173
5174
5175            #[cfg(feature = "debug")] { _gl_print_debug("glUniform4iv"); }
5176            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5177
5178            if self.glUniform4iv == ptr::null_mut() {
5179                _gl_impl_panic("glUniform4iv");
5180                return;
5181            }
5182
5183            unsafe {
5184                let func: extern "system" fn(GLint, GLsizei, *const GLint) = mem::transmute(self.glUniform4iv);
5185                (func)(location, (values.len() / 4) as GLsizei, values.as_ptr());
5186            }
5187        }
5188
5189        $( $opt )? fn uniform_4ui(&self, location: GLint, x: GLuint, y: GLuint, z: GLuint, w: GLuint) {
5190
5191
5192            #[cfg(feature = "debug")] { _gl_print_debug("glUniform4ui"); }
5193            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5194
5195            if self.glUniform4ui == ptr::null_mut() {
5196                _gl_impl_panic("glUniform4ui");
5197                return;
5198            }
5199
5200            unsafe {
5201                let func: extern "system" fn(GLint, GLuint, GLuint, GLuint, GLuint) = mem::transmute(self.glUniform4ui);
5202                (func)(location, x, y, z, w);
5203            }
5204        }
5205
5206        $( $opt )? fn uniform_4fv(&self, location: GLint, values: &[f32]) {
5207
5208
5209            #[cfg(feature = "debug")] { _gl_print_debug("glUniform4fv"); }
5210            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5211
5212            if self.glUniform4fv == ptr::null_mut() {
5213                _gl_impl_panic("glUniform4fv");
5214                return;
5215            }
5216
5217            unsafe {
5218                let func: extern "system" fn(GLint, GLsizei, *const GLfloat) = mem::transmute(self.glUniform4fv);
5219                (func)(location, (values.len() / 4) as GLsizei, values.as_ptr());
5220            }
5221        }
5222
5223        $( $opt )? fn uniform_matrix_2fv(&self, location: GLint, transpose: bool, value: &[f32]) {
5224
5225
5226            #[cfg(feature = "debug")] { _gl_print_debug("glUniformMatrix2fv"); }
5227            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5228
5229            if self.glUniformMatrix2fv == ptr::null_mut() {
5230                _gl_impl_panic("glUniformMatrix2fv");
5231                return;
5232            }
5233
5234            unsafe {
5235                let func: extern "system" fn(GLint, GLsizei, GLboolean, *const GLfloat) = mem::transmute(self.glUniformMatrix2fv);
5236                (func)(
5237                    location,
5238                    (value.len() / 4) as GLsizei,
5239                    transpose as GLboolean,
5240                    value.as_ptr(),
5241                );
5242            }
5243        }
5244
5245        $( $opt )? fn uniform_matrix_3fv(&self, location: GLint, transpose: bool, value: &[f32]) {
5246
5247
5248            #[cfg(feature = "debug")] { _gl_print_debug("glUniformMatrix3fv"); }
5249            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5250
5251            if self.glUniformMatrix3fv == ptr::null_mut() {
5252                _gl_impl_panic("glUniformMatrix3fv");
5253                return;
5254            }
5255
5256            unsafe {
5257                let func: extern "system" fn(GLint, GLsizei, GLboolean, *const GLfloat) = mem::transmute(self.glUniformMatrix3fv);
5258                (func)(
5259                    location,
5260                    (value.len() / 9) as GLsizei,
5261                    transpose as GLboolean,
5262                    value.as_ptr(),
5263                );
5264            }
5265        }
5266
5267        $( $opt )? fn uniform_matrix_4fv(&self, location: GLint, transpose: bool, value: &[f32]) {
5268
5269
5270            #[cfg(feature = "debug")] { _gl_print_debug("glUniformMatrix4fv"); }
5271            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5272
5273            if self.glUniformMatrix4fv == ptr::null_mut() {
5274                _gl_impl_panic("glUniformMatrix4fv");
5275                return;
5276            }
5277
5278            unsafe {
5279                let func: extern "system" fn(GLint, GLsizei, GLboolean, *const GLfloat) = mem::transmute(self.glUniformMatrix4fv);
5280                (func)(
5281                    location,
5282                    (value.len() / 16) as GLsizei,
5283                    transpose as GLboolean,
5284                    value.as_ptr(),
5285                );
5286            }
5287        }
5288
5289        $( $opt )? fn depth_mask(&self, flag: bool) {
5290
5291
5292            #[cfg(feature = "debug")] { _gl_print_debug("glDepthMask"); }
5293            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5294
5295            if self.glDepthMask == ptr::null_mut() {
5296                _gl_impl_panic("glDepthMask");
5297                return;
5298            }
5299
5300            unsafe {
5301                let func: extern "system" fn(GLboolean) = mem::transmute(self.glDepthMask);
5302                (func)(flag as GLboolean);
5303            }
5304        }
5305
5306        $( $opt )? fn depth_range(&self, near: f64, far: f64) {
5307
5308
5309            #[cfg(feature = "debug")] { _gl_print_debug("glDepthRange"); }
5310            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5311
5312            if self.glDepthRange == ptr::null_mut() {
5313                _gl_impl_panic("glDepthRange");
5314                return;
5315            }
5316
5317            unsafe {
5318                let func: extern "system" fn(GLclampd, GLclampd) = mem::transmute(self.glDepthRange);
5319                (func)(near as GLclampd, far as GLclampd);
5320            }
5321        }
5322
5323        $( $opt )? fn get_active_attrib(&self, program: GLuint, index: GLuint) -> (i32, u32, String) {
5324
5325
5326            #[cfg(feature = "debug")] { _gl_print_debug("glGetActiveAttrib"); }
5327            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5328
5329            if self.glGetActiveAttrib == ptr::null_mut() {
5330                _gl_impl_panic("glGetActiveAttrib");
5331                return (0, 0, String::new());
5332            }
5333
5334            let mut buf_size = [0];
5335            unsafe {
5336                self.get_program_iv(program, gl::ACTIVE_ATTRIBUTE_MAX_LENGTH, &mut buf_size);
5337            }
5338            let mut name = vec![0u8; buf_size[0] as usize];
5339            let mut length = 0 as GLsizei;
5340            let mut size = 0 as i32;
5341            let mut type_ = 0 as u32;
5342            unsafe {
5343                let func: extern "system" fn(GLuint, GLuint, GLsizei, *mut GLsizei, *mut GLint, *mut GLenum, *mut GLchar) = mem::transmute(self.glGetActiveAttrib);
5344                (func)(
5345                    program,
5346                    index,
5347                    buf_size[0],
5348                    &mut length,
5349                    &mut size,
5350                    &mut type_,
5351                    name.as_mut_ptr() as *mut GLchar,
5352                );
5353            }
5354            name.truncate(if length > 0 { length as usize } else { 0 });
5355            (size, type_, String::from_utf8(name).unwrap())
5356        }
5357
5358        $( $opt )? fn get_active_uniform(&self, program: GLuint, index: GLuint) -> (i32, u32, String) {
5359
5360
5361            #[cfg(feature = "debug")] { _gl_print_debug("glGetActiveUniform"); }
5362            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5363
5364            if self.glGetActiveUniform == ptr::null_mut() {
5365                _gl_impl_panic("glGetActiveUniform");
5366                return (0, 0, String::new());
5367            }
5368
5369            let mut buf_size = [0];
5370            unsafe {
5371                self.get_program_iv(program, gl::ACTIVE_UNIFORM_MAX_LENGTH, &mut buf_size);
5372            }
5373            let mut name = vec![0 as u8; buf_size[0] as usize];
5374            let mut length: GLsizei = 0;
5375            let mut size: i32 = 0;
5376            let mut type_: u32 = 0;
5377
5378            unsafe {
5379                let func: extern "system" fn(GLuint, GLuint, GLsizei, *mut GLsizei, *mut GLint, *mut GLenum, *mut GLchar) = mem::transmute(self.glGetActiveUniform);
5380                (func)(
5381                    program,
5382                    index,
5383                    buf_size[0],
5384                    &mut length,
5385                    &mut size,
5386                    &mut type_,
5387                    name.as_mut_ptr() as *mut GLchar,
5388                );
5389            }
5390
5391            name.truncate(if length > 0 { length as usize } else { 0 });
5392
5393            (size, type_, String::from_utf8(name).unwrap())
5394        }
5395
5396        $( $opt )? fn get_active_uniforms_iv(
5397            &self,
5398            program: GLuint,
5399            indices: Vec<GLuint>,
5400            pname: GLenum,
5401        ) -> Vec<GLint> {
5402
5403
5404            #[cfg(feature = "debug")] { _gl_print_debug("glGetActiveUniformsiv"); }
5405            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5406
5407            if self.glGetActiveUniformsiv == ptr::null_mut() {
5408                _gl_impl_panic("glGetActiveUniformsiv");
5409                return Vec::new();
5410            }
5411
5412            let mut result = Vec::with_capacity(indices.len());
5413            unsafe {
5414                result.set_len(indices.len());
5415                let func: extern "system" fn(GLuint, GLsizei, *const GLuint, GLenum, *mut GLint) = mem::transmute(self.glGetActiveUniformsiv);
5416                (func)(
5417                    program,
5418                    indices.len() as GLsizei,
5419                    indices.as_ptr(),
5420                    pname,
5421                    result.as_mut_ptr(),
5422                );
5423            }
5424            result
5425        }
5426
5427        $( $opt )? fn get_active_uniform_block_i(&self, program: GLuint, index: GLuint, pname: GLenum) -> GLint {
5428
5429
5430            #[cfg(feature = "debug")] { _gl_print_debug("glGetActiveUniformBlockiv"); }
5431            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5432
5433            if self.glGetActiveUniformBlockiv == ptr::null_mut() {
5434                _gl_impl_panic("glGetActiveUniformBlockiv");
5435                return 0;
5436            }
5437
5438            let mut result = 0;
5439            unsafe {
5440                let func: extern "system" fn(GLuint, GLuint, GLenum, *mut GLint) = mem::transmute(self.glGetActiveUniformBlockiv);
5441                (func)(program, index, pname, &mut result);
5442            }
5443            result
5444        }
5445
5446        $( $opt )? fn get_active_uniform_block_iv(
5447            &self,
5448            program: GLuint,
5449            index: GLuint,
5450            pname: GLenum,
5451        ) -> Vec<GLint> {
5452
5453
5454            #[cfg(feature = "debug")] { _gl_print_debug("glGetActiveUniformBlockiv"); }
5455            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5456
5457            if self.glGetActiveUniformBlockiv == ptr::null_mut() {
5458                _gl_impl_panic("glGetActiveUniformBlockiv");
5459                return Vec::new();
5460            }
5461
5462            let count = self.get_active_uniform_block_i(program, index, gl::UNIFORM_BLOCK_ACTIVE_UNIFORMS);
5463            let mut result = Vec::with_capacity(count as usize);
5464            unsafe {
5465                result.set_len(count as usize);
5466                let func: extern "system" fn(GLuint, GLuint, GLenum, *mut GLint) = mem::transmute(self.glGetActiveUniformBlockiv);
5467                (func)(program, index, pname, result.as_mut_ptr());
5468            }
5469            result
5470        }
5471
5472        $( $opt )? fn get_active_uniform_block_name(&self, program: GLuint, index: GLuint) -> String {
5473
5474
5475            #[cfg(feature = "debug")] { _gl_print_debug("glGetActiveUniformBlockName"); }
5476            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5477
5478            if self.glGetActiveUniformBlockName == ptr::null_mut() {
5479                _gl_impl_panic("glGetActiveUniformBlockName");
5480                return String::new();
5481            }
5482
5483            let buf_size = self.get_active_uniform_block_i(program, index, gl::UNIFORM_BLOCK_NAME_LENGTH);
5484            let mut name = vec![0 as u8; buf_size as usize];
5485            let mut length: GLsizei = 0;
5486            unsafe {
5487                let func: extern "system" fn(GLuint, GLuint, GLsizei, *mut GLsizei, *mut GLchar) = mem::transmute(self.glGetActiveUniformBlockName);
5488                (func)(
5489                    program,
5490                    index,
5491                    buf_size,
5492                    &mut length,
5493                    name.as_mut_ptr() as *mut GLchar,
5494                );
5495            }
5496            name.truncate(if length > 0 { length as usize } else { 0 });
5497
5498            String::from_utf8(name).unwrap()
5499        }
5500
5501        $( $opt )? fn get_attrib_location(&self, program: GLuint, name: &str) -> c_int {
5502
5503
5504            #[cfg(feature = "debug")] { _gl_print_debug("glGetAttribLocation"); }
5505            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5506
5507            if self.glGetAttribLocation == ptr::null_mut() {
5508                _gl_impl_panic("glGetAttribLocation");
5509                return 0;
5510            }
5511
5512            let name = encode_ascii(name);
5513            unsafe {
5514                let func: extern "system" fn(GLuint, *const GLchar) -> c_int = mem::transmute(self.glGetAttribLocation);
5515                (func)(program, name.as_ptr())
5516            }
5517        }
5518
5519        $( $opt )? fn get_frag_data_location(&self, program: GLuint, name: &str) -> c_int {
5520
5521
5522            #[cfg(feature = "debug")] { _gl_print_debug("glGetFragDataLocation"); }
5523            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5524
5525            if self.glGetFragDataLocation == ptr::null_mut() {
5526                _gl_impl_panic("glGetFragDataLocation");
5527                return 0;
5528            }
5529
5530            let name = encode_ascii(name);
5531            unsafe {
5532                let func: extern "system" fn(GLuint, *const c_char)  -> c_int = mem::transmute(self.glGetFragDataLocation);
5533                (func)(program, name.as_ptr())
5534            }
5535        }
5536
5537        $( $opt )? fn get_uniform_location(&self, program: GLuint, name: &str) -> c_int {
5538
5539
5540            #[cfg(feature = "debug")] { _gl_print_debug("glGetUniformLocation"); }
5541            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5542
5543            if self.glGetUniformLocation == ptr::null_mut() {
5544                _gl_impl_panic("glGetUniformLocation");
5545                return 0;
5546            }
5547
5548            let name = encode_ascii(name);
5549            unsafe {
5550                let func: extern "system" fn(GLuint, *const GLchar)  -> c_int = mem::transmute(self.glGetUniformLocation);
5551                (func)(program, name.as_ptr())
5552            }
5553        }
5554
5555        $( $opt )? fn get_program_info_log(&self, program: GLuint) -> String {
5556
5557
5558            #[cfg(feature = "debug")] { _gl_print_debug("glGetProgramInfoLog"); }
5559            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5560
5561            if self.glGetProgramInfoLog == ptr::null_mut() {
5562                _gl_impl_panic("glGetProgramInfoLog");
5563                return String::new();
5564            }
5565
5566            let mut max_len = [0];
5567            unsafe {
5568                self.get_program_iv(program, gl::INFO_LOG_LENGTH, &mut max_len);
5569            }
5570            if max_len[0] == 0 {
5571                return String::new();
5572            }
5573            let mut result = vec![0u8; max_len[0] as usize];
5574            let mut result_len = 0 as GLsizei;
5575            unsafe {
5576                let func: extern "system" fn(GLuint, GLsizei, *mut GLsizei, *mut GLchar) = mem::transmute(self.glGetProgramInfoLog);
5577                (func)(
5578                    program,
5579                    max_len[0] as GLsizei,
5580                    &mut result_len,
5581                    result.as_mut_ptr() as *mut GLchar,
5582                );
5583            }
5584            result.truncate(if result_len > 0 {
5585                result_len as usize
5586            } else {
5587                0
5588            });
5589            String::from_utf8(result).unwrap()
5590        }
5591
5592        #[inline]
5593        $( $opt )? unsafe fn get_program_iv(&self, program: GLuint, pname: GLenum, result: &mut [GLint]) {
5594
5595            #[cfg(feature = "debug")] { _gl_print_debug("glGetProgramiv"); }
5596            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5597
5598            if self.glGetProgramiv == ptr::null_mut() {
5599                _gl_impl_panic("glGetProgramiv");
5600                return;
5601            }
5602            let func: extern "system" fn(GLuint, GLenum, *mut GLint) = mem::transmute(self.glGetProgramiv);
5603            (func)(program, pname, result.as_mut_ptr());
5604        }
5605
5606        $( $opt )? fn get_program_binary(&self, program: GLuint) -> (Vec<u8>, GLenum) {
5607
5608            const NONE: GLenum = 0;
5609
5610
5611            #[cfg(feature = "debug")] { _gl_print_debug("glGetProgramBinary"); }
5612            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5613
5614            if self.glGetProgramBinary == ptr::null_mut() {
5615                _gl_impl_panic("glGetProgramBinary");
5616                return (Vec::new(), NONE);
5617            }
5618
5619            let mut len = [0];
5620            unsafe {
5621                self.get_program_iv(program, gl::PROGRAM_BINARY_LENGTH, &mut len);
5622            }
5623            if len[0] <= 0 {
5624                return (Vec::new(), NONE);
5625            }
5626            let mut binary: Vec<u8> = Vec::with_capacity(len[0] as usize);
5627            let mut format = NONE;
5628            let mut out_len = 0;
5629            unsafe {
5630                binary.set_len(len[0] as usize);
5631                let func: extern "system" fn(GLuint, GLsizei, *mut GLsizei, *mut GLenum, *mut c_void) = mem::transmute(self.glGetProgramBinary);
5632                (func)(
5633                    program,
5634                    len[0],
5635                    &mut out_len as *mut GLsizei,
5636                    &mut format,
5637                    binary.as_mut_ptr() as *mut c_void,
5638                );
5639            }
5640            if len[0] != out_len {
5641                return (Vec::new(), NONE);
5642            }
5643
5644            (binary, format)
5645        }
5646
5647        $( $opt )? fn program_binary(&self, program: GLuint, format: GLenum, binary: &[u8]) {
5648
5649            #[cfg(feature = "debug")] { _gl_print_debug("glProgramBinary"); }
5650            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5651
5652            if self.glProgramBinary == ptr::null_mut() {
5653                _gl_impl_panic("glProgramBinary");
5654                return;
5655            }
5656
5657            unsafe {
5658                let func: extern "system" fn(GLuint, GLenum, *const c_void, GLsizei) = mem::transmute(self.glProgramBinary);
5659                (func)(
5660                    program,
5661                    format,
5662                    binary.as_ptr() as *const c_void,
5663                    binary.len() as GLsizei,
5664                );
5665            }
5666        }
5667
5668        $( $opt )? fn program_parameter_i(&self, program: GLuint, pname: GLenum, value: GLint) {
5669
5670            #[cfg(feature = "debug")] { _gl_print_debug("glProgramParameteri"); }
5671            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5672
5673            if self.glProgramParameteri == ptr::null_mut() {
5674                _gl_impl_panic("glProgramParameteri");
5675                return;
5676            }
5677            unsafe {
5678                let func: extern "system" fn(GLuint, GLenum, GLint) = mem::transmute(self.glProgramParameteri);
5679                (func)(program, pname, value);
5680            }
5681        }
5682
5683        #[inline]
5684        $( $opt )? unsafe fn get_vertex_attrib_iv(&self, index: GLuint, pname: GLenum, result: &mut [GLint]) {
5685
5686            #[cfg(feature = "debug")] { _gl_print_debug("glGetVertexAttribiv"); }
5687            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5688
5689            if self.glGetVertexAttribiv == ptr::null_mut() {
5690                _gl_impl_panic("glGetVertexAttribiv");
5691                return;
5692            }
5693            let func: extern "system" fn(GLuint, GLenum, *mut GLint) = mem::transmute(self.glGetVertexAttribiv);
5694            (func)(index, pname, result.as_mut_ptr());
5695        }
5696
5697        #[inline]
5698        $( $opt )? unsafe fn get_vertex_attrib_fv(&self, index: GLuint, pname: GLenum, result: &mut [GLfloat]) {
5699
5700            #[cfg(feature = "debug")] { _gl_print_debug("glGetVertexAttribfv"); }
5701            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5702
5703            if self.glGetVertexAttribfv == ptr::null_mut() {
5704                _gl_impl_panic("glGetVertexAttribfv");
5705                return;
5706            }
5707            let func: extern "system" fn(GLuint, GLenum, *mut GLfloat) = mem::transmute(self.glGetVertexAttribfv);
5708            (func)(index, pname, result.as_mut_ptr());
5709        }
5710
5711        $( $opt )? fn get_vertex_attrib_pointer_v(&self, index: GLuint, pname: GLenum) -> GLsizeiptr {
5712
5713
5714            #[cfg(feature = "debug")] { _gl_print_debug("glGetVertexAttribPointerv"); }
5715            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5716
5717            if self.glGetVertexAttribPointerv == ptr::null_mut() {
5718                _gl_impl_panic("glGetVertexAttribPointerv");
5719                return 0;
5720            }
5721
5722            let mut result = 0 as *mut GLvoid;
5723            unsafe {
5724                let func: extern "system" fn(GLuint, GLenum, *mut *mut GLvoid) = mem::transmute(self.glGetVertexAttribPointerv);
5725                (func)(index, pname, &mut result)
5726            }
5727            result as GLsizeiptr
5728        }
5729
5730        $( $opt )? fn get_buffer_parameter_iv(&self, target: GLuint, pname: GLenum) -> GLint {
5731
5732
5733            #[cfg(feature = "debug")] { _gl_print_debug("glGetBufferParameteriv"); }
5734            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5735
5736            if self.glGetBufferParameteriv == ptr::null_mut() {
5737                _gl_impl_panic("glGetBufferParameteriv");
5738                return 0;
5739            }
5740
5741            let mut result = 0 as GLint;
5742            unsafe {
5743                let func: extern "system" fn(GLenum, GLenum, *mut GLint) = mem::transmute(self.glGetBufferParameteriv);
5744                (func)(target, pname, &mut result);
5745            }
5746            result
5747        }
5748
5749        $( $opt )? fn get_shader_info_log(&self, shader: GLuint) -> String {
5750
5751
5752            #[cfg(feature = "debug")] { _gl_print_debug("glGetShaderInfoLog"); }
5753            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5754
5755            if self.glGetShaderInfoLog == ptr::null_mut() {
5756                _gl_impl_panic("glGetShaderInfoLog");
5757                return String::new();
5758            }
5759
5760            let mut max_len = [0];
5761            unsafe {
5762                self.get_shader_iv(shader, gl::INFO_LOG_LENGTH, &mut max_len);
5763            }
5764            if max_len[0] == 0 {
5765                return String::new();
5766            }
5767            let mut result = vec![0u8; max_len[0] as usize];
5768            let mut result_len = 0 as GLsizei;
5769            unsafe {
5770                let func: extern "system" fn(GLuint, GLsizei, *mut GLsizei, *mut GLchar) = mem::transmute(self.glGetShaderInfoLog);
5771                (func)(
5772                    shader,
5773                    max_len[0] as GLsizei,
5774                    &mut result_len,
5775                    result.as_mut_ptr() as *mut GLchar,
5776                );
5777            }
5778            result.truncate(if result_len > 0 {
5779                result_len as usize
5780            } else {
5781                0
5782            });
5783            String::from_utf8(result).unwrap()
5784        }
5785
5786        $( $opt )? fn get_string(&self, which: GLenum) -> String {
5787
5788
5789            #[cfg(feature = "debug")] { _gl_print_debug("glGetString"); }
5790            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5791
5792            if self.glGetString == ptr::null_mut() {
5793                _gl_impl_panic("glGetString");
5794                return String::new();
5795            }
5796
5797            unsafe {
5798                let func: extern "system" fn(GLenum) -> *mut GLubyte = mem::transmute(self.glGetString);
5799                let llstr = (func)(which);
5800                if !llstr.is_null() {
5801                    cstr_from_ptr(llstr as *const c_char).to_string()
5802                } else {
5803                    String::new()
5804                }
5805            }
5806        }
5807
5808        $( $opt )? fn get_string_i(&self, which: GLenum, index: GLuint) -> String {
5809
5810
5811            #[cfg(feature = "debug")] { _gl_print_debug("glGetStringi"); }
5812            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5813
5814            if self.glGetStringi == ptr::null_mut() {
5815                _gl_impl_panic("glGetStringi");
5816                return String::new();
5817            }
5818
5819            unsafe {
5820                let func: extern "system" fn(GLenum, GLuint) -> *mut GLubyte = mem::transmute(self.glGetStringi);
5821                let llstr = (func)(which, index);
5822                if !llstr.is_null() {
5823                    cstr_from_ptr(llstr as *const c_char).to_string()
5824                } else {
5825                    String::new()
5826                }
5827            }
5828        }
5829
5830        $( $opt )? unsafe fn get_shader_iv(&self, shader: GLuint, pname: GLenum, result: &mut [GLint]) {
5831
5832
5833            #[cfg(feature = "debug")] { _gl_print_debug("glGetShaderiv"); }
5834            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5835
5836            if self.glGetShaderiv == ptr::null_mut() {
5837                _gl_impl_panic("glGetShaderiv");
5838                return;
5839            }
5840
5841            let func: extern "system" fn(GLuint, GLenum, *mut GLint) = mem::transmute(self.glGetShaderiv);
5842            (func)(shader, pname, result.as_mut_ptr());
5843        }
5844
5845        $( $opt )? fn get_shader_precision_format(
5846            &self,
5847            _shader_type: GLuint,
5848            precision_type: GLuint,
5849        ) -> (GLint, GLint, GLint) {
5850
5851
5852            #[cfg(feature = "debug")] { _gl_print_debug("glGetShaderPrecisionFormat"); }
5853            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5854
5855            // if self.glGetShaderPrecisionFormat == ptr::null_mut() {
5856            //     _gl_impl_panic("glGetShaderPrecisionFormat");
5857            //     return (0, 0, 0);
5858            // }
5859
5860            // gl.GetShaderPrecisionFormat is not available until OpenGL 4.1.
5861            // Fallback to OpenGL standard precissions that most desktop hardware support.
5862            match precision_type {
5863                gl::LOW_FLOAT | gl::MEDIUM_FLOAT | gl::HIGH_FLOAT => {
5864                    // Fallback to IEEE 754 single precision
5865                    // Range: from -2^127 to 2^127
5866                    // Significand precision: 23 bits
5867                    (127, 127, 23)
5868                }
5869                gl::LOW_INT | gl::MEDIUM_INT | gl::HIGH_INT => {
5870                    // Fallback to single precision integer
5871                    // Range: from -2^24 to 2^24
5872                    // Precision: For integer formats this value is always 0
5873                    (24, 24, 0)
5874                }
5875                _ => (0, 0, 0),
5876            }
5877        }
5878
5879        $( $opt )? fn compile_shader(&self, shader: GLuint) {
5880
5881
5882            #[cfg(feature = "debug")] { _gl_print_debug("glCompileShader"); }
5883            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5884
5885            if self.glCompileShader == ptr::null_mut() {
5886                _gl_impl_panic("glCompileShader");
5887                return;
5888            }
5889
5890            unsafe {
5891                let func: extern "system" fn(GLuint) = mem::transmute(self.glCompileShader);
5892                (func)(shader);
5893            }
5894        }
5895
5896        $( $opt )? fn create_program(&self) -> GLuint {
5897
5898
5899            #[cfg(feature = "debug")] { _gl_print_debug("glCreateProgram"); }
5900            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5901
5902            if self.glCreateProgram == ptr::null_mut() {
5903                _gl_impl_panic("glCreateProgram");
5904                return 0;
5905            }
5906
5907            unsafe {
5908                let func: extern "system" fn() -> GLuint = mem::transmute(self.glCreateProgram);
5909                return (func)();
5910            }
5911        }
5912
5913        $( $opt )? fn delete_program(&self, program: GLuint) {
5914
5915
5916            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteProgram"); }
5917            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5918
5919            if self.glDeleteProgram == ptr::null_mut() {
5920                _gl_impl_panic("glDeleteProgram");
5921                return;
5922            }
5923
5924            unsafe {
5925                let func: extern "system" fn(GLuint) = mem::transmute(self.glDeleteProgram);
5926                (func)(program);
5927            }
5928        }
5929
5930        $( $opt )? fn create_shader(&self, shader_type: GLenum) -> GLuint {
5931
5932
5933            #[cfg(feature = "debug")] { _gl_print_debug("glCreateShader"); }
5934            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5935
5936            if self.glCreateShader == ptr::null_mut() {
5937                _gl_impl_panic("glCreateShader");
5938                return 0;
5939            }
5940
5941            unsafe {
5942                let func: extern "system" fn(GLenum) -> GLuint = mem::transmute(self.glCreateShader);
5943                return (func)(shader_type);
5944            }
5945        }
5946
5947        $( $opt )? fn delete_shader(&self, shader: GLuint) {
5948
5949
5950            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteShader"); }
5951            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5952
5953            if self.glDeleteShader == ptr::null_mut() {
5954                _gl_impl_panic("glDeleteShader");
5955                return;
5956            }
5957
5958            unsafe {
5959                let func: extern "system" fn(GLuint) = mem::transmute(self.glDeleteShader);
5960                (func)(shader);
5961            }
5962        }
5963
5964        $( $opt )? fn detach_shader(&self, program: GLuint, shader: GLuint) {
5965
5966
5967            #[cfg(feature = "debug")] { _gl_print_debug("glDetachShader"); }
5968            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5969
5970            if self.glDetachShader == ptr::null_mut() {
5971                _gl_impl_panic("glDetachShader");
5972                return;
5973            }
5974
5975            unsafe {
5976                let func: extern "system" fn(GLuint, GLuint) = mem::transmute(self.glDetachShader);
5977                (func)(program, shader);
5978            }
5979        }
5980
5981        $( $opt )? fn link_program(&self, program: GLuint) {
5982
5983
5984            #[cfg(feature = "debug")] { _gl_print_debug("glLinkProgram"); }
5985            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
5986
5987            if self.glLinkProgram == ptr::null_mut() {
5988                _gl_impl_panic("glLinkProgram");
5989                return;
5990            }
5991
5992            unsafe {
5993                let func: extern "system" fn(GLuint) = mem::transmute(self.glLinkProgram);
5994                return (func)(program);
5995            }
5996        }
5997
5998        $( $opt )? fn clear_color(&self, r: f32, g: f32, b: f32, a: f32) {
5999
6000
6001            #[cfg(feature = "debug")] { _gl_print_debug("glClearColor"); }
6002            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6003
6004            if self.glClearColor == ptr::null_mut() {
6005                _gl_impl_panic("glClearColor");
6006                return;
6007            }
6008
6009            unsafe {
6010                let func: extern "system" fn(GLclampf, GLclampf, GLclampf, GLclampf) = mem::transmute(self.glClearColor);
6011                (func)(r, g, b, a);
6012            }
6013        }
6014
6015        $( $opt )? fn clear(&self, buffer_mask: GLbitfield) {
6016
6017
6018            #[cfg(feature = "debug")] { _gl_print_debug("glClear"); }
6019            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6020
6021            if self.glClear == ptr::null_mut() {
6022                _gl_impl_panic("glClear");
6023                return;
6024            }
6025
6026            unsafe {
6027                let func: extern "system" fn(GLbitfield) = mem::transmute(self.glClear);
6028                (func)(buffer_mask);
6029            }
6030        }
6031
6032        $( $opt )? fn clear_depth(&self, depth: f64) {
6033
6034
6035            #[cfg(feature = "debug")] { _gl_print_debug("glClearDepth"); }
6036            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6037
6038            if self.glClearDepth == ptr::null_mut() {
6039                _gl_impl_panic("glClearDepth");
6040                return;
6041            }
6042
6043            unsafe {
6044                let func: extern "system" fn(GLclampd) = mem::transmute(self.glClearDepth);
6045                (func)(depth as GLclampd);
6046            }
6047        }
6048
6049        $( $opt )? fn clear_stencil(&self, s: GLint) {
6050
6051
6052            #[cfg(feature = "debug")] { _gl_print_debug("glClearStencil"); }
6053            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6054
6055            if self.glClearStencil == ptr::null_mut() {
6056                _gl_impl_panic("glClearStencil");
6057                return;
6058            }
6059
6060            unsafe {
6061                let func: extern "system" fn(GLint) = mem::transmute(self.glClearStencil);
6062                (func)(s);
6063            }
6064        }
6065
6066        $( $opt )? fn flush(&self) {
6067
6068
6069            #[cfg(feature = "debug")] { _gl_print_debug("glFlush"); }
6070            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6071
6072            if self.glFlush == ptr::null_mut() {
6073                _gl_impl_panic("glFlush");
6074                return;
6075            }
6076
6077            unsafe {
6078                let func: extern "system" fn() = mem::transmute(self.glFlush);
6079                (func)();
6080            }
6081        }
6082
6083        $( $opt )? fn finish(&self) {
6084
6085
6086            #[cfg(feature = "debug")] { _gl_print_debug("glFinish"); }
6087            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6088
6089            if self.glFinish == ptr::null_mut() {
6090                _gl_impl_panic("glFinish");
6091                return;
6092            }
6093
6094            unsafe {
6095                let func: extern "system" fn() = mem::transmute(self.glFinish);
6096                (func)();
6097            }
6098        }
6099
6100        $( $opt )? fn get_error(&self) -> GLenum {
6101
6102
6103            #[cfg(feature = "debug")] { #[cfg(not(feature = "error"))] { _gl_print_debug("glGetError"); } }
6104
6105            if self.glGetError == ptr::null_mut() {
6106                _gl_impl_panic("glGetError");
6107                return 0;
6108            }
6109
6110            unsafe {
6111                let func: extern "system" fn() -> GLenum = mem::transmute(self.glGetError);
6112                (func)()
6113            }
6114        }
6115
6116        $( $opt )? fn stencil_mask(&self, mask: GLuint) {
6117
6118
6119            #[cfg(feature = "debug")] { _gl_print_debug("glStencilMask"); }
6120            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6121
6122            if self.glStencilMask == ptr::null_mut() {
6123                _gl_impl_panic("glStencilMask");
6124                return;
6125            }
6126
6127            unsafe {
6128                let func: extern "system" fn(GLuint) = mem::transmute(self.glStencilMask);
6129                (func)(mask)
6130            }
6131        }
6132
6133        $( $opt )? fn stencil_mask_separate(&self, face: GLenum, mask: GLuint) {
6134
6135
6136            #[cfg(feature = "debug")] { _gl_print_debug("glStencilMaskSeparate"); }
6137            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6138
6139            if self.glStencilMaskSeparate == ptr::null_mut() {
6140                _gl_impl_panic("glStencilMaskSeparate");
6141                return;
6142            }
6143
6144            unsafe {
6145                let func: extern "system" fn(GLenum, GLuint) = mem::transmute(self.glStencilMaskSeparate);
6146                (func)(face, mask)
6147            }
6148        }
6149
6150        $( $opt )? fn stencil_func(&self, func: GLenum, ref_: GLint, mask: GLuint) {
6151
6152
6153            #[cfg(feature = "debug")] { _gl_print_debug("glStencilFunc"); }
6154            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6155
6156            if self.glStencilFunc == ptr::null_mut() {
6157                _gl_impl_panic("glStencilFunc");
6158                return;
6159            }
6160
6161            unsafe {
6162                let glStencilFunc: extern "system" fn(GLenum, GLint, GLuint) = mem::transmute(self.glStencilFunc);
6163                (glStencilFunc)(func, ref_, mask)
6164            }
6165        }
6166
6167        $( $opt )? fn stencil_func_separate(&self, face: GLenum, func: GLenum, ref_: GLint, mask: GLuint) {
6168
6169
6170            #[cfg(feature = "debug")] { _gl_print_debug("glStencilFuncSeparate"); }
6171            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6172
6173            if self.glStencilFuncSeparate == ptr::null_mut() {
6174                _gl_impl_panic("glStencilFuncSeparate");
6175                return;
6176            }
6177
6178            unsafe {
6179                let glStencilFuncSeparate: extern "system" fn(GLenum, GLenum, GLint, GLuint) = mem::transmute(self.glStencilFuncSeparate);
6180                (glStencilFuncSeparate)(face, func, ref_, mask)
6181            }
6182        }
6183
6184        $( $opt )? fn stencil_op(&self, sfail: GLenum, dpfail: GLenum, dppass: GLenum) {
6185
6186
6187            #[cfg(feature = "debug")] { _gl_print_debug("glStencilOp"); }
6188            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6189
6190            if self.glStencilOp == ptr::null_mut() {
6191                _gl_impl_panic("glStencilOp");
6192                return;
6193            }
6194
6195            unsafe {
6196                let func: extern "system" fn(GLenum, GLenum, GLenum) = mem::transmute(self.glStencilOp);
6197                (func)(sfail, dpfail, dppass)
6198            }
6199        }
6200
6201        $( $opt )? fn stencil_op_separate(&self, face: GLenum, sfail: GLenum, dpfail: GLenum, dppass: GLenum) {
6202
6203
6204            #[cfg(feature = "debug")] { _gl_print_debug("glStencilOpSeparate"); }
6205            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6206
6207            if self.glStencilOpSeparate == ptr::null_mut() {
6208                _gl_impl_panic("glStencilOpSeparate");
6209                return;
6210            }
6211
6212            unsafe {
6213                let func: extern "system" fn(GLenum, GLenum, GLenum, GLenum) = mem::transmute(self.glStencilOpSeparate);
6214                (func)(face, sfail, dpfail, dppass)
6215            }
6216        }
6217
6218        #[allow(unused_variables)]
6219        $( $opt )? fn egl_image_target_texture2d_oes(&self, target: GLenum, image: GLeglImageOES) {
6220
6221            #[cfg(feature = "debug")] { _gl_print_debug("glEglImageTargetTexture2dOes"); }
6222            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6223
6224            return; // not supported
6225
6226            // if self.glEglImageTargetTexture2dOes == ptr::null_mut() {
6227            //     _gl_impl_panic("glEglImageTargetTexture2dOes");
6228            //     return;
6229            // }
6230        }
6231
6232        #[allow(unused_variables)]
6233        $( $opt )? fn egl_image_target_renderbuffer_storage_oes(&self, target: GLenum, image: GLeglImageOES) {
6234
6235            #[cfg(feature = "debug")] { _gl_print_debug("glEglImageTargetRenderbufferStorageOes"); }
6236            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6237
6238            return; // not supported
6239
6240            // if self.glEglImageTargetRenderbufferStorageOes == ptr::null_mut() {
6241            //     _gl_impl_panic("glEglImageTargetRenderbufferStorageOes");
6242            //     return;
6243            // }
6244        }
6245
6246        $( $opt )? fn generate_mipmap(&self, target: GLenum) {
6247
6248            #[cfg(feature = "debug")] { _gl_print_debug("glGenerateMipmap"); }
6249            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6250
6251            if self.glGenerateMipmap == ptr::null_mut() {
6252                _gl_impl_panic("glGenerateMipmap");
6253                return;
6254            }
6255
6256            unsafe {
6257                let func: extern "system" fn(GLenum) = mem::transmute(self.glGenerateMipmap);
6258                (func)(target)
6259            }
6260        }
6261
6262        $( $opt )? fn insert_event_marker_ext(&self, message: &str) {
6263
6264
6265            #[cfg(feature = "debug")] { _gl_print_debug("glInsertEventMarkerEXT"); }
6266            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6267
6268            if self.glInsertEventMarkerEXT == ptr::null_mut() {
6269                _gl_impl_panic("glInsertEventMarkerEXT");
6270                return;
6271            }
6272
6273            unsafe {
6274                let func: extern "system" fn(GLsizei, *const GLchar) = mem::transmute(self.glInsertEventMarkerEXT);
6275                (func)(message.len() as GLsizei, message.as_ptr() as *const _);
6276            }
6277        }
6278
6279        $( $opt )? fn push_group_marker_ext(&self, message: &str) {
6280
6281
6282            #[cfg(feature = "debug")] { _gl_print_debug("glPushGroupMarkerEXT"); }
6283            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6284
6285            if self.glPushGroupMarkerEXT == ptr::null_mut() {
6286                _gl_impl_panic("glPushGroupMarkerEXT");
6287                return;
6288            }
6289
6290            unsafe {
6291                let func: extern "system" fn(GLsizei, *const GLchar) = mem::transmute(self.glPushGroupMarkerEXT);
6292                (func)(message.len() as GLsizei, message.as_ptr() as *const _);
6293            }
6294        }
6295
6296        $( $opt )? fn pop_group_marker_ext(&self) {
6297
6298
6299            #[cfg(feature = "debug")] { _gl_print_debug("glPopGroupMarkerEXT"); }
6300            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6301
6302            if self.glPopGroupMarkerEXT == ptr::null_mut() {
6303                _gl_impl_panic("glPopGroupMarkerEXT");
6304                return;
6305            }
6306
6307            unsafe {
6308                let func: extern "system" fn() = mem::transmute(self.glPopGroupMarkerEXT);
6309                (func)();
6310            }
6311        }
6312
6313        $( $opt )? fn debug_message_insert_khr(&self, source: GLenum, type_: GLenum, id: GLuint, severity: GLenum, message: &str) {
6314
6315
6316            #[cfg(feature = "debug")] { _gl_print_debug("glDebugMessageInsertKHR"); }
6317            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6318
6319            if self.glDebugMessageInsertKHR == ptr::null_mut() {
6320                _gl_impl_panic("glDebugMessageInsertKHR");
6321                return;
6322            }
6323
6324            unsafe {
6325                // TODO: correct?
6326                let func: extern "system" fn(GLenum, GLenum, GLuint, GLenum, GLsizei, *const c_char) = mem::transmute(self.glDebugMessageInsertKHR);
6327                (func)(source, type_, id, severity, message.len() as GLsizei, message.as_ptr() as *const _);
6328            }
6329        }
6330
6331        $( $opt )? fn push_debug_group_khr(&self, source: GLenum, id: GLuint, message: &str) {
6332
6333
6334            #[cfg(feature = "debug")] { _gl_print_debug("glPushDebugGroupKHR"); }
6335            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6336
6337            if self.glPushDebugGroupKHR == ptr::null_mut() {
6338                _gl_impl_panic("glPushDebugGroupKHR");
6339                return;
6340            }
6341
6342            unsafe {
6343                let func: extern "system" fn(GLenum, GLuint, GLsizei, *const c_char) = mem::transmute(self.glPushDebugGroupKHR);
6344                (func)(source, id, message.len() as GLsizei, message.as_ptr() as *const _);
6345            }
6346        }
6347
6348        $( $opt )? fn pop_debug_group_khr(&self) {
6349
6350
6351            #[cfg(feature = "debug")] { _gl_print_debug("glPopDebugGroupKHR"); }
6352            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6353
6354            if self.glPopDebugGroupKHR == ptr::null_mut() {
6355                _gl_impl_panic("glPopDebugGroupKHR");
6356                return;
6357            }
6358
6359            unsafe {
6360                let func: extern "system" fn() = mem::transmute(self.glPopDebugGroupKHR);
6361                (func)();
6362            }
6363        }
6364
6365        $( $opt )? fn fence_sync(&self, condition: GLenum, flags: GLbitfield) -> GLsync {
6366
6367
6368            #[cfg(feature = "debug")] { _gl_print_debug("glFenceSync"); }
6369            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6370
6371            if self.glFenceSync == ptr::null_mut() {
6372                _gl_impl_panic("glFenceSync");
6373                return ptr::null_mut();
6374            }
6375
6376            unsafe {
6377                let func: extern "system" fn(GLenum, GLbitfield) -> GLsync = mem::transmute(self.glFenceSync);
6378                (func)(condition, flags) as *const _
6379            }
6380        }
6381
6382        $( $opt )? fn client_wait_sync(&self, sync: GLsync, flags: GLbitfield, timeout: GLuint64) -> GLenum {
6383
6384
6385            #[cfg(feature = "debug")] { _gl_print_debug("glClientWaitSync"); }
6386            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6387
6388            if self.glClientWaitSync == ptr::null_mut() {
6389                _gl_impl_panic("glClientWaitSync");
6390                return 0;
6391            }
6392
6393            unsafe {
6394                let func: extern "system" fn(GLsync, GLbitfield, GLuint64) -> GLenum = mem::transmute(self.glClientWaitSync);
6395                (func)(sync as *const _, flags, timeout)
6396            }
6397        }
6398
6399        $( $opt )? fn wait_sync(&self, sync: GLsync, flags: GLbitfield, timeout: GLuint64) {
6400
6401
6402            #[cfg(feature = "debug")] { _gl_print_debug("glWaitSync"); }
6403            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6404
6405            if self.glWaitSync == ptr::null_mut() {
6406                _gl_impl_panic("glWaitSync");
6407                return;
6408            }
6409
6410            unsafe {
6411                let func: extern "system" fn(GLsync, GLbitfield, GLuint64) = mem::transmute(self.glWaitSync);
6412                (func)(sync as *const _, flags, timeout);
6413            }
6414        }
6415
6416        $( $opt )? fn texture_range_apple(&self, target: GLenum, data: &[u8]) {
6417
6418
6419            #[cfg(feature = "debug")] { _gl_print_debug("glTextureRangeAPPLE"); }
6420            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6421
6422            if self.glTextureRangeAPPLE == ptr::null_mut() {
6423                _gl_impl_panic("glTextureRangeAPPLE");
6424                return;
6425            }
6426
6427            unsafe {
6428                let func: extern "system" fn(GLenum, GLsizei, *const c_void) = mem::transmute(self.glTextureRangeAPPLE);
6429                (func)(
6430                    target,
6431                    data.len() as GLsizei,
6432                    data.as_ptr() as *const c_void,
6433                );
6434            }
6435        }
6436
6437        $( $opt )? fn delete_sync(&self, sync: GLsync) {
6438
6439
6440            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteSync"); }
6441            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6442
6443            if self.glDeleteSync == ptr::null_mut() {
6444                _gl_impl_panic("glDeleteSync");
6445                return;
6446            }
6447
6448            unsafe {
6449                let func: extern "system" fn(GLsync) = mem::transmute(self.glDeleteSync);
6450                (func)(sync as *const _);
6451            }
6452        }
6453
6454        $( $opt )? fn gen_fences_apple(&self, n: GLsizei) -> Vec<GLuint> {
6455
6456            let mut result = vec![0 as GLuint; n as usize];
6457
6458
6459            #[cfg(feature = "debug")] { _gl_print_debug("glGenFencesAPPLE"); }
6460            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6461
6462            if self.glGenFencesAPPLE == ptr::null_mut() {
6463                _gl_impl_panic("glGenFencesAPPLE");
6464                return result;
6465            }
6466
6467            unsafe {
6468                let func: extern "system" fn(GLsizei, *mut GLuint) = mem::transmute(self.glGenFencesAPPLE);
6469                (func)(n, result.as_mut_ptr());
6470            }
6471            result
6472        }
6473
6474        $( $opt )? fn delete_fences_apple(&self, fences: &[GLuint]) {
6475
6476
6477            #[cfg(feature = "debug")] { _gl_print_debug("glDeleteFencesAPPLE"); }
6478            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6479
6480            if self.glDeleteFencesAPPLE == ptr::null_mut() {
6481                _gl_impl_panic("glDeleteFencesAPPLE");
6482                return;
6483            }
6484
6485            unsafe {
6486                let func: extern "system" fn(GLsizei, *const GLuint) = mem::transmute(self.glDeleteFencesAPPLE);
6487                (func)(fences.len() as GLsizei, fences.as_ptr());
6488            }
6489        }
6490
6491        $( $opt )? fn set_fence_apple(&self, fence: GLuint) {
6492
6493
6494            #[cfg(feature = "debug")] { _gl_print_debug("glSetFenceAPPLE"); }
6495            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6496
6497            if self.glSetFenceAPPLE == ptr::null_mut() {
6498                _gl_impl_panic("glSetFenceAPPLE");
6499                return;
6500            }
6501
6502            unsafe {
6503                let func: extern "system" fn(GLuint) = mem::transmute(self.glSetFenceAPPLE);
6504                (func)(fence);
6505            }
6506        }
6507
6508        $( $opt )? fn finish_fence_apple(&self, fence: GLuint) {
6509
6510
6511            #[cfg(feature = "debug")] { _gl_print_debug("glFinishFenceAPPLE"); }
6512            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6513
6514            if self.glFinishFenceAPPLE == ptr::null_mut() {
6515                _gl_impl_panic("glFinishFenceAPPLE");
6516                return;
6517            }
6518
6519            unsafe {
6520                let func: extern "system" fn(GLuint) = mem::transmute(self.glFinishFenceAPPLE);
6521                (func)(fence);
6522            }
6523        }
6524
6525        $( $opt )? fn test_fence_apple(&self, fence: GLuint) {
6526
6527
6528            #[cfg(feature = "debug")] { _gl_print_debug("glTestFenceAPPLE"); }
6529            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6530
6531            if self.glTestFenceAPPLE == ptr::null_mut() {
6532                _gl_impl_panic("glTestFenceAPPLE");
6533                return;
6534            }
6535
6536            unsafe {
6537                let func: extern "system" fn(GLuint) = mem::transmute(self.glTestFenceAPPLE);
6538                (func)(fence);
6539            }
6540        }
6541
6542        $( $opt )? fn test_object_apple(&self, object: GLenum, name: GLuint) -> GLboolean {
6543
6544
6545            #[cfg(feature = "debug")] { _gl_print_debug("glTestObjectAPPLE"); }
6546            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6547
6548            if self.glTestObjectAPPLE == ptr::null_mut() {
6549                _gl_impl_panic("glTestObjectAPPLE");
6550                return 0;
6551            }
6552
6553            unsafe {
6554                let func: extern "system" fn(GLenum, GLuint) -> GLboolean = mem::transmute(self.glTestObjectAPPLE);
6555                (func)(object, name)
6556            }
6557        }
6558
6559        $( $opt )? fn finish_object_apple(&self, object: GLenum, name: GLuint) {
6560
6561
6562            #[cfg(feature = "debug")] { _gl_print_debug("glFinishObjectAPPLE"); }
6563            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6564
6565            if self.glTestObjectAPPLE == ptr::null_mut() {
6566                _gl_impl_panic("glFinishObjectAPPLE");
6567                return;
6568            }
6569
6570            unsafe {
6571                // the spec has a typo for name as GLint instead of GLuint
6572                let func: extern "system" fn(GLenum, GLint) = mem::transmute(self.glFinishObjectAPPLE);
6573                (func)(object, name as GLint);
6574            }
6575        }
6576
6577        // GL_ARB_blend_func_extended
6578        $( $opt )? fn bind_frag_data_location_indexed(
6579            &self,
6580            program: GLuint,
6581            color_number: GLuint,
6582            index: GLuint,
6583            name: &str,
6584        ) {
6585
6586            #[cfg(feature = "debug")] { _gl_print_debug("glBindFragDataLocationIndexed"); }
6587            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6588
6589            if self.glBindFragDataLocationIndexed == ptr::null_mut() {
6590                _gl_impl_panic("glBindFragDataLocationIndexed");
6591                return;
6592            }
6593
6594            let c_string = encode_ascii(name);
6595
6596            unsafe {
6597                let func: extern "system" fn(GLuint, GLuint, GLuint, *const c_char) = mem::transmute(self.glBindFragDataLocationIndexed);
6598                (func)(
6599                    program,
6600                    color_number,
6601                    index,
6602                    c_string.as_ptr(),
6603                )
6604            }
6605        }
6606
6607        $( $opt )? fn get_frag_data_index(&self, program: GLuint, name: &str) -> GLint {
6608
6609
6610            #[cfg(feature = "debug")] { _gl_print_debug("glGetFragDataIndex"); }
6611            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6612
6613            if self.glGetFragDataIndex == ptr::null_mut() {
6614                _gl_impl_panic("glGetFragDataIndex");
6615                return -1;
6616            }
6617
6618            let c_string = encode_ascii(name);
6619
6620            unsafe {
6621                let func: extern "system" fn(GLuint, *const c_char) -> GLint = mem::transmute(self.glGetFragDataIndex);
6622                (func)(program, c_string.as_ptr())
6623            }
6624        }
6625
6626        // GL_KHR_debug
6627        $( $opt )? fn get_debug_messages(&self) -> Vec<DebugMessage> {
6628
6629
6630            #[cfg(feature = "debug")] { _gl_print_debug("glGetDebugMessageLog"); }
6631            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6632
6633            if self.glGetDebugMessageLog == ptr::null_mut() {
6634                _gl_impl_panic("glGetDebugMessageLog");
6635                return Vec::new();
6636            }
6637
6638            let mut max_message_len = [0];
6639            unsafe {
6640                self.get_integer_v(gl::MAX_DEBUG_MESSAGE_LENGTH, &mut max_message_len[..])
6641            }
6642
6643            let mut output = Vec::new();
6644            const CAPACITY: usize = 4;
6645
6646            let mut msg_data = vec![0u8; CAPACITY * max_message_len[0] as usize];
6647            let mut sources = [0 as GLenum; CAPACITY];
6648            let mut types = [0 as GLenum; CAPACITY];
6649            let mut severities = [0 as GLenum; CAPACITY];
6650            let mut ids = [0 as GLuint; CAPACITY];
6651            let mut lengths = [0 as GLsizei; CAPACITY];
6652
6653            loop {
6654                let count = unsafe {
6655                    let func: extern "system" fn(GLuint, GLsizei, *mut GLenum, *mut GLenum, *mut GLuint, *mut GLenum, *mut GLsizei, *mut GLchar) -> GLuint = mem::transmute(self.glGetDebugMessageLog);
6656                    (func)(
6657                        CAPACITY as _,
6658                        msg_data.len() as _,
6659                        sources.as_mut_ptr(),
6660                        types.as_mut_ptr(),
6661                        ids.as_mut_ptr(),
6662                        severities.as_mut_ptr(),
6663                        lengths.as_mut_ptr(),
6664                        msg_data.as_mut_ptr() as *mut _,
6665                    )
6666                };
6667
6668                let mut offset = 0;
6669                output.extend((0..count as usize).map(|i| {
6670                    let len = lengths[i] as usize;
6671                    let slice = &msg_data[offset..offset + len];
6672                    offset += len;
6673                    DebugMessage {
6674                        message: String::from_utf8_lossy(slice).to_string(),
6675                        source: sources[i],
6676                        ty: types[i],
6677                        id: ids[i],
6678                        severity: severities[i],
6679                    }
6680                }));
6681
6682                if (count as usize) < CAPACITY {
6683                    return output;
6684                }
6685            }
6686        }
6687
6688        $( $opt )? fn provoking_vertex_angle(&self, _mode: GLenum) {
6689
6690            #[cfg(feature = "debug")] { _gl_print_debug("glProvokingVertexAngle"); }
6691            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6692
6693            _gl_impl_panic("glProvokingVertexAngle"); // GLES only
6694            return;
6695        }
6696
6697        // GL_KHR_blend_equation_advanced
6698        $( $opt )? fn blend_barrier_khr(&self) {
6699
6700
6701            #[cfg(feature = "debug")] { _gl_print_debug("glBlendBarrierKHR"); }
6702            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6703
6704            if self.glBlendBarrierKHR == ptr::null_mut() {
6705                _gl_impl_panic("glBlendBarrierKHR");
6706                return;
6707            }
6708
6709            unsafe {
6710                let func: extern "system" fn() = mem::transmute(self.glBlendBarrierKHR);
6711                (func)();
6712            }
6713        }
6714
6715        // GL_CHROMIUM_copy_texture
6716        $( $opt )? fn copy_texture_chromium(&self,
6717            _source_id: GLuint, _source_level: GLint,
6718            _dest_target: GLenum, _dest_id: GLuint, _dest_level: GLint,
6719            _internal_format: GLint, _dest_type: GLenum,
6720            _unpack_flip_y: GLboolean, _unpack_premultiply_alpha: GLboolean, _unpack_unmultiply_alpha: GLboolean)
6721        {
6722            #[cfg(feature = "debug")] { _gl_print_debug("glCopyTextureChromium"); }
6723            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6724
6725            _gl_impl_panic("glCopyTextureChromium"); // GLES only
6726            return;
6727        }
6728        $( $opt )? fn copy_sub_texture_chromium(&self,
6729            _source_id: GLuint, _source_level: GLint,
6730            _dest_target: GLenum, _dest_id: GLuint, _dest_level: GLint,
6731            _x_offset: GLint, _y_offset: GLint, _x: GLint, _y: GLint, _width: GLsizei, _height: GLsizei,
6732            _unpack_flip_y: GLboolean, _unpack_premultiply_alpha: GLboolean, _unpack_unmultiply_alpha: GLboolean)
6733        {
6734            #[cfg(feature = "debug")] { _gl_print_debug("glCopySubTextureChromium"); }
6735            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6736
6737            _gl_impl_panic("glCopySubTextureChromium"); // GLES only
6738            return;
6739        }
6740
6741        // GL_ANGLE_copy_texture_3d
6742        $( $opt )? fn copy_texture_3d_angle(
6743            &self,
6744            _source_id: GLuint,
6745            _source_level: GLint,
6746            _dest_target: GLenum,
6747            _dest_id: GLuint,
6748            _dest_level: GLint,
6749            _internal_format: GLint,
6750            _dest_type: GLenum,
6751            _unpack_flip_y: GLboolean,
6752            _unpack_premultiply_alpha: GLboolean,
6753            _unpack_unmultiply_alpha: GLboolean,
6754        ) {
6755
6756            #[cfg(feature = "debug")] { _gl_print_debug("glANGLECopyTexture3D"); }
6757            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6758            _gl_impl_panic("glANGLECopyTexture3D"); // ANGLE only
6759            return;
6760        }
6761
6762        $( $opt )? fn copy_sub_texture_3d_angle(
6763            &self,
6764            _source_id: GLuint,
6765            _source_level: GLint,
6766            _dest_target: GLenum,
6767            _dest_id: GLuint,
6768            _dest_level: GLint,
6769            _x_offset: GLint,
6770            _y_offset: GLint,
6771            _z_offset: GLint,
6772            _x: GLint,
6773            _y: GLint,
6774            _z: GLint,
6775            _width: GLsizei,
6776            _height: GLsizei,
6777            _depth: GLsizei,
6778            _unpack_flip_y: GLboolean,
6779            _unpack_premultiply_alpha: GLboolean,
6780            _unpack_unmultiply_alpha: GLboolean,
6781        ) {
6782
6783            #[cfg(feature = "debug")] { _gl_print_debug("glANGLECopySubTexture3D"); }
6784            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6785
6786            _gl_impl_panic("glANGLECopySubTexture3D"); // ANGLE only
6787            // return;
6788        }
6789
6790        $( $opt )? fn buffer_storage(
6791            &self,
6792            target: GLenum,
6793            size: GLsizeiptr,
6794            data: *const GLvoid,
6795            flags: GLbitfield,
6796        ) {
6797
6798            #[cfg(feature = "debug")] { _gl_print_debug("glBufferStorage"); }
6799            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6800
6801            if self.glBufferStorage == ptr::null_mut() {
6802                _gl_impl_panic("glBufferStorage");
6803                return;
6804            }
6805
6806            unsafe {
6807                let func: extern "system" fn(GLenum, GLsizeiptr, *const GLvoid, GLbitfield) = mem::transmute(self.glBufferStorage);
6808                (func)(target, size, data, flags);
6809            }
6810        }
6811
6812        $( $opt )? fn flush_mapped_buffer_range(&self, target: GLenum, offset: GLintptr, length: GLsizeiptr) {
6813
6814
6815            #[cfg(feature = "debug")] { _gl_print_debug("glFlushMappedBufferRange"); }
6816            #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6817
6818            if self.glFlushMappedBufferRange == ptr::null_mut() {
6819                _gl_impl_panic("glFlushMappedBufferRange");
6820                return;
6821            }
6822
6823            unsafe {
6824                let func: extern "system" fn(GLenum, GLintptr, GLsizeiptr) = mem::transmute(self.glFlushMappedBufferRange);
6825                (func)(target, offset, length);
6826            }
6827        }
6828    };
6829}
6830
6831#[cfg(feature = "gleam_trait")]
6832impl gleam::gl::Gl for GenericGlContext {
6833    impl_gl_context!();
6834}
6835
6836#[cfg(not(feature = "gleam_trait"))]
6837#[allow(dead_code)]
6838impl GenericGlContext {
6839    impl_gl_context!(pub);
6840
6841    pub fn start_tiling_qcom(&self, x: GLuint, y: GLuint, width: GLuint, height: GLuint, preserve_mask: GLbitfield) {
6842
6843
6844        #[cfg(feature = "debug")] { _gl_print_debug("glStartTilingQCOM"); }
6845        #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6846
6847        if self.glStartTilingQCOM == ptr::null_mut() {
6848            _gl_impl_panic("glStartTilingQCOM");
6849            return;
6850        }
6851
6852        unsafe {
6853            let func: extern "system" fn(GLuint, GLuint, GLuint, GLuint, GLbitfield) = mem::transmute(self.glStartTilingQCOM);
6854            (func)(x, y, width, height, preserve_mask);
6855        }
6856    }
6857
6858    pub fn end_tiling_qcom(&self, preserve_mask: GLbitfield) {
6859
6860
6861        #[cfg(feature = "debug")] { _gl_print_debug("glEndTilingQCOM"); }
6862        #[cfg(feature = "error")] { _gl_check_for_last_error(self); }
6863
6864        if self.glEndTilingQCOM == ptr::null_mut() {
6865            _gl_impl_panic("glEndTilingQCOM");
6866            return;
6867        }
6868
6869        unsafe {
6870            let func: extern "system" fn(GLbitfield) = mem::transmute(self.glEndTilingQCOM);
6871            (func)(preserve_mask);
6872        }
6873    }
6874}
6875
6876
6877#[cfg(feature = "std")]
6878fn _gl_impl_panic(s: &str) { println!("OpenGL function not loaded: {}", s); }
6879
6880#[cfg(not(feature = "std"))]
6881#[inline(always)]
6882fn _gl_impl_panic(_s: &str) {  }
6883
6884#[cfg(feature = "debug")]
6885fn _gl_print_debug(s: &str) { println!("Called OpenGL function: {}", s); }
6886
6887#[cfg(feature = "error")]
6888fn _gl_check_for_last_error(gl: &GenericGlContext) {
6889    // if more than 20 errors occur at once, this likely indicates an infinite loop
6890    let mut error_count = 20;
6891    let mut last = gl.get_error();
6892    while last != gl::NO_ERROR && error_count > 0 {
6893        let e_string = match last {
6894            gl::INVALID_ENUM => "INVALID_ENUM".to_string(),
6895            gl::INVALID_VALUE => "INVALID_VALUE".to_string(),
6896            gl::INVALID_OPERATION => "INVALID_OPERATION".to_string(),
6897            gl::INVALID_FRAMEBUFFER_OPERATION => "INVALID_FRAMEBUFFER_OPERATION".to_string(),
6898            gl::OUT_OF_MEMORY => "OUT_OF_MEMORY".to_string(),
6899            gl::STACK_UNDERFLOW => "STACK_UNDERFLOW".to_string(),
6900            gl::STACK_OVERFLOW => "STACK_OVERFLOW".to_string(),
6901            _ => format!("Unknown error: {:0x}", last),
6902        };
6903
6904        println!("OPENGL ERROR OCCURRED: {}", e_string);
6905        last = gl.get_error();
6906        error_count -= 1;
6907    }
6908}