Browse Source

Add `vendor:OpenGL`

Based off a heavily modified version of: https://github.com/vassvik/odin-gl
gingerBill 4 years ago
parent
commit
0d3cbb8883

+ 21 - 0
vendor/OpenGL/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 vassvik
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 20 - 0
vendor/OpenGL/LICENSE_glad

@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 David Herberth
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 59 - 0
vendor/OpenGL/README.md

@@ -0,0 +1,59 @@
+# odin-gl: opengl loader in Odin
+
+Includes procedures to load OpenGL function pointers. Currently only supports the `core` profile, up to version 4.6. Based on the output from the [glad](https://github.com/Dav1dde/glad) webservice using 4.6 `core`.
+
+#### Note: You will be required to pass your own GetProcAddress equivalent (wglGetProcAddress, glXGetProcAddress, glfwGetProcAddress, etc.), for example:
+
+```go
+gl.load_up_to(4, 5, proc(p: rawptr, name: cstring) do (cast(^rawptr)p)^ = glfw.GetProcAddress(name); );
+```
+[odin-glfw](https://github.com/vassvik/odin-glfw) also provides a useful helper you can pass straight to `gl.load_up_to`:
+```go
+gl.load_up_to(4, 5, glfw.set_proc_address);
+```
+
+#### NOTE: It is recommended to put this into the shared collection:
+```
+cd /path/to/Odin/shared
+git clone https://github.com/vassvik/odin-gl.git
+```
+
+## Extra utility procedures (Outdated. See the end of `gl.odin`)
+
+Some useful helper procedures can be found in `helpers.odin`, for tasks such as:
+
+ - loading vertex, fragment and compute shaders (from source or files) using `load_shaders_file`, `load_shaders_source`, `load_compute_file` and `load_compute_source`
+ - grabbing uniform and attribute locations using `get_uniform_location` and `get_attribute_location`
+ - getting all active uniforms from a program using `get_uniforms_from_program`
+ - hot reloading of shaders (windows only right now) using `update_shader_if_changed` and `update_shader_if_changed_compute`
+
+## Debug mode
+
+Each `gl` call will be appended by a debug helper calling `glGetError()` if compiled with `-debug`. This can be useful to detect incorrect usage. Sample output (also outputting the NO_ERRORS case for the sake of showcasing): 
+
+```
+glGetError() returned NO_ERROR
+   call: glTexImage2D(GL_TEXTURE_2D=3553, 0, 34836, 1150, 1024, 0, GL_RGBA=6408, GL_FLOAT=5126, 0x0)
+   in:   C:/<snip>/texture.odin(156:23)
+glGetError() returned NO_ERROR
+   call: glEnable(GL_DEBUG_OUTPUT=37600)
+   in:   C:/<snip>/main.odin(185:6)
+glGetError() returned NO_ERROR
+   call: glGetError() -> 0 
+   in:   C:/<snip>/main.odin(193:5)
+glGetError() returned INVALID_ENUM
+   call: glEnable(INVALID_ENUM=123123123)
+   in:   C:/<snip>/main.odin(194:5)
+glGetError() returned INVALID_VALUE
+   call: glPointSize(-1.000)
+   in:   C:/<snip>/main.odin(195:5)
+glGetError() returned NO_ERROR
+   call: glDisable(GL_SCISSOR_TEST=3089)
+   in:   C:/<snip>/main.odin(270:6)
+glGetError() returned NO_ERROR
+   call: glViewport(0, 0, 1150, 1024)
+   in:   C:/<snip>/main.odin(271:6)
+glGetError() returned NO_ERROR
+   call: glClearColor(0.800, 0.800, 0.800, 1.000)
+   in:   C:/<snip>/main.odin(272:6)
+```

+ 1412 - 0
vendor/OpenGL/constants.odin

@@ -0,0 +1,1412 @@
+package odin_gl
+
+FALSE                          :: false;
+TRUE                           :: true;
+
+DEPTH_BUFFER_BIT               :: 0x00000100;
+STENCIL_BUFFER_BIT             :: 0x00000400;
+COLOR_BUFFER_BIT               :: 0x00004000;
+POINTS                         :: 0x0000;
+LINES                          :: 0x0001;
+LINE_LOOP                      :: 0x0002;
+LINE_STRIP                     :: 0x0003;
+TRIANGLES                      :: 0x0004;
+TRIANGLE_STRIP                 :: 0x0005;
+TRIANGLE_FAN                   :: 0x0006;
+QUADS                          :: 0x0007;
+NEVER                          :: 0x0200;
+LESS                           :: 0x0201;
+EQUAL                          :: 0x0202;
+LEQUAL                         :: 0x0203;
+GREATER                        :: 0x0204;
+NOTEQUAL                       :: 0x0205;
+GEQUAL                         :: 0x0206;
+ALWAYS                         :: 0x0207;
+ZERO                           :: 0;
+ONE                            :: 1;
+SRC_COLOR                      :: 0x0300;
+ONE_MINUS_SRC_COLOR            :: 0x0301;
+SRC_ALPHA                      :: 0x0302;
+ONE_MINUS_SRC_ALPHA            :: 0x0303;
+DST_ALPHA                      :: 0x0304;
+ONE_MINUS_DST_ALPHA            :: 0x0305;
+DST_COLOR                      :: 0x0306;
+ONE_MINUS_DST_COLOR            :: 0x0307;
+SRC_ALPHA_SATURATE             :: 0x0308;
+NONE                           :: 0;
+FRONT_LEFT                     :: 0x0400;
+FRONT_RIGHT                    :: 0x0401;
+BACK_LEFT                      :: 0x0402;
+BACK_RIGHT                     :: 0x0403;
+FRONT                          :: 0x0404;
+BACK                           :: 0x0405;
+LEFT                           :: 0x0406;
+RIGHT                          :: 0x0407;
+FRONT_AND_BACK                 :: 0x0408;
+NO_ERROR                       :: 0;
+INVALID_ENUM                   :: 0x0500;
+INVALID_VALUE                  :: 0x0501;
+INVALID_OPERATION              :: 0x0502;
+OUT_OF_MEMORY                  :: 0x0505;
+CW                             :: 0x0900;
+CCW                            :: 0x0901;
+POINT_SIZE                     :: 0x0B11;
+POINT_SIZE_RANGE               :: 0x0B12;
+POINT_SIZE_GRANULARITY         :: 0x0B13;
+LINE_SMOOTH                    :: 0x0B20;
+LINE_WIDTH                     :: 0x0B21;
+LINE_WIDTH_RANGE               :: 0x0B22;
+LINE_WIDTH_GRANULARITY         :: 0x0B23;
+POLYGON_MODE                   :: 0x0B40;
+POLYGON_SMOOTH                 :: 0x0B41;
+CULL_FACE                      :: 0x0B44;
+CULL_FACE_MODE                 :: 0x0B45;
+FRONT_FACE                     :: 0x0B46;
+DEPTH_RANGE                    :: 0x0B70;
+DEPTH_TEST                     :: 0x0B71;
+DEPTH_WRITEMASK                :: 0x0B72;
+DEPTH_CLEAR_VALUE              :: 0x0B73;
+DEPTH_FUNC                     :: 0x0B74;
+STENCIL_TEST                   :: 0x0B90;
+STENCIL_CLEAR_VALUE            :: 0x0B91;
+STENCIL_FUNC                   :: 0x0B92;
+STENCIL_VALUE_MASK             :: 0x0B93;
+STENCIL_FAIL                   :: 0x0B94;
+STENCIL_PASS_DEPTH_FAIL        :: 0x0B95;
+STENCIL_PASS_DEPTH_PASS        :: 0x0B96;
+STENCIL_REF                    :: 0x0B97;
+STENCIL_WRITEMASK              :: 0x0B98;
+VIEWPORT                       :: 0x0BA2;
+DITHER                         :: 0x0BD0;
+BLEND_DST                      :: 0x0BE0;
+BLEND_SRC                      :: 0x0BE1;
+BLEND                          :: 0x0BE2;
+LOGIC_OP_MODE                  :: 0x0BF0;
+COLOR_LOGIC_OP                 :: 0x0BF2;
+DRAW_BUFFER                    :: 0x0C01;
+READ_BUFFER                    :: 0x0C02;
+SCISSOR_BOX                    :: 0x0C10;
+SCISSOR_TEST                   :: 0x0C11;
+COLOR_CLEAR_VALUE              :: 0x0C22;
+COLOR_WRITEMASK                :: 0x0C23;
+DOUBLEBUFFER                   :: 0x0C32;
+STEREO                         :: 0x0C33;
+LINE_SMOOTH_HINT               :: 0x0C52;
+POLYGON_SMOOTH_HINT            :: 0x0C53;
+UNPACK_SWAP_BYTES              :: 0x0CF0;
+UNPACK_LSB_FIRST               :: 0x0CF1;
+UNPACK_ROW_LENGTH              :: 0x0CF2;
+UNPACK_SKIP_ROWS               :: 0x0CF3;
+UNPACK_SKIP_PIXELS             :: 0x0CF4;
+UNPACK_ALIGNMENT               :: 0x0CF5;
+PACK_SWAP_BYTES                :: 0x0D00;
+PACK_LSB_FIRST                 :: 0x0D01;
+PACK_ROW_LENGTH                :: 0x0D02;
+PACK_SKIP_ROWS                 :: 0x0D03;
+PACK_SKIP_PIXELS               :: 0x0D04;
+PACK_ALIGNMENT                 :: 0x0D05;
+MAX_TEXTURE_SIZE               :: 0x0D33;
+MAX_VIEWPORT_DIMS              :: 0x0D3A;
+SUBPIXEL_BITS                  :: 0x0D50;
+TEXTURE_1D                     :: 0x0DE0;
+TEXTURE_2D                     :: 0x0DE1;
+POLYGON_OFFSET_UNITS           :: 0x2A00;
+POLYGON_OFFSET_POINT           :: 0x2A01;
+POLYGON_OFFSET_LINE            :: 0x2A02;
+POLYGON_OFFSET_FILL            :: 0x8037;
+POLYGON_OFFSET_FACTOR          :: 0x8038;
+TEXTURE_BINDING_1D             :: 0x8068;
+TEXTURE_BINDING_2D             :: 0x8069;
+TEXTURE_WIDTH                  :: 0x1000;
+TEXTURE_HEIGHT                 :: 0x1001;
+TEXTURE_INTERNAL_FORMAT        :: 0x1003;
+TEXTURE_BORDER_COLOR           :: 0x1004;
+TEXTURE_RED_SIZE               :: 0x805C;
+TEXTURE_GREEN_SIZE             :: 0x805D;
+TEXTURE_BLUE_SIZE              :: 0x805E;
+TEXTURE_ALPHA_SIZE             :: 0x805F;
+DONT_CARE                      :: 0x1100;
+FASTEST                        :: 0x1101;
+NICEST                         :: 0x1102;
+BYTE                           :: 0x1400;
+UNSIGNED_BYTE                  :: 0x1401;
+SHORT                          :: 0x1402;
+UNSIGNED_SHORT                 :: 0x1403;
+INT                            :: 0x1404;
+UNSIGNED_INT                   :: 0x1405;
+FLOAT                          :: 0x1406;
+DOUBLE                         :: 0x140A;
+STACK_OVERFLOW                 :: 0x0503;
+STACK_UNDERFLOW                :: 0x0504;
+CLEAR                          :: 0x1500;
+AND                            :: 0x1501;
+AND_REVERSE                    :: 0x1502;
+COPY                           :: 0x1503;
+AND_INVERTED                   :: 0x1504;
+NOOP                           :: 0x1505;
+XOR                            :: 0x1506;
+OR                             :: 0x1507;
+NOR                            :: 0x1508;
+EQUIV                          :: 0x1509;
+INVERT                         :: 0x150A;
+OR_REVERSE                     :: 0x150B;
+COPY_INVERTED                  :: 0x150C;
+OR_INVERTED                    :: 0x150D;
+NAND                           :: 0x150E;
+SET                            :: 0x150F;
+TEXTURE                        :: 0x1702;
+COLOR                          :: 0x1800;
+DEPTH                          :: 0x1801;
+STENCIL                        :: 0x1802;
+STENCIL_INDEX                  :: 0x1901;
+DEPTH_COMPONENT                :: 0x1902;
+RED                            :: 0x1903;
+GREEN                          :: 0x1904;
+BLUE                           :: 0x1905;
+ALPHA                          :: 0x1906;
+RGB                            :: 0x1907;
+RGBA                           :: 0x1908;
+POINT                          :: 0x1B00;
+LINE                           :: 0x1B01;
+FILL                           :: 0x1B02;
+KEEP                           :: 0x1E00;
+REPLACE                        :: 0x1E01;
+INCR                           :: 0x1E02;
+DECR                           :: 0x1E03;
+VENDOR                         :: 0x1F00;
+RENDERER                       :: 0x1F01;
+VERSION                        :: 0x1F02;
+EXTENSIONS                     :: 0x1F03;
+NEAREST                        :: 0x2600;
+LINEAR                         :: 0x2601;
+NEAREST_MIPMAP_NEAREST         :: 0x2700;
+LINEAR_MIPMAP_NEAREST          :: 0x2701;
+NEAREST_MIPMAP_LINEAR          :: 0x2702;
+LINEAR_MIPMAP_LINEAR           :: 0x2703;
+TEXTURE_MAG_FILTER             :: 0x2800;
+TEXTURE_MIN_FILTER             :: 0x2801;
+TEXTURE_WRAP_S                 :: 0x2802;
+TEXTURE_WRAP_T                 :: 0x2803;
+PROXY_TEXTURE_1D               :: 0x8063;
+PROXY_TEXTURE_2D               :: 0x8064;
+REPEAT                         :: 0x2901;
+R3_G3_B2                       :: 0x2A10;
+RGB4                           :: 0x804F;
+RGB5                           :: 0x8050;
+RGB8                           :: 0x8051;
+RGB10                          :: 0x8052;
+RGB12                          :: 0x8053;
+RGB16                          :: 0x8054;
+RGBA2                          :: 0x8055;
+RGBA4                          :: 0x8056;
+RGB5_A1                        :: 0x8057;
+RGBA8                          :: 0x8058;
+RGB10_A2                       :: 0x8059;
+RGBA12                         :: 0x805A;
+RGBA16                         :: 0x805B;
+VERTEX_ARRAY                   :: 0x8074;
+
+UNSIGNED_BYTE_3_3_2            :: 0x8032;
+UNSIGNED_SHORT_4_4_4_4         :: 0x8033;
+UNSIGNED_SHORT_5_5_5_1         :: 0x8034;
+UNSIGNED_INT_8_8_8_8           :: 0x8035;
+UNSIGNED_INT_10_10_10_2        :: 0x8036;
+TEXTURE_BINDING_3D             :: 0x806A;
+PACK_SKIP_IMAGES               :: 0x806B;
+PACK_IMAGE_HEIGHT              :: 0x806C;
+UNPACK_SKIP_IMAGES             :: 0x806D;
+UNPACK_IMAGE_HEIGHT            :: 0x806E;
+TEXTURE_3D                     :: 0x806F;
+PROXY_TEXTURE_3D               :: 0x8070;
+TEXTURE_DEPTH                  :: 0x8071;
+TEXTURE_WRAP_R                 :: 0x8072;
+MAX_3D_TEXTURE_SIZE            :: 0x8073;
+UNSIGNED_BYTE_2_3_3_REV        :: 0x8362;
+UNSIGNED_SHORT_5_6_5           :: 0x8363;
+UNSIGNED_SHORT_5_6_5_REV       :: 0x8364;
+UNSIGNED_SHORT_4_4_4_4_REV     :: 0x8365;
+UNSIGNED_SHORT_1_5_5_5_REV     :: 0x8366;
+UNSIGNED_INT_8_8_8_8_REV       :: 0x8367;
+UNSIGNED_INT_2_10_10_10_REV    :: 0x8368;
+BGR                            :: 0x80E0;
+BGRA                           :: 0x80E1;
+MAX_ELEMENTS_VERTICES          :: 0x80E8;
+MAX_ELEMENTS_INDICES           :: 0x80E9;
+CLAMP_TO_EDGE                  :: 0x812F;
+TEXTURE_MIN_LOD                :: 0x813A;
+TEXTURE_MAX_LOD                :: 0x813B;
+TEXTURE_BASE_LEVEL             :: 0x813C;
+TEXTURE_MAX_LEVEL              :: 0x813D;
+SMOOTH_POINT_SIZE_RANGE        :: 0x0B12;
+SMOOTH_POINT_SIZE_GRANULARITY  :: 0x0B13;
+SMOOTH_LINE_WIDTH_RANGE        :: 0x0B22;
+SMOOTH_LINE_WIDTH_GRANULARITY  :: 0x0B23;
+ALIASED_LINE_WIDTH_RANGE       :: 0x846E;
+
+TEXTURE0                       :: 0x84C0;
+TEXTURE1                       :: 0x84C1;
+TEXTURE2                       :: 0x84C2;
+TEXTURE3                       :: 0x84C3;
+TEXTURE4                       :: 0x84C4;
+TEXTURE5                       :: 0x84C5;
+TEXTURE6                       :: 0x84C6;
+TEXTURE7                       :: 0x84C7;
+TEXTURE8                       :: 0x84C8;
+TEXTURE9                       :: 0x84C9;
+TEXTURE10                      :: 0x84CA;
+TEXTURE11                      :: 0x84CB;
+TEXTURE12                      :: 0x84CC;
+TEXTURE13                      :: 0x84CD;
+TEXTURE14                      :: 0x84CE;
+TEXTURE15                      :: 0x84CF;
+TEXTURE16                      :: 0x84D0;
+TEXTURE17                      :: 0x84D1;
+TEXTURE18                      :: 0x84D2;
+TEXTURE19                      :: 0x84D3;
+TEXTURE20                      :: 0x84D4;
+TEXTURE21                      :: 0x84D5;
+TEXTURE22                      :: 0x84D6;
+TEXTURE23                      :: 0x84D7;
+TEXTURE24                      :: 0x84D8;
+TEXTURE25                      :: 0x84D9;
+TEXTURE26                      :: 0x84DA;
+TEXTURE27                      :: 0x84DB;
+TEXTURE28                      :: 0x84DC;
+TEXTURE29                      :: 0x84DD;
+TEXTURE30                      :: 0x84DE;
+TEXTURE31                      :: 0x84DF;
+ACTIVE_TEXTURE                 :: 0x84E0;
+MULTISAMPLE                    :: 0x809D;
+SAMPLE_ALPHA_TO_COVERAGE       :: 0x809E;
+SAMPLE_ALPHA_TO_ONE            :: 0x809F;
+SAMPLE_COVERAGE                :: 0x80A0;
+SAMPLE_BUFFERS                 :: 0x80A8;
+SAMPLES                        :: 0x80A9;
+SAMPLE_COVERAGE_VALUE          :: 0x80AA;
+SAMPLE_COVERAGE_INVERT         :: 0x80AB;
+TEXTURE_CUBE_MAP               :: 0x8513;
+TEXTURE_BINDING_CUBE_MAP       :: 0x8514;
+TEXTURE_CUBE_MAP_POSITIVE_X    :: 0x8515;
+TEXTURE_CUBE_MAP_NEGATIVE_X    :: 0x8516;
+TEXTURE_CUBE_MAP_POSITIVE_Y    :: 0x8517;
+TEXTURE_CUBE_MAP_NEGATIVE_Y    :: 0x8518;
+TEXTURE_CUBE_MAP_POSITIVE_Z    :: 0x8519;
+TEXTURE_CUBE_MAP_NEGATIVE_Z    :: 0x851A;
+PROXY_TEXTURE_CUBE_MAP         :: 0x851B;
+MAX_CUBE_MAP_TEXTURE_SIZE      :: 0x851C;
+COMPRESSED_RGB                 :: 0x84ED;
+COMPRESSED_RGBA                :: 0x84EE;
+TEXTURE_COMPRESSION_HINT       :: 0x84EF;
+TEXTURE_COMPRESSED_IMAGE_SIZE  :: 0x86A0;
+TEXTURE_COMPRESSED             :: 0x86A1;
+NUM_COMPRESSED_TEXTURE_FORMATS :: 0x86A2;
+COMPRESSED_TEXTURE_FORMATS     :: 0x86A3;
+CLAMP_TO_BORDER                :: 0x812D;
+
+BLEND_DST_RGB                  :: 0x80C8;
+BLEND_SRC_RGB                  :: 0x80C9;
+BLEND_DST_ALPHA                :: 0x80CA;
+BLEND_SRC_ALPHA                :: 0x80CB;
+POINT_FADE_THRESHOLD_SIZE      :: 0x8128;
+DEPTH_COMPONENT16              :: 0x81A5;
+DEPTH_COMPONENT24              :: 0x81A6;
+DEPTH_COMPONENT32              :: 0x81A7;
+MIRRORED_REPEAT                :: 0x8370;
+MAX_TEXTURE_LOD_BIAS           :: 0x84FD;
+TEXTURE_LOD_BIAS               :: 0x8501;
+INCR_WRAP                      :: 0x8507;
+DECR_WRAP                      :: 0x8508;
+TEXTURE_DEPTH_SIZE             :: 0x884A;
+TEXTURE_COMPARE_MODE           :: 0x884C;
+TEXTURE_COMPARE_FUNC           :: 0x884D;
+FUNC_ADD                       :: 0x8006;
+FUNC_SUBTRACT                  :: 0x800A;
+FUNC_REVERSE_SUBTRACT          :: 0x800B;
+MIN                            :: 0x8007;
+MAX                            :: 0x8008;
+CONSTANT_COLOR                 :: 0x8001;
+ONE_MINUS_CONSTANT_COLOR       :: 0x8002;
+CONSTANT_ALPHA                 :: 0x8003;
+ONE_MINUS_CONSTANT_ALPHA       :: 0x8004;
+
+BUFFER_SIZE                    :: 0x8764;
+BUFFER_USAGE                   :: 0x8765;
+QUERY_COUNTER_BITS             :: 0x8864;
+CURRENT_QUERY                  :: 0x8865;
+QUERY_RESULT                   :: 0x8866;
+QUERY_RESULT_AVAILABLE         :: 0x8867;
+ARRAY_BUFFER                   :: 0x8892;
+ELEMENT_ARRAY_BUFFER           :: 0x8893;
+ARRAY_BUFFER_BINDING           :: 0x8894;
+ELEMENT_ARRAY_BUFFER_BINDING   :: 0x8895;
+VERTEX_ATTRIB_ARRAY_BUFFER_BINDING :: 0x889F;
+READ_ONLY                      :: 0x88B8;
+WRITE_ONLY                     :: 0x88B9;
+READ_WRITE                     :: 0x88BA;
+BUFFER_ACCESS                  :: 0x88BB;
+BUFFER_MAPPED                  :: 0x88BC;
+BUFFER_MAP_POINTER             :: 0x88BD;
+STREAM_DRAW                    :: 0x88E0;
+STREAM_READ                    :: 0x88E1;
+STREAM_COPY                    :: 0x88E2;
+STATIC_DRAW                    :: 0x88E4;
+STATIC_READ                    :: 0x88E5;
+STATIC_COPY                    :: 0x88E6;
+DYNAMIC_DRAW                   :: 0x88E8;
+DYNAMIC_READ                   :: 0x88E9;
+DYNAMIC_COPY                   :: 0x88EA;
+SAMPLES_PASSED                 :: 0x8914;
+SRC1_ALPHA                     :: 0x8589;
+
+BLEND_EQUATION_RGB             :: 0x8009;
+VERTEX_ATTRIB_ARRAY_ENABLED    :: 0x8622;
+VERTEX_ATTRIB_ARRAY_SIZE       :: 0x8623;
+VERTEX_ATTRIB_ARRAY_STRIDE     :: 0x8624;
+VERTEX_ATTRIB_ARRAY_TYPE       :: 0x8625;
+CURRENT_VERTEX_ATTRIB          :: 0x8626;
+VERTEX_PROGRAM_POINT_SIZE      :: 0x8642;
+VERTEX_ATTRIB_ARRAY_POINTER    :: 0x8645;
+STENCIL_BACK_FUNC              :: 0x8800;
+STENCIL_BACK_FAIL              :: 0x8801;
+STENCIL_BACK_PASS_DEPTH_FAIL   :: 0x8802;
+STENCIL_BACK_PASS_DEPTH_PASS   :: 0x8803;
+MAX_DRAW_BUFFERS               :: 0x8824;
+DRAW_BUFFER0                   :: 0x8825;
+DRAW_BUFFER1                   :: 0x8826;
+DRAW_BUFFER2                   :: 0x8827;
+DRAW_BUFFER3                   :: 0x8828;
+DRAW_BUFFER4                   :: 0x8829;
+DRAW_BUFFER5                   :: 0x882A;
+DRAW_BUFFER6                   :: 0x882B;
+DRAW_BUFFER7                   :: 0x882C;
+DRAW_BUFFER8                   :: 0x882D;
+DRAW_BUFFER9                   :: 0x882E;
+DRAW_BUFFER10                  :: 0x882F;
+DRAW_BUFFER11                  :: 0x8830;
+DRAW_BUFFER12                  :: 0x8831;
+DRAW_BUFFER13                  :: 0x8832;
+DRAW_BUFFER14                  :: 0x8833;
+DRAW_BUFFER15                  :: 0x8834;
+BLEND_EQUATION_ALPHA           :: 0x883D;
+MAX_VERTEX_ATTRIBS             :: 0x8869;
+VERTEX_ATTRIB_ARRAY_NORMALIZED :: 0x886A;
+MAX_TEXTURE_IMAGE_UNITS        :: 0x8872;
+FRAGMENT_SHADER                :: 0x8B30;
+VERTEX_SHADER                  :: 0x8B31;
+MAX_FRAGMENT_UNIFORM_COMPONENTS :: 0x8B49;
+MAX_VERTEX_UNIFORM_COMPONENTS  :: 0x8B4A;
+MAX_VARYING_FLOATS             :: 0x8B4B;
+MAX_VERTEX_TEXTURE_IMAGE_UNITS :: 0x8B4C;
+MAX_COMBINED_TEXTURE_IMAGE_UNITS :: 0x8B4D;
+SHADER_TYPE                    :: 0x8B4F;
+FLOAT_VEC2                     :: 0x8B50;
+FLOAT_VEC3                     :: 0x8B51;
+FLOAT_VEC4                     :: 0x8B52;
+INT_VEC2                       :: 0x8B53;
+INT_VEC3                       :: 0x8B54;
+INT_VEC4                       :: 0x8B55;
+BOOL                           :: 0x8B56;
+BOOL_VEC2                      :: 0x8B57;
+BOOL_VEC3                      :: 0x8B58;
+BOOL_VEC4                      :: 0x8B59;
+FLOAT_MAT2                     :: 0x8B5A;
+FLOAT_MAT3                     :: 0x8B5B;
+FLOAT_MAT4                     :: 0x8B5C;
+SAMPLER_1D                     :: 0x8B5D;
+SAMPLER_2D                     :: 0x8B5E;
+SAMPLER_3D                     :: 0x8B5F;
+SAMPLER_CUBE                   :: 0x8B60;
+SAMPLER_1D_SHADOW              :: 0x8B61;
+SAMPLER_2D_SHADOW              :: 0x8B62;
+DELETE_STATUS                  :: 0x8B80;
+COMPILE_STATUS                 :: 0x8B81;
+LINK_STATUS                    :: 0x8B82;
+VALIDATE_STATUS                :: 0x8B83;
+INFO_LOG_LENGTH                :: 0x8B84;
+ATTACHED_SHADERS               :: 0x8B85;
+ACTIVE_UNIFORMS                :: 0x8B86;
+ACTIVE_UNIFORM_MAX_LENGTH      :: 0x8B87;
+SHADER_SOURCE_LENGTH           :: 0x8B88;
+ACTIVE_ATTRIBUTES              :: 0x8B89;
+ACTIVE_ATTRIBUTE_MAX_LENGTH    :: 0x8B8A;
+FRAGMENT_SHADER_DERIVATIVE_HINT :: 0x8B8B;
+SHADING_LANGUAGE_VERSION       :: 0x8B8C;
+CURRENT_PROGRAM                :: 0x8B8D;
+POINT_SPRITE_COORD_ORIGIN      :: 0x8CA0;
+LOWER_LEFT                     :: 0x8CA1;
+UPPER_LEFT                     :: 0x8CA2;
+STENCIL_BACK_REF               :: 0x8CA3;
+STENCIL_BACK_VALUE_MASK        :: 0x8CA4;
+STENCIL_BACK_WRITEMASK         :: 0x8CA5;
+
+PIXEL_PACK_BUFFER              :: 0x88EB;
+PIXEL_UNPACK_BUFFER            :: 0x88EC;
+PIXEL_PACK_BUFFER_BINDING      :: 0x88ED;
+PIXEL_UNPACK_BUFFER_BINDING    :: 0x88EF;
+FLOAT_MAT2x3                   :: 0x8B65;
+FLOAT_MAT2x4                   :: 0x8B66;
+FLOAT_MAT3x2                   :: 0x8B67;
+FLOAT_MAT3x4                   :: 0x8B68;
+FLOAT_MAT4x2                   :: 0x8B69;
+FLOAT_MAT4x3                   :: 0x8B6A;
+SRGB                           :: 0x8C40;
+SRGB8                          :: 0x8C41;
+SRGB_ALPHA                     :: 0x8C42;
+SRGB8_ALPHA8                   :: 0x8C43;
+COMPRESSED_SRGB                :: 0x8C48;
+COMPRESSED_SRGB_ALPHA          :: 0x8C49;
+
+COMPARE_REF_TO_TEXTURE         :: 0x884E;
+CLIP_DISTANCE0                 :: 0x3000;
+CLIP_DISTANCE1                 :: 0x3001;
+CLIP_DISTANCE2                 :: 0x3002;
+CLIP_DISTANCE3                 :: 0x3003;
+CLIP_DISTANCE4                 :: 0x3004;
+CLIP_DISTANCE5                 :: 0x3005;
+CLIP_DISTANCE6                 :: 0x3006;
+CLIP_DISTANCE7                 :: 0x3007;
+MAX_CLIP_DISTANCES             :: 0x0D32;
+MAJOR_VERSION                  :: 0x821B;
+MINOR_VERSION                  :: 0x821C;
+NUM_EXTENSIONS                 :: 0x821D;
+CONTEXT_FLAGS                  :: 0x821E;
+COMPRESSED_RED                 :: 0x8225;
+COMPRESSED_RG                  :: 0x8226;
+CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT :: 0x00000001;
+RGBA32F                        :: 0x8814;
+RGB32F                         :: 0x8815;
+RGBA16F                        :: 0x881A;
+RGB16F                         :: 0x881B;
+VERTEX_ATTRIB_ARRAY_INTEGER    :: 0x88FD;
+MAX_ARRAY_TEXTURE_LAYERS       :: 0x88FF;
+MIN_PROGRAM_TEXEL_OFFSET       :: 0x8904;
+MAX_PROGRAM_TEXEL_OFFSET       :: 0x8905;
+CLAMP_READ_COLOR               :: 0x891C;
+FIXED_ONLY                     :: 0x891D;
+MAX_VARYING_COMPONENTS         :: 0x8B4B;
+TEXTURE_1D_ARRAY               :: 0x8C18;
+PROXY_TEXTURE_1D_ARRAY         :: 0x8C19;
+TEXTURE_2D_ARRAY               :: 0x8C1A;
+PROXY_TEXTURE_2D_ARRAY         :: 0x8C1B;
+TEXTURE_BINDING_1D_ARRAY       :: 0x8C1C;
+TEXTURE_BINDING_2D_ARRAY       :: 0x8C1D;
+R11F_G11F_B10F                 :: 0x8C3A;
+UNSIGNED_INT_10F_11F_11F_REV   :: 0x8C3B;
+RGB9_E5                        :: 0x8C3D;
+UNSIGNED_INT_5_9_9_9_REV       :: 0x8C3E;
+TEXTURE_SHARED_SIZE            :: 0x8C3F;
+TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH :: 0x8C76;
+TRANSFORM_FEEDBACK_BUFFER_MODE :: 0x8C7F;
+MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS :: 0x8C80;
+TRANSFORM_FEEDBACK_VARYINGS    :: 0x8C83;
+TRANSFORM_FEEDBACK_BUFFER_START :: 0x8C84;
+TRANSFORM_FEEDBACK_BUFFER_SIZE :: 0x8C85;
+PRIMITIVES_GENERATED           :: 0x8C87;
+TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN :: 0x8C88;
+RASTERIZER_DISCARD             :: 0x8C89;
+MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS :: 0x8C8A;
+MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS :: 0x8C8B;
+INTERLEAVED_ATTRIBS            :: 0x8C8C;
+SEPARATE_ATTRIBS               :: 0x8C8D;
+TRANSFORM_FEEDBACK_BUFFER      :: 0x8C8E;
+TRANSFORM_FEEDBACK_BUFFER_BINDING :: 0x8C8F;
+RGBA32UI                       :: 0x8D70;
+RGB32UI                        :: 0x8D71;
+RGBA16UI                       :: 0x8D76;
+RGB16UI                        :: 0x8D77;
+RGBA8UI                        :: 0x8D7C;
+RGB8UI                         :: 0x8D7D;
+RGBA32I                        :: 0x8D82;
+RGB32I                         :: 0x8D83;
+RGBA16I                        :: 0x8D88;
+RGB16I                         :: 0x8D89;
+RGBA8I                         :: 0x8D8E;
+RGB8I                          :: 0x8D8F;
+RED_INTEGER                    :: 0x8D94;
+GREEN_INTEGER                  :: 0x8D95;
+BLUE_INTEGER                   :: 0x8D96;
+RGB_INTEGER                    :: 0x8D98;
+RGBA_INTEGER                   :: 0x8D99;
+BGR_INTEGER                    :: 0x8D9A;
+BGRA_INTEGER                   :: 0x8D9B;
+SAMPLER_1D_ARRAY               :: 0x8DC0;
+SAMPLER_2D_ARRAY               :: 0x8DC1;
+SAMPLER_1D_ARRAY_SHADOW        :: 0x8DC3;
+SAMPLER_2D_ARRAY_SHADOW        :: 0x8DC4;
+SAMPLER_CUBE_SHADOW            :: 0x8DC5;
+UNSIGNED_INT_VEC2              :: 0x8DC6;
+UNSIGNED_INT_VEC3              :: 0x8DC7;
+UNSIGNED_INT_VEC4              :: 0x8DC8;
+INT_SAMPLER_1D                 :: 0x8DC9;
+INT_SAMPLER_2D                 :: 0x8DCA;
+INT_SAMPLER_3D                 :: 0x8DCB;
+INT_SAMPLER_CUBE               :: 0x8DCC;
+INT_SAMPLER_1D_ARRAY           :: 0x8DCE;
+INT_SAMPLER_2D_ARRAY           :: 0x8DCF;
+UNSIGNED_INT_SAMPLER_1D        :: 0x8DD1;
+UNSIGNED_INT_SAMPLER_2D        :: 0x8DD2;
+UNSIGNED_INT_SAMPLER_3D        :: 0x8DD3;
+UNSIGNED_INT_SAMPLER_CUBE      :: 0x8DD4;
+UNSIGNED_INT_SAMPLER_1D_ARRAY  :: 0x8DD6;
+UNSIGNED_INT_SAMPLER_2D_ARRAY  :: 0x8DD7;
+QUERY_WAIT                     :: 0x8E13;
+QUERY_NO_WAIT                  :: 0x8E14;
+QUERY_BY_REGION_WAIT           :: 0x8E15;
+QUERY_BY_REGION_NO_WAIT        :: 0x8E16;
+BUFFER_ACCESS_FLAGS            :: 0x911F;
+BUFFER_MAP_LENGTH              :: 0x9120;
+BUFFER_MAP_OFFSET              :: 0x9121;
+DEPTH_COMPONENT32F             :: 0x8CAC;
+DEPTH32F_STENCIL8              :: 0x8CAD;
+FLOAT_32_UNSIGNED_INT_24_8_REV :: 0x8DAD;
+INVALID_FRAMEBUFFER_OPERATION  :: 0x0506;
+FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING :: 0x8210;
+FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE :: 0x8211;
+FRAMEBUFFER_ATTACHMENT_RED_SIZE :: 0x8212;
+FRAMEBUFFER_ATTACHMENT_GREEN_SIZE :: 0x8213;
+FRAMEBUFFER_ATTACHMENT_BLUE_SIZE :: 0x8214;
+FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE :: 0x8215;
+FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE :: 0x8216;
+FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE :: 0x8217;
+FRAMEBUFFER_DEFAULT            :: 0x8218;
+FRAMEBUFFER_UNDEFINED          :: 0x8219;
+DEPTH_STENCIL_ATTACHMENT       :: 0x821A;
+MAX_RENDERBUFFER_SIZE          :: 0x84E8;
+DEPTH_STENCIL                  :: 0x84F9;
+UNSIGNED_INT_24_8              :: 0x84FA;
+DEPTH24_STENCIL8               :: 0x88F0;
+TEXTURE_STENCIL_SIZE           :: 0x88F1;
+TEXTURE_RED_TYPE               :: 0x8C10;
+TEXTURE_GREEN_TYPE             :: 0x8C11;
+TEXTURE_BLUE_TYPE              :: 0x8C12;
+TEXTURE_ALPHA_TYPE             :: 0x8C13;
+TEXTURE_DEPTH_TYPE             :: 0x8C16;
+UNSIGNED_NORMALIZED            :: 0x8C17;
+FRAMEBUFFER_BINDING            :: 0x8CA6;
+DRAW_FRAMEBUFFER_BINDING       :: 0x8CA6;
+RENDERBUFFER_BINDING           :: 0x8CA7;
+READ_FRAMEBUFFER               :: 0x8CA8;
+DRAW_FRAMEBUFFER               :: 0x8CA9;
+READ_FRAMEBUFFER_BINDING       :: 0x8CAA;
+RENDERBUFFER_SAMPLES           :: 0x8CAB;
+FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE :: 0x8CD0;
+FRAMEBUFFER_ATTACHMENT_OBJECT_NAME :: 0x8CD1;
+FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL :: 0x8CD2;
+FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE :: 0x8CD3;
+FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER :: 0x8CD4;
+FRAMEBUFFER_COMPLETE           :: 0x8CD5;
+FRAMEBUFFER_INCOMPLETE_ATTACHMENT :: 0x8CD6;
+FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT :: 0x8CD7;
+FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER :: 0x8CDB;
+FRAMEBUFFER_INCOMPLETE_READ_BUFFER :: 0x8CDC;
+FRAMEBUFFER_UNSUPPORTED        :: 0x8CDD;
+MAX_COLOR_ATTACHMENTS          :: 0x8CDF;
+COLOR_ATTACHMENT0              :: 0x8CE0;
+COLOR_ATTACHMENT1              :: 0x8CE1;
+COLOR_ATTACHMENT2              :: 0x8CE2;
+COLOR_ATTACHMENT3              :: 0x8CE3;
+COLOR_ATTACHMENT4              :: 0x8CE4;
+COLOR_ATTACHMENT5              :: 0x8CE5;
+COLOR_ATTACHMENT6              :: 0x8CE6;
+COLOR_ATTACHMENT7              :: 0x8CE7;
+COLOR_ATTACHMENT8              :: 0x8CE8;
+COLOR_ATTACHMENT9              :: 0x8CE9;
+COLOR_ATTACHMENT10             :: 0x8CEA;
+COLOR_ATTACHMENT11             :: 0x8CEB;
+COLOR_ATTACHMENT12             :: 0x8CEC;
+COLOR_ATTACHMENT13             :: 0x8CED;
+COLOR_ATTACHMENT14             :: 0x8CEE;
+COLOR_ATTACHMENT15             :: 0x8CEF;
+COLOR_ATTACHMENT16             :: 0x8CF0;
+COLOR_ATTACHMENT17             :: 0x8CF1;
+COLOR_ATTACHMENT18             :: 0x8CF2;
+COLOR_ATTACHMENT19             :: 0x8CF3;
+COLOR_ATTACHMENT20             :: 0x8CF4;
+COLOR_ATTACHMENT21             :: 0x8CF5;
+COLOR_ATTACHMENT22             :: 0x8CF6;
+COLOR_ATTACHMENT23             :: 0x8CF7;
+COLOR_ATTACHMENT24             :: 0x8CF8;
+COLOR_ATTACHMENT25             :: 0x8CF9;
+COLOR_ATTACHMENT26             :: 0x8CFA;
+COLOR_ATTACHMENT27             :: 0x8CFB;
+COLOR_ATTACHMENT28             :: 0x8CFC;
+COLOR_ATTACHMENT29             :: 0x8CFD;
+COLOR_ATTACHMENT30             :: 0x8CFE;
+COLOR_ATTACHMENT31             :: 0x8CFF;
+DEPTH_ATTACHMENT               :: 0x8D00;
+STENCIL_ATTACHMENT             :: 0x8D20;
+FRAMEBUFFER                    :: 0x8D40;
+RENDERBUFFER                   :: 0x8D41;
+RENDERBUFFER_WIDTH             :: 0x8D42;
+RENDERBUFFER_HEIGHT            :: 0x8D43;
+RENDERBUFFER_INTERNAL_FORMAT   :: 0x8D44;
+STENCIL_INDEX1                 :: 0x8D46;
+STENCIL_INDEX4                 :: 0x8D47;
+STENCIL_INDEX8                 :: 0x8D48;
+STENCIL_INDEX16                :: 0x8D49;
+RENDERBUFFER_RED_SIZE          :: 0x8D50;
+RENDERBUFFER_GREEN_SIZE        :: 0x8D51;
+RENDERBUFFER_BLUE_SIZE         :: 0x8D52;
+RENDERBUFFER_ALPHA_SIZE        :: 0x8D53;
+RENDERBUFFER_DEPTH_SIZE        :: 0x8D54;
+RENDERBUFFER_STENCIL_SIZE      :: 0x8D55;
+FRAMEBUFFER_INCOMPLETE_MULTISAMPLE :: 0x8D56;
+MAX_SAMPLES                    :: 0x8D57;
+FRAMEBUFFER_SRGB               :: 0x8DB9;
+HALF_FLOAT                     :: 0x140B;
+MAP_READ_BIT                   :: 0x0001;
+MAP_WRITE_BIT                  :: 0x0002;
+MAP_INVALIDATE_RANGE_BIT       :: 0x0004;
+MAP_INVALIDATE_BUFFER_BIT      :: 0x0008;
+MAP_FLUSH_EXPLICIT_BIT         :: 0x0010;
+MAP_UNSYNCHRONIZED_BIT         :: 0x0020;
+COMPRESSED_RED_RGTC1           :: 0x8DBB;
+COMPRESSED_SIGNED_RED_RGTC1    :: 0x8DBC;
+COMPRESSED_RG_RGTC2            :: 0x8DBD;
+COMPRESSED_SIGNED_RG_RGTC2     :: 0x8DBE;
+RG                             :: 0x8227;
+RG_INTEGER                     :: 0x8228;
+R8                             :: 0x8229;
+R16                            :: 0x822A;
+RG8                            :: 0x822B;
+RG16                           :: 0x822C;
+R16F                           :: 0x822D;
+R32F                           :: 0x822E;
+RG16F                          :: 0x822F;
+RG32F                          :: 0x8230;
+R8I                            :: 0x8231;
+R8UI                           :: 0x8232;
+R16I                           :: 0x8233;
+R16UI                          :: 0x8234;
+R32I                           :: 0x8235;
+R32UI                          :: 0x8236;
+RG8I                           :: 0x8237;
+RG8UI                          :: 0x8238;
+RG16I                          :: 0x8239;
+RG16UI                         :: 0x823A;
+RG32I                          :: 0x823B;
+RG32UI                         :: 0x823C;
+VERTEX_ARRAY_BINDING           :: 0x85B5;
+
+SAMPLER_2D_RECT                :: 0x8B63;
+SAMPLER_2D_RECT_SHADOW         :: 0x8B64;
+SAMPLER_BUFFER                 :: 0x8DC2;
+INT_SAMPLER_2D_RECT            :: 0x8DCD;
+INT_SAMPLER_BUFFER             :: 0x8DD0;
+UNSIGNED_INT_SAMPLER_2D_RECT   :: 0x8DD5;
+UNSIGNED_INT_SAMPLER_BUFFER    :: 0x8DD8;
+TEXTURE_BUFFER                 :: 0x8C2A;
+MAX_TEXTURE_BUFFER_SIZE        :: 0x8C2B;
+TEXTURE_BINDING_BUFFER         :: 0x8C2C;
+TEXTURE_BUFFER_DATA_STORE_BINDING :: 0x8C2D;
+TEXTURE_RECTANGLE              :: 0x84F5;
+TEXTURE_BINDING_RECTANGLE      :: 0x84F6;
+PROXY_TEXTURE_RECTANGLE        :: 0x84F7;
+MAX_RECTANGLE_TEXTURE_SIZE     :: 0x84F8;
+R8_SNORM                       :: 0x8F94;
+RG8_SNORM                      :: 0x8F95;
+RGB8_SNORM                     :: 0x8F96;
+RGBA8_SNORM                    :: 0x8F97;
+R16_SNORM                      :: 0x8F98;
+RG16_SNORM                     :: 0x8F99;
+RGB16_SNORM                    :: 0x8F9A;
+RGBA16_SNORM                   :: 0x8F9B;
+SIGNED_NORMALIZED              :: 0x8F9C;
+PRIMITIVE_RESTART              :: 0x8F9D;
+PRIMITIVE_RESTART_INDEX        :: 0x8F9E;
+COPY_READ_BUFFER               :: 0x8F36;
+COPY_WRITE_BUFFER              :: 0x8F37;
+UNIFORM_BUFFER                 :: 0x8A11;
+UNIFORM_BUFFER_BINDING         :: 0x8A28;
+UNIFORM_BUFFER_START           :: 0x8A29;
+UNIFORM_BUFFER_SIZE            :: 0x8A2A;
+MAX_VERTEX_UNIFORM_BLOCKS      :: 0x8A2B;
+MAX_GEOMETRY_UNIFORM_BLOCKS    :: 0x8A2C;
+MAX_FRAGMENT_UNIFORM_BLOCKS    :: 0x8A2D;
+MAX_COMBINED_UNIFORM_BLOCKS    :: 0x8A2E;
+MAX_UNIFORM_BUFFER_BINDINGS    :: 0x8A2F;
+MAX_UNIFORM_BLOCK_SIZE         :: 0x8A30;
+MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS :: 0x8A31;
+MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS :: 0x8A32;
+MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS :: 0x8A33;
+UNIFORM_BUFFER_OFFSET_ALIGNMENT :: 0x8A34;
+ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH :: 0x8A35;
+ACTIVE_UNIFORM_BLOCKS          :: 0x8A36;
+UNIFORM_TYPE                   :: 0x8A37;
+UNIFORM_SIZE                   :: 0x8A38;
+UNIFORM_NAME_LENGTH            :: 0x8A39;
+UNIFORM_BLOCK_INDEX            :: 0x8A3A;
+UNIFORM_OFFSET                 :: 0x8A3B;
+UNIFORM_ARRAY_STRIDE           :: 0x8A3C;
+UNIFORM_MATRIX_STRIDE          :: 0x8A3D;
+UNIFORM_IS_ROW_MAJOR           :: 0x8A3E;
+UNIFORM_BLOCK_BINDING          :: 0x8A3F;
+UNIFORM_BLOCK_DATA_SIZE        :: 0x8A40;
+UNIFORM_BLOCK_NAME_LENGTH      :: 0x8A41;
+UNIFORM_BLOCK_ACTIVE_UNIFORMS  :: 0x8A42;
+UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES :: 0x8A43;
+UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER :: 0x8A44;
+UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER :: 0x8A45;
+UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER :: 0x8A46;
+INVALID_INDEX                  :: 0xFFFFFFFF;
+
+CONTEXT_CORE_PROFILE_BIT       :: 0x00000001;
+CONTEXT_COMPATIBILITY_PROFILE_BIT :: 0x00000002;
+LINES_ADJACENCY                :: 0x000A;
+LINE_STRIP_ADJACENCY           :: 0x000B;
+TRIANGLES_ADJACENCY            :: 0x000C;
+TRIANGLE_STRIP_ADJACENCY       :: 0x000D;
+PROGRAM_POINT_SIZE             :: 0x8642;
+MAX_GEOMETRY_TEXTURE_IMAGE_UNITS :: 0x8C29;
+FRAMEBUFFER_ATTACHMENT_LAYERED :: 0x8DA7;
+FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS :: 0x8DA8;
+GEOMETRY_SHADER                :: 0x8DD9;
+GEOMETRY_VERTICES_OUT          :: 0x8916;
+GEOMETRY_INPUT_TYPE            :: 0x8917;
+GEOMETRY_OUTPUT_TYPE           :: 0x8918;
+MAX_GEOMETRY_UNIFORM_COMPONENTS :: 0x8DDF;
+MAX_GEOMETRY_OUTPUT_VERTICES   :: 0x8DE0;
+MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS :: 0x8DE1;
+MAX_VERTEX_OUTPUT_COMPONENTS   :: 0x9122;
+MAX_GEOMETRY_INPUT_COMPONENTS  :: 0x9123;
+MAX_GEOMETRY_OUTPUT_COMPONENTS :: 0x9124;
+MAX_FRAGMENT_INPUT_COMPONENTS  :: 0x9125;
+CONTEXT_PROFILE_MASK           :: 0x9126;
+DEPTH_CLAMP                    :: 0x864F;
+QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION :: 0x8E4C;
+FIRST_VERTEX_CONVENTION        :: 0x8E4D;
+LAST_VERTEX_CONVENTION         :: 0x8E4E;
+PROVOKING_VERTEX               :: 0x8E4F;
+TEXTURE_CUBE_MAP_SEAMLESS      :: 0x884F;
+MAX_SERVER_WAIT_TIMEOUT        :: 0x9111;
+OBJECT_TYPE                    :: 0x9112;
+SYNC_CONDITION                 :: 0x9113;
+SYNC_STATUS                    :: 0x9114;
+SYNC_FLAGS                     :: 0x9115;
+SYNC_FENCE                     :: 0x9116;
+SYNC_GPU_COMMANDS_COMPLETE     :: 0x9117;
+UNSIGNALED                     :: 0x9118;
+SIGNALED                       :: 0x9119;
+ALREADY_SIGNALED               :: 0x911A;
+TIMEOUT_EXPIRED                :: 0x911B;
+CONDITION_SATISFIED            :: 0x911C;
+WAIT_FAILED                    :: 0x911D;
+TIMEOUT_IGNORED                :: 0xFFFFFFFFFFFFFFFF;
+SYNC_FLUSH_COMMANDS_BIT        :: 0x00000001;
+SAMPLE_POSITION                :: 0x8E50;
+SAMPLE_MASK                    :: 0x8E51;
+SAMPLE_MASK_VALUE              :: 0x8E52;
+MAX_SAMPLE_MASK_WORDS          :: 0x8E59;
+TEXTURE_2D_MULTISAMPLE         :: 0x9100;
+PROXY_TEXTURE_2D_MULTISAMPLE   :: 0x9101;
+TEXTURE_2D_MULTISAMPLE_ARRAY   :: 0x9102;
+PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY :: 0x9103;
+TEXTURE_BINDING_2D_MULTISAMPLE :: 0x9104;
+TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY :: 0x9105;
+TEXTURE_SAMPLES                :: 0x9106;
+TEXTURE_FIXED_SAMPLE_LOCATIONS :: 0x9107;
+SAMPLER_2D_MULTISAMPLE         :: 0x9108;
+INT_SAMPLER_2D_MULTISAMPLE     :: 0x9109;
+UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE :: 0x910A;
+SAMPLER_2D_MULTISAMPLE_ARRAY   :: 0x910B;
+INT_SAMPLER_2D_MULTISAMPLE_ARRAY :: 0x910C;
+UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY :: 0x910D;
+MAX_COLOR_TEXTURE_SAMPLES      :: 0x910E;
+MAX_DEPTH_TEXTURE_SAMPLES      :: 0x910F;
+MAX_INTEGER_SAMPLES            :: 0x9110;
+
+VERTEX_ATTRIB_ARRAY_DIVISOR    :: 0x88FE;
+SRC1_COLOR                     :: 0x88F9;
+ONE_MINUS_SRC1_COLOR           :: 0x88FA;
+ONE_MINUS_SRC1_ALPHA           :: 0x88FB;
+MAX_DUAL_SOURCE_DRAW_BUFFERS   :: 0x88FC;
+ANY_SAMPLES_PASSED             :: 0x8C2F;
+SAMPLER_BINDING                :: 0x8919;
+RGB10_A2UI                     :: 0x906F;
+TEXTURE_SWIZZLE_R              :: 0x8E42;
+TEXTURE_SWIZZLE_G              :: 0x8E43;
+TEXTURE_SWIZZLE_B              :: 0x8E44;
+TEXTURE_SWIZZLE_A              :: 0x8E45;
+TEXTURE_SWIZZLE_RGBA           :: 0x8E46;
+TIME_ELAPSED                   :: 0x88BF;
+TIMESTAMP                      :: 0x8E28;
+INT_2_10_10_10_REV             :: 0x8D9F;
+
+SAMPLE_SHADING                 :: 0x8C36;
+MIN_SAMPLE_SHADING_VALUE       :: 0x8C37;
+MIN_PROGRAM_TEXTURE_GATHER_OFFSET :: 0x8E5E;
+MAX_PROGRAM_TEXTURE_GATHER_OFFSET :: 0x8E5F;
+TEXTURE_CUBE_MAP_ARRAY         :: 0x9009;
+TEXTURE_BINDING_CUBE_MAP_ARRAY :: 0x900A;
+PROXY_TEXTURE_CUBE_MAP_ARRAY   :: 0x900B;
+SAMPLER_CUBE_MAP_ARRAY         :: 0x900C;
+SAMPLER_CUBE_MAP_ARRAY_SHADOW  :: 0x900D;
+INT_SAMPLER_CUBE_MAP_ARRAY     :: 0x900E;
+UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY :: 0x900F;
+DRAW_INDIRECT_BUFFER           :: 0x8F3F;
+DRAW_INDIRECT_BUFFER_BINDING   :: 0x8F43;
+GEOMETRY_SHADER_INVOCATIONS    :: 0x887F;
+MAX_GEOMETRY_SHADER_INVOCATIONS :: 0x8E5A;
+MIN_FRAGMENT_INTERPOLATION_OFFSET :: 0x8E5B;
+MAX_FRAGMENT_INTERPOLATION_OFFSET :: 0x8E5C;
+FRAGMENT_INTERPOLATION_OFFSET_BITS :: 0x8E5D;
+MAX_VERTEX_STREAMS             :: 0x8E71;
+DOUBLE_VEC2                    :: 0x8FFC;
+DOUBLE_VEC3                    :: 0x8FFD;
+DOUBLE_VEC4                    :: 0x8FFE;
+DOUBLE_MAT2                    :: 0x8F46;
+DOUBLE_MAT3                    :: 0x8F47;
+DOUBLE_MAT4                    :: 0x8F48;
+DOUBLE_MAT2x3                  :: 0x8F49;
+DOUBLE_MAT2x4                  :: 0x8F4A;
+DOUBLE_MAT3x2                  :: 0x8F4B;
+DOUBLE_MAT3x4                  :: 0x8F4C;
+DOUBLE_MAT4x2                  :: 0x8F4D;
+DOUBLE_MAT4x3                  :: 0x8F4E;
+ACTIVE_SUBROUTINES             :: 0x8DE5;
+ACTIVE_SUBROUTINE_UNIFORMS     :: 0x8DE6;
+ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS :: 0x8E47;
+ACTIVE_SUBROUTINE_MAX_LENGTH   :: 0x8E48;
+ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH :: 0x8E49;
+MAX_SUBROUTINES                :: 0x8DE7;
+MAX_SUBROUTINE_UNIFORM_LOCATIONS :: 0x8DE8;
+NUM_COMPATIBLE_SUBROUTINES     :: 0x8E4A;
+COMPATIBLE_SUBROUTINES         :: 0x8E4B;
+PATCHES                        :: 0x000E;
+PATCH_VERTICES                 :: 0x8E72;
+PATCH_DEFAULT_INNER_LEVEL      :: 0x8E73;
+PATCH_DEFAULT_OUTER_LEVEL      :: 0x8E74;
+TESS_CONTROL_OUTPUT_VERTICES   :: 0x8E75;
+TESS_GEN_MODE                  :: 0x8E76;
+TESS_GEN_SPACING               :: 0x8E77;
+TESS_GEN_VERTEX_ORDER          :: 0x8E78;
+TESS_GEN_POINT_MODE            :: 0x8E79;
+ISOLINES                       :: 0x8E7A;
+FRACTIONAL_ODD                 :: 0x8E7B;
+FRACTIONAL_EVEN                :: 0x8E7C;
+MAX_PATCH_VERTICES             :: 0x8E7D;
+MAX_TESS_GEN_LEVEL             :: 0x8E7E;
+MAX_TESS_CONTROL_UNIFORM_COMPONENTS :: 0x8E7F;
+MAX_TESS_EVALUATION_UNIFORM_COMPONENTS :: 0x8E80;
+MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS :: 0x8E81;
+MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS :: 0x8E82;
+MAX_TESS_CONTROL_OUTPUT_COMPONENTS :: 0x8E83;
+MAX_TESS_PATCH_COMPONENTS      :: 0x8E84;
+MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS :: 0x8E85;
+MAX_TESS_EVALUATION_OUTPUT_COMPONENTS :: 0x8E86;
+MAX_TESS_CONTROL_UNIFORM_BLOCKS :: 0x8E89;
+MAX_TESS_EVALUATION_UNIFORM_BLOCKS :: 0x8E8A;
+MAX_TESS_CONTROL_INPUT_COMPONENTS :: 0x886C;
+MAX_TESS_EVALUATION_INPUT_COMPONENTS :: 0x886D;
+MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS :: 0x8E1E;
+MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS :: 0x8E1F;
+UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER :: 0x84F0;
+UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER :: 0x84F1;
+TESS_EVALUATION_SHADER         :: 0x8E87;
+TESS_CONTROL_SHADER            :: 0x8E88;
+TRANSFORM_FEEDBACK             :: 0x8E22;
+TRANSFORM_FEEDBACK_BUFFER_PAUSED :: 0x8E23;
+TRANSFORM_FEEDBACK_BUFFER_ACTIVE :: 0x8E24;
+TRANSFORM_FEEDBACK_BINDING     :: 0x8E25;
+MAX_TRANSFORM_FEEDBACK_BUFFERS :: 0x8E70;
+
+FIXED                          :: 0x140C;
+IMPLEMENTATION_COLOR_READ_TYPE :: 0x8B9A;
+IMPLEMENTATION_COLOR_READ_FORMAT :: 0x8B9B;
+LOW_FLOAT                      :: 0x8DF0;
+MEDIUM_FLOAT                   :: 0x8DF1;
+HIGH_FLOAT                     :: 0x8DF2;
+LOW_INT                        :: 0x8DF3;
+MEDIUM_INT                     :: 0x8DF4;
+HIGH_INT                       :: 0x8DF5;
+SHADER_COMPILER                :: 0x8DFA;
+SHADER_BINARY_FORMATS          :: 0x8DF8;
+NUM_SHADER_BINARY_FORMATS      :: 0x8DF9;
+MAX_VERTEX_UNIFORM_VECTORS     :: 0x8DFB;
+MAX_VARYING_VECTORS            :: 0x8DFC;
+MAX_FRAGMENT_UNIFORM_VECTORS   :: 0x8DFD;
+RGB565                         :: 0x8D62;
+PROGRAM_BINARY_RETRIEVABLE_HINT :: 0x8257;
+PROGRAM_BINARY_LENGTH          :: 0x8741;
+NUM_PROGRAM_BINARY_FORMATS     :: 0x87FE;
+PROGRAM_BINARY_FORMATS         :: 0x87FF;
+VERTEX_SHADER_BIT              :: 0x00000001;
+FRAGMENT_SHADER_BIT            :: 0x00000002;
+GEOMETRY_SHADER_BIT            :: 0x00000004;
+TESS_CONTROL_SHADER_BIT        :: 0x00000008;
+TESS_EVALUATION_SHADER_BIT     :: 0x00000010;
+ALL_SHADER_BITS                :: 0xFFFFFFFF;
+PROGRAM_SEPARABLE              :: 0x8258;
+ACTIVE_PROGRAM                 :: 0x8259;
+PROGRAM_PIPELINE_BINDING       :: 0x825A;
+MAX_VIEWPORTS                  :: 0x825B;
+VIEWPORT_SUBPIXEL_BITS         :: 0x825C;
+VIEWPORT_BOUNDS_RANGE          :: 0x825D;
+LAYER_PROVOKING_VERTEX         :: 0x825E;
+VIEWPORT_INDEX_PROVOKING_VERTEX :: 0x825F;
+UNDEFINED_VERTEX               :: 0x8260;
+
+COPY_READ_BUFFER_BINDING       :: 0x8F36;
+COPY_WRITE_BUFFER_BINDING      :: 0x8F37;
+TRANSFORM_FEEDBACK_ACTIVE      :: 0x8E24;
+TRANSFORM_FEEDBACK_PAUSED      :: 0x8E23;
+UNPACK_COMPRESSED_BLOCK_WIDTH  :: 0x9127;
+UNPACK_COMPRESSED_BLOCK_HEIGHT :: 0x9128;
+UNPACK_COMPRESSED_BLOCK_DEPTH  :: 0x9129;
+UNPACK_COMPRESSED_BLOCK_SIZE   :: 0x912A;
+PACK_COMPRESSED_BLOCK_WIDTH    :: 0x912B;
+PACK_COMPRESSED_BLOCK_HEIGHT   :: 0x912C;
+PACK_COMPRESSED_BLOCK_DEPTH    :: 0x912D;
+PACK_COMPRESSED_BLOCK_SIZE     :: 0x912E;
+NUM_SAMPLE_COUNTS              :: 0x9380;
+MIN_MAP_BUFFER_ALIGNMENT       :: 0x90BC;
+ATOMIC_COUNTER_BUFFER          :: 0x92C0;
+ATOMIC_COUNTER_BUFFER_BINDING  :: 0x92C1;
+ATOMIC_COUNTER_BUFFER_START    :: 0x92C2;
+ATOMIC_COUNTER_BUFFER_SIZE     :: 0x92C3;
+ATOMIC_COUNTER_BUFFER_DATA_SIZE :: 0x92C4;
+ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS :: 0x92C5;
+ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES :: 0x92C6;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER :: 0x92C7;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER :: 0x92C8;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER :: 0x92C9;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER :: 0x92CA;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER :: 0x92CB;
+MAX_VERTEX_ATOMIC_COUNTER_BUFFERS :: 0x92CC;
+MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS :: 0x92CD;
+MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS :: 0x92CE;
+MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS :: 0x92CF;
+MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS :: 0x92D0;
+MAX_COMBINED_ATOMIC_COUNTER_BUFFERS :: 0x92D1;
+MAX_VERTEX_ATOMIC_COUNTERS     :: 0x92D2;
+MAX_TESS_CONTROL_ATOMIC_COUNTERS :: 0x92D3;
+MAX_TESS_EVALUATION_ATOMIC_COUNTERS :: 0x92D4;
+MAX_GEOMETRY_ATOMIC_COUNTERS   :: 0x92D5;
+MAX_FRAGMENT_ATOMIC_COUNTERS   :: 0x92D6;
+MAX_COMBINED_ATOMIC_COUNTERS   :: 0x92D7;
+MAX_ATOMIC_COUNTER_BUFFER_SIZE :: 0x92D8;
+MAX_ATOMIC_COUNTER_BUFFER_BINDINGS :: 0x92DC;
+ACTIVE_ATOMIC_COUNTER_BUFFERS  :: 0x92D9;
+UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX :: 0x92DA;
+UNSIGNED_INT_ATOMIC_COUNTER    :: 0x92DB;
+VERTEX_ATTRIB_ARRAY_BARRIER_BIT :: 0x00000001;
+ELEMENT_ARRAY_BARRIER_BIT      :: 0x00000002;
+UNIFORM_BARRIER_BIT            :: 0x00000004;
+TEXTURE_FETCH_BARRIER_BIT      :: 0x00000008;
+SHADER_IMAGE_ACCESS_BARRIER_BIT :: 0x00000020;
+COMMAND_BARRIER_BIT            :: 0x00000040;
+PIXEL_BUFFER_BARRIER_BIT       :: 0x00000080;
+TEXTURE_UPDATE_BARRIER_BIT     :: 0x00000100;
+BUFFER_UPDATE_BARRIER_BIT      :: 0x00000200;
+FRAMEBUFFER_BARRIER_BIT        :: 0x00000400;
+TRANSFORM_FEEDBACK_BARRIER_BIT :: 0x00000800;
+ATOMIC_COUNTER_BARRIER_BIT     :: 0x00001000;
+ALL_BARRIER_BITS               :: 0xFFFFFFFF;
+MAX_IMAGE_UNITS                :: 0x8F38;
+MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS :: 0x8F39;
+IMAGE_BINDING_NAME             :: 0x8F3A;
+IMAGE_BINDING_LEVEL            :: 0x8F3B;
+IMAGE_BINDING_LAYERED          :: 0x8F3C;
+IMAGE_BINDING_LAYER            :: 0x8F3D;
+IMAGE_BINDING_ACCESS           :: 0x8F3E;
+IMAGE_1D                       :: 0x904C;
+IMAGE_2D                       :: 0x904D;
+IMAGE_3D                       :: 0x904E;
+IMAGE_2D_RECT                  :: 0x904F;
+IMAGE_CUBE                     :: 0x9050;
+IMAGE_BUFFER                   :: 0x9051;
+IMAGE_1D_ARRAY                 :: 0x9052;
+IMAGE_2D_ARRAY                 :: 0x9053;
+IMAGE_CUBE_MAP_ARRAY           :: 0x9054;
+IMAGE_2D_MULTISAMPLE           :: 0x9055;
+IMAGE_2D_MULTISAMPLE_ARRAY     :: 0x9056;
+INT_IMAGE_1D                   :: 0x9057;
+INT_IMAGE_2D                   :: 0x9058;
+INT_IMAGE_3D                   :: 0x9059;
+INT_IMAGE_2D_RECT              :: 0x905A;
+INT_IMAGE_CUBE                 :: 0x905B;
+INT_IMAGE_BUFFER               :: 0x905C;
+INT_IMAGE_1D_ARRAY             :: 0x905D;
+INT_IMAGE_2D_ARRAY             :: 0x905E;
+INT_IMAGE_CUBE_MAP_ARRAY       :: 0x905F;
+INT_IMAGE_2D_MULTISAMPLE       :: 0x9060;
+INT_IMAGE_2D_MULTISAMPLE_ARRAY :: 0x9061;
+UNSIGNED_INT_IMAGE_1D          :: 0x9062;
+UNSIGNED_INT_IMAGE_2D          :: 0x9063;
+UNSIGNED_INT_IMAGE_3D          :: 0x9064;
+UNSIGNED_INT_IMAGE_2D_RECT     :: 0x9065;
+UNSIGNED_INT_IMAGE_CUBE        :: 0x9066;
+UNSIGNED_INT_IMAGE_BUFFER      :: 0x9067;
+UNSIGNED_INT_IMAGE_1D_ARRAY    :: 0x9068;
+UNSIGNED_INT_IMAGE_2D_ARRAY    :: 0x9069;
+UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY :: 0x906A;
+UNSIGNED_INT_IMAGE_2D_MULTISAMPLE :: 0x906B;
+UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY :: 0x906C;
+MAX_IMAGE_SAMPLES              :: 0x906D;
+IMAGE_BINDING_FORMAT           :: 0x906E;
+IMAGE_FORMAT_COMPATIBILITY_TYPE :: 0x90C7;
+IMAGE_FORMAT_COMPATIBILITY_BY_SIZE :: 0x90C8;
+IMAGE_FORMAT_COMPATIBILITY_BY_CLASS :: 0x90C9;
+MAX_VERTEX_IMAGE_UNIFORMS      :: 0x90CA;
+MAX_TESS_CONTROL_IMAGE_UNIFORMS :: 0x90CB;
+MAX_TESS_EVALUATION_IMAGE_UNIFORMS :: 0x90CC;
+MAX_GEOMETRY_IMAGE_UNIFORMS    :: 0x90CD;
+MAX_FRAGMENT_IMAGE_UNIFORMS    :: 0x90CE;
+MAX_COMBINED_IMAGE_UNIFORMS    :: 0x90CF;
+COMPRESSED_RGBA_BPTC_UNORM     :: 0x8E8C;
+COMPRESSED_SRGB_ALPHA_BPTC_UNORM :: 0x8E8D;
+COMPRESSED_RGB_BPTC_SIGNED_FLOAT :: 0x8E8E;
+COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT :: 0x8E8F;
+TEXTURE_IMMUTABLE_FORMAT       :: 0x912F;
+
+NUM_SHADING_LANGUAGE_VERSIONS  :: 0x82E9;
+VERTEX_ATTRIB_ARRAY_LONG       :: 0x874E;
+COMPRESSED_RGB8_ETC2           :: 0x9274;
+COMPRESSED_SRGB8_ETC2          :: 0x9275;
+COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 :: 0x9276;
+COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 :: 0x9277;
+COMPRESSED_RGBA8_ETC2_EAC      :: 0x9278;
+COMPRESSED_SRGB8_ALPHA8_ETC2_EAC :: 0x9279;
+COMPRESSED_R11_EAC             :: 0x9270;
+COMPRESSED_SIGNED_R11_EAC      :: 0x9271;
+COMPRESSED_RG11_EAC            :: 0x9272;
+COMPRESSED_SIGNED_RG11_EAC     :: 0x9273;
+PRIMITIVE_RESTART_FIXED_INDEX  :: 0x8D69;
+ANY_SAMPLES_PASSED_CONSERVATIVE :: 0x8D6A;
+MAX_ELEMENT_INDEX              :: 0x8D6B;
+COMPUTE_SHADER                 :: 0x91B9;
+MAX_COMPUTE_UNIFORM_BLOCKS     :: 0x91BB;
+MAX_COMPUTE_TEXTURE_IMAGE_UNITS :: 0x91BC;
+MAX_COMPUTE_IMAGE_UNIFORMS     :: 0x91BD;
+MAX_COMPUTE_SHARED_MEMORY_SIZE :: 0x8262;
+MAX_COMPUTE_UNIFORM_COMPONENTS :: 0x8263;
+MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS :: 0x8264;
+MAX_COMPUTE_ATOMIC_COUNTERS    :: 0x8265;
+MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS :: 0x8266;
+MAX_COMPUTE_WORK_GROUP_INVOCATIONS :: 0x90EB;
+MAX_COMPUTE_WORK_GROUP_COUNT   :: 0x91BE;
+MAX_COMPUTE_WORK_GROUP_SIZE    :: 0x91BF;
+COMPUTE_WORK_GROUP_SIZE        :: 0x8267;
+UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER :: 0x90EC;
+ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER :: 0x90ED;
+DISPATCH_INDIRECT_BUFFER       :: 0x90EE;
+DISPATCH_INDIRECT_BUFFER_BINDING :: 0x90EF;
+COMPUTE_SHADER_BIT             :: 0x00000020;
+DEBUG_OUTPUT_SYNCHRONOUS       :: 0x8242;
+DEBUG_NEXT_LOGGED_MESSAGE_LENGTH :: 0x8243;
+DEBUG_CALLBACK_FUNCTION        :: 0x8244;
+DEBUG_CALLBACK_USER_PARAM      :: 0x8245;
+DEBUG_SOURCE_API               :: 0x8246;
+DEBUG_SOURCE_WINDOW_SYSTEM     :: 0x8247;
+DEBUG_SOURCE_SHADER_COMPILER   :: 0x8248;
+DEBUG_SOURCE_THIRD_PARTY       :: 0x8249;
+DEBUG_SOURCE_APPLICATION       :: 0x824A;
+DEBUG_SOURCE_OTHER             :: 0x824B;
+DEBUG_TYPE_ERROR               :: 0x824C;
+DEBUG_TYPE_DEPRECATED_BEHAVIOR :: 0x824D;
+DEBUG_TYPE_UNDEFINED_BEHAVIOR  :: 0x824E;
+DEBUG_TYPE_PORTABILITY         :: 0x824F;
+DEBUG_TYPE_PERFORMANCE         :: 0x8250;
+DEBUG_TYPE_OTHER               :: 0x8251;
+MAX_DEBUG_MESSAGE_LENGTH       :: 0x9143;
+MAX_DEBUG_LOGGED_MESSAGES      :: 0x9144;
+DEBUG_LOGGED_MESSAGES          :: 0x9145;
+DEBUG_SEVERITY_HIGH            :: 0x9146;
+DEBUG_SEVERITY_MEDIUM          :: 0x9147;
+DEBUG_SEVERITY_LOW             :: 0x9148;
+DEBUG_TYPE_MARKER              :: 0x8268;
+DEBUG_TYPE_PUSH_GROUP          :: 0x8269;
+DEBUG_TYPE_POP_GROUP           :: 0x826A;
+DEBUG_SEVERITY_NOTIFICATION    :: 0x826B;
+MAX_DEBUG_GROUP_STACK_DEPTH    :: 0x826C;
+DEBUG_GROUP_STACK_DEPTH        :: 0x826D;
+BUFFER                         :: 0x82E0;
+SHADER                         :: 0x82E1;
+PROGRAM                        :: 0x82E2;
+QUERY                          :: 0x82E3;
+PROGRAM_PIPELINE               :: 0x82E4;
+SAMPLER                        :: 0x82E6;
+MAX_LABEL_LENGTH               :: 0x82E8;
+DEBUG_OUTPUT                   :: 0x92E0;
+CONTEXT_FLAG_DEBUG_BIT         :: 0x00000002;
+MAX_UNIFORM_LOCATIONS          :: 0x826E;
+FRAMEBUFFER_DEFAULT_WIDTH      :: 0x9310;
+FRAMEBUFFER_DEFAULT_HEIGHT     :: 0x9311;
+FRAMEBUFFER_DEFAULT_LAYERS     :: 0x9312;
+FRAMEBUFFER_DEFAULT_SAMPLES    :: 0x9313;
+FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS :: 0x9314;
+MAX_FRAMEBUFFER_WIDTH          :: 0x9315;
+MAX_FRAMEBUFFER_HEIGHT         :: 0x9316;
+MAX_FRAMEBUFFER_LAYERS         :: 0x9317;
+MAX_FRAMEBUFFER_SAMPLES        :: 0x9318;
+INTERNALFORMAT_SUPPORTED       :: 0x826F;
+INTERNALFORMAT_PREFERRED       :: 0x8270;
+INTERNALFORMAT_RED_SIZE        :: 0x8271;
+INTERNALFORMAT_GREEN_SIZE      :: 0x8272;
+INTERNALFORMAT_BLUE_SIZE       :: 0x8273;
+INTERNALFORMAT_ALPHA_SIZE      :: 0x8274;
+INTERNALFORMAT_DEPTH_SIZE      :: 0x8275;
+INTERNALFORMAT_STENCIL_SIZE    :: 0x8276;
+INTERNALFORMAT_SHARED_SIZE     :: 0x8277;
+INTERNALFORMAT_RED_TYPE        :: 0x8278;
+INTERNALFORMAT_GREEN_TYPE      :: 0x8279;
+INTERNALFORMAT_BLUE_TYPE       :: 0x827A;
+INTERNALFORMAT_ALPHA_TYPE      :: 0x827B;
+INTERNALFORMAT_DEPTH_TYPE      :: 0x827C;
+INTERNALFORMAT_STENCIL_TYPE    :: 0x827D;
+MAX_WIDTH                      :: 0x827E;
+MAX_HEIGHT                     :: 0x827F;
+MAX_DEPTH                      :: 0x8280;
+MAX_LAYERS                     :: 0x8281;
+MAX_COMBINED_DIMENSIONS        :: 0x8282;
+COLOR_COMPONENTS               :: 0x8283;
+DEPTH_COMPONENTS               :: 0x8284;
+STENCIL_COMPONENTS             :: 0x8285;
+COLOR_RENDERABLE               :: 0x8286;
+DEPTH_RENDERABLE               :: 0x8287;
+STENCIL_RENDERABLE             :: 0x8288;
+FRAMEBUFFER_RENDERABLE         :: 0x8289;
+FRAMEBUFFER_RENDERABLE_LAYERED :: 0x828A;
+FRAMEBUFFER_BLEND              :: 0x828B;
+READ_PIXELS                    :: 0x828C;
+READ_PIXELS_FORMAT             :: 0x828D;
+READ_PIXELS_TYPE               :: 0x828E;
+TEXTURE_IMAGE_FORMAT           :: 0x828F;
+TEXTURE_IMAGE_TYPE             :: 0x8290;
+GET_TEXTURE_IMAGE_FORMAT       :: 0x8291;
+GET_TEXTURE_IMAGE_TYPE         :: 0x8292;
+MIPMAP                         :: 0x8293;
+MANUAL_GENERATE_MIPMAP         :: 0x8294;
+AUTO_GENERATE_MIPMAP           :: 0x8295;
+COLOR_ENCODING                 :: 0x8296;
+SRGB_READ                      :: 0x8297;
+SRGB_WRITE                     :: 0x8298;
+FILTER                         :: 0x829A;
+VERTEX_TEXTURE                 :: 0x829B;
+TESS_CONTROL_TEXTURE           :: 0x829C;
+TESS_EVALUATION_TEXTURE        :: 0x829D;
+GEOMETRY_TEXTURE               :: 0x829E;
+FRAGMENT_TEXTURE               :: 0x829F;
+COMPUTE_TEXTURE                :: 0x82A0;
+TEXTURE_SHADOW                 :: 0x82A1;
+TEXTURE_GATHER                 :: 0x82A2;
+TEXTURE_GATHER_SHADOW          :: 0x82A3;
+SHADER_IMAGE_LOAD              :: 0x82A4;
+SHADER_IMAGE_STORE             :: 0x82A5;
+SHADER_IMAGE_ATOMIC            :: 0x82A6;
+IMAGE_TEXEL_SIZE               :: 0x82A7;
+IMAGE_COMPATIBILITY_CLASS      :: 0x82A8;
+IMAGE_PIXEL_FORMAT             :: 0x82A9;
+IMAGE_PIXEL_TYPE               :: 0x82AA;
+SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST :: 0x82AC;
+SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST :: 0x82AD;
+SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE :: 0x82AE;
+SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE :: 0x82AF;
+TEXTURE_COMPRESSED_BLOCK_WIDTH :: 0x82B1;
+TEXTURE_COMPRESSED_BLOCK_HEIGHT :: 0x82B2;
+TEXTURE_COMPRESSED_BLOCK_SIZE  :: 0x82B3;
+CLEAR_BUFFER                   :: 0x82B4;
+TEXTURE_VIEW                   :: 0x82B5;
+VIEW_COMPATIBILITY_CLASS       :: 0x82B6;
+FULL_SUPPORT                   :: 0x82B7;
+CAVEAT_SUPPORT                 :: 0x82B8;
+IMAGE_CLASS_4_X_32             :: 0x82B9;
+IMAGE_CLASS_2_X_32             :: 0x82BA;
+IMAGE_CLASS_1_X_32             :: 0x82BB;
+IMAGE_CLASS_4_X_16             :: 0x82BC;
+IMAGE_CLASS_2_X_16             :: 0x82BD;
+IMAGE_CLASS_1_X_16             :: 0x82BE;
+IMAGE_CLASS_4_X_8              :: 0x82BF;
+IMAGE_CLASS_2_X_8              :: 0x82C0;
+IMAGE_CLASS_1_X_8              :: 0x82C1;
+IMAGE_CLASS_11_11_10           :: 0x82C2;
+IMAGE_CLASS_10_10_10_2         :: 0x82C3;
+VIEW_CLASS_128_BITS            :: 0x82C4;
+VIEW_CLASS_96_BITS             :: 0x82C5;
+VIEW_CLASS_64_BITS             :: 0x82C6;
+VIEW_CLASS_48_BITS             :: 0x82C7;
+VIEW_CLASS_32_BITS             :: 0x82C8;
+VIEW_CLASS_24_BITS             :: 0x82C9;
+VIEW_CLASS_16_BITS             :: 0x82CA;
+VIEW_CLASS_8_BITS              :: 0x82CB;
+VIEW_CLASS_S3TC_DXT1_RGB       :: 0x82CC;
+VIEW_CLASS_S3TC_DXT1_RGBA      :: 0x82CD;
+VIEW_CLASS_S3TC_DXT3_RGBA      :: 0x82CE;
+VIEW_CLASS_S3TC_DXT5_RGBA      :: 0x82CF;
+VIEW_CLASS_RGTC1_RED           :: 0x82D0;
+VIEW_CLASS_RGTC2_RG            :: 0x82D1;
+VIEW_CLASS_BPTC_UNORM          :: 0x82D2;
+VIEW_CLASS_BPTC_FLOAT          :: 0x82D3;
+UNIFORM                        :: 0x92E1;
+UNIFORM_BLOCK                  :: 0x92E2;
+PROGRAM_INPUT                  :: 0x92E3;
+PROGRAM_OUTPUT                 :: 0x92E4;
+BUFFER_VARIABLE                :: 0x92E5;
+SHADER_STORAGE_BLOCK           :: 0x92E6;
+VERTEX_SUBROUTINE              :: 0x92E8;
+TESS_CONTROL_SUBROUTINE        :: 0x92E9;
+TESS_EVALUATION_SUBROUTINE     :: 0x92EA;
+GEOMETRY_SUBROUTINE            :: 0x92EB;
+FRAGMENT_SUBROUTINE            :: 0x92EC;
+COMPUTE_SUBROUTINE             :: 0x92ED;
+VERTEX_SUBROUTINE_UNIFORM      :: 0x92EE;
+TESS_CONTROL_SUBROUTINE_UNIFORM :: 0x92EF;
+TESS_EVALUATION_SUBROUTINE_UNIFORM :: 0x92F0;
+GEOMETRY_SUBROUTINE_UNIFORM    :: 0x92F1;
+FRAGMENT_SUBROUTINE_UNIFORM    :: 0x92F2;
+COMPUTE_SUBROUTINE_UNIFORM     :: 0x92F3;
+TRANSFORM_FEEDBACK_VARYING     :: 0x92F4;
+ACTIVE_RESOURCES               :: 0x92F5;
+MAX_NAME_LENGTH                :: 0x92F6;
+MAX_NUM_ACTIVE_VARIABLES       :: 0x92F7;
+MAX_NUM_COMPATIBLE_SUBROUTINES :: 0x92F8;
+NAME_LENGTH                    :: 0x92F9;
+TYPE                           :: 0x92FA;
+ARRAY_SIZE                     :: 0x92FB;
+OFFSET                         :: 0x92FC;
+BLOCK_INDEX                    :: 0x92FD;
+ARRAY_STRIDE                   :: 0x92FE;
+MATRIX_STRIDE                  :: 0x92FF;
+IS_ROW_MAJOR                   :: 0x9300;
+ATOMIC_COUNTER_BUFFER_INDEX    :: 0x9301;
+BUFFER_BINDING                 :: 0x9302;
+BUFFER_DATA_SIZE               :: 0x9303;
+NUM_ACTIVE_VARIABLES           :: 0x9304;
+ACTIVE_VARIABLES               :: 0x9305;
+REFERENCED_BY_VERTEX_SHADER    :: 0x9306;
+REFERENCED_BY_TESS_CONTROL_SHADER :: 0x9307;
+REFERENCED_BY_TESS_EVALUATION_SHADER :: 0x9308;
+REFERENCED_BY_GEOMETRY_SHADER  :: 0x9309;
+REFERENCED_BY_FRAGMENT_SHADER  :: 0x930A;
+REFERENCED_BY_COMPUTE_SHADER   :: 0x930B;
+TOP_LEVEL_ARRAY_SIZE           :: 0x930C;
+TOP_LEVEL_ARRAY_STRIDE         :: 0x930D;
+LOCATION                       :: 0x930E;
+LOCATION_INDEX                 :: 0x930F;
+IS_PER_PATCH                   :: 0x92E7;
+SHADER_STORAGE_BUFFER          :: 0x90D2;
+SHADER_STORAGE_BUFFER_BINDING  :: 0x90D3;
+SHADER_STORAGE_BUFFER_START    :: 0x90D4;
+SHADER_STORAGE_BUFFER_SIZE     :: 0x90D5;
+MAX_VERTEX_SHADER_STORAGE_BLOCKS :: 0x90D6;
+MAX_GEOMETRY_SHADER_STORAGE_BLOCKS :: 0x90D7;
+MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS :: 0x90D8;
+MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS :: 0x90D9;
+MAX_FRAGMENT_SHADER_STORAGE_BLOCKS :: 0x90DA;
+MAX_COMPUTE_SHADER_STORAGE_BLOCKS :: 0x90DB;
+MAX_COMBINED_SHADER_STORAGE_BLOCKS :: 0x90DC;
+MAX_SHADER_STORAGE_BUFFER_BINDINGS :: 0x90DD;
+MAX_SHADER_STORAGE_BLOCK_SIZE  :: 0x90DE;
+SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT :: 0x90DF;
+SHADER_STORAGE_BARRIER_BIT     :: 0x00002000;
+MAX_COMBINED_SHADER_OUTPUT_RESOURCES :: 0x8F39;
+DEPTH_STENCIL_TEXTURE_MODE     :: 0x90EA;
+TEXTURE_BUFFER_OFFSET          :: 0x919D;
+TEXTURE_BUFFER_SIZE            :: 0x919E;
+TEXTURE_BUFFER_OFFSET_ALIGNMENT :: 0x919F;
+TEXTURE_VIEW_MIN_LEVEL         :: 0x82DB;
+TEXTURE_VIEW_NUM_LEVELS        :: 0x82DC;
+TEXTURE_VIEW_MIN_LAYER         :: 0x82DD;
+TEXTURE_VIEW_NUM_LAYERS        :: 0x82DE;
+TEXTURE_IMMUTABLE_LEVELS       :: 0x82DF;
+VERTEX_ATTRIB_BINDING          :: 0x82D4;
+VERTEX_ATTRIB_RELATIVE_OFFSET  :: 0x82D5;
+VERTEX_BINDING_DIVISOR         :: 0x82D6;
+VERTEX_BINDING_OFFSET          :: 0x82D7;
+VERTEX_BINDING_STRIDE          :: 0x82D8;
+MAX_VERTEX_ATTRIB_RELATIVE_OFFSET :: 0x82D9;
+MAX_VERTEX_ATTRIB_BINDINGS     :: 0x82DA;
+VERTEX_BINDING_BUFFER          :: 0x8F4F;
+
+MAX_VERTEX_ATTRIB_STRIDE       :: 0x82E5;
+PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED :: 0x8221;
+TEXTURE_BUFFER_BINDING         :: 0x8C2A;
+MAP_PERSISTENT_BIT             :: 0x0040;
+MAP_COHERENT_BIT               :: 0x0080;
+DYNAMIC_STORAGE_BIT            :: 0x0100;
+CLIENT_STORAGE_BIT             :: 0x0200;
+CLIENT_MAPPED_BUFFER_BARRIER_BIT :: 0x00004000;
+BUFFER_IMMUTABLE_STORAGE       :: 0x821F;
+BUFFER_STORAGE_FLAGS           :: 0x8220;
+CLEAR_TEXTURE                  :: 0x9365;
+LOCATION_COMPONENT             :: 0x934A;
+TRANSFORM_FEEDBACK_BUFFER_INDEX :: 0x934B;
+TRANSFORM_FEEDBACK_BUFFER_STRIDE :: 0x934C;
+QUERY_BUFFER                   :: 0x9192;
+QUERY_BUFFER_BARRIER_BIT       :: 0x00008000;
+QUERY_BUFFER_BINDING           :: 0x9193;
+QUERY_RESULT_NO_WAIT           :: 0x9194;
+MIRROR_CLAMP_TO_EDGE           :: 0x8743;
+
+CONTEXT_LOST                   :: 0x0507;
+NEGATIVE_ONE_TO_ONE            :: 0x935E;
+ZERO_TO_ONE                    :: 0x935F;
+CLIP_ORIGIN                    :: 0x935C;
+CLIP_DEPTH_MODE                :: 0x935D;
+QUERY_WAIT_INVERTED            :: 0x8E17;
+QUERY_NO_WAIT_INVERTED         :: 0x8E18;
+QUERY_BY_REGION_WAIT_INVERTED  :: 0x8E19;
+QUERY_BY_REGION_NO_WAIT_INVERTED :: 0x8E1A;
+MAX_CULL_DISTANCES             :: 0x82F9;
+MAX_COMBINED_CLIP_AND_CULL_DISTANCES :: 0x82FA;
+TEXTURE_TARGET                 :: 0x1006;
+QUERY_TARGET                   :: 0x82EA;
+GUILTY_CONTEXT_RESET           :: 0x8253;
+INNOCENT_CONTEXT_RESET         :: 0x8254;
+UNKNOWN_CONTEXT_RESET          :: 0x8255;
+RESET_NOTIFICATION_STRATEGY    :: 0x8256;
+LOSE_CONTEXT_ON_RESET          :: 0x8252;
+NO_RESET_NOTIFICATION          :: 0x8261;
+CONTEXT_FLAG_ROBUST_ACCESS_BIT :: 0x00000004;
+CONTEXT_RELEASE_BEHAVIOR       :: 0x82FB;
+CONTEXT_RELEASE_BEHAVIOR_FLUSH :: 0x82FC;
+
+DEBUG_OUTPUT_SYNCHRONOUS_ARB   :: 0x8242;
+DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB :: 0x8243;
+DEBUG_CALLBACK_FUNCTION_ARB    :: 0x8244;
+DEBUG_CALLBACK_USER_PARAM_ARB  :: 0x8245;
+DEBUG_SOURCE_API_ARB           :: 0x8246;
+DEBUG_SOURCE_WINDOW_SYSTEM_ARB :: 0x8247;
+DEBUG_SOURCE_SHADER_COMPILER_ARB :: 0x8248;
+DEBUG_SOURCE_THIRD_PARTY_ARB   :: 0x8249;
+DEBUG_SOURCE_APPLICATION_ARB   :: 0x824A;
+DEBUG_SOURCE_OTHER_ARB         :: 0x824B;
+DEBUG_TYPE_ERROR_ARB           :: 0x824C;
+DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB :: 0x824D;
+DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB :: 0x824E;
+DEBUG_TYPE_PORTABILITY_ARB     :: 0x824F;
+DEBUG_TYPE_PERFORMANCE_ARB     :: 0x8250;
+DEBUG_TYPE_OTHER_ARB           :: 0x8251;
+MAX_DEBUG_MESSAGE_LENGTH_ARB   :: 0x9143;
+MAX_DEBUG_LOGGED_MESSAGES_ARB  :: 0x9144;
+DEBUG_LOGGED_MESSAGES_ARB      :: 0x9145;
+DEBUG_SEVERITY_HIGH_ARB        :: 0x9146;
+DEBUG_SEVERITY_MEDIUM_ARB      :: 0x9147;
+DEBUG_SEVERITY_LOW_ARB         :: 0x9148;
+
+
+SHADER_BINARY_FORMAT_SPIR_V    :: 0x9551;
+SPIR_V_BINARY                  :: 0x9552;
+PARAMETER_BUFFER               :: 0x80EE;
+PARAMETER_BUFFER_BINDING       :: 0x80EF;
+CONTEXT_FLAG_NO_ERROR_BIT      :: 0x00000008;
+VERTICES_SUBMITTED             :: 0x82EE;
+PRIMITIVES_SUBMITTED           :: 0x82EF;
+VERTEX_SHADER_INVOCATIONS      :: 0x82F0;
+TESS_CONTROL_SHADER_PATCHES    :: 0x82F1;
+TESS_EVALUATION_SHADER_INVOCATIONS :: 0x82F2;
+GEOMETRY_SHADER_PRIMITIVES_EMITTED :: 0x82F3;
+FRAGMENT_SHADER_INVOCATIONS    :: 0x82F4;
+COMPUTE_SHADER_INVOCATIONS     :: 0x82F5;
+CLIPPING_INPUT_PRIMITIVES      :: 0x82F6;
+CLIPPING_OUTPUT_PRIMITIVES     :: 0x82F7;
+POLYGON_OFFSET_CLAMP           :: 0x8E1B;
+SPIR_V_EXTENSIONS              :: 0x9553;
+NUM_SPIR_V_EXTENSIONS          :: 0x9554;
+TEXTURE_MAX_ANISOTROPY         :: 0x84FE;
+MAX_TEXTURE_MAX_ANISOTROPY     :: 0x84FF;
+TRANSFORM_FEEDBACK_OVERFLOW    :: 0x82EC;
+TRANSFORM_FEEDBACK_STREAM_OVERFLOW :: 0x82ED;
+
+// Extensions, extended as necessary
+DEVICE_LUID_EXT :: 0x9599;

+ 1413 - 0
vendor/OpenGL/enums.odin

@@ -0,0 +1,1413 @@
+package odin_gl
+
+GL_Enum :: enum u64 {
+	FALSE = 0, 
+	TRUE = 1, 
+
+	DEPTH_BUFFER_BIT = DEPTH_BUFFER_BIT, 
+	STENCIL_BUFFER_BIT = STENCIL_BUFFER_BIT, 
+	COLOR_BUFFER_BIT = COLOR_BUFFER_BIT, 
+	POINTS = POINTS, 
+	LINES = LINES, 
+	LINE_LOOP = LINE_LOOP, 
+	LINE_STRIP = LINE_STRIP, 
+	TRIANGLES = TRIANGLES, 
+	TRIANGLE_STRIP = TRIANGLE_STRIP, 
+	TRIANGLE_FAN = TRIANGLE_FAN, 
+	QUADS = QUADS, 
+	NEVER = NEVER, 
+	LESS = LESS, 
+	EQUAL = EQUAL, 
+	LEQUAL = LEQUAL, 
+	GREATER = GREATER, 
+	NOTEQUAL = NOTEQUAL, 
+	GEQUAL = GEQUAL, 
+	ALWAYS = ALWAYS, 
+	ZERO = ZERO, 
+	ONE = ONE, 
+	SRC_COLOR = SRC_COLOR, 
+	ONE_MINUS_SRC_COLOR = ONE_MINUS_SRC_COLOR, 
+	SRC_ALPHA = SRC_ALPHA, 
+	ONE_MINUS_SRC_ALPHA = ONE_MINUS_SRC_ALPHA, 
+	DST_ALPHA = DST_ALPHA, 
+	ONE_MINUS_DST_ALPHA = ONE_MINUS_DST_ALPHA, 
+	DST_COLOR = DST_COLOR, 
+	ONE_MINUS_DST_COLOR = ONE_MINUS_DST_COLOR, 
+	SRC_ALPHA_SATURATE = SRC_ALPHA_SATURATE, 
+	NONE = NONE, 
+	FRONT_LEFT = FRONT_LEFT, 
+	FRONT_RIGHT = FRONT_RIGHT, 
+	BACK_LEFT = BACK_LEFT, 
+	BACK_RIGHT = BACK_RIGHT, 
+	FRONT = FRONT, 
+	BACK = BACK, 
+	LEFT = LEFT, 
+	RIGHT = RIGHT, 
+	FRONT_AND_BACK = FRONT_AND_BACK, 
+	NO_ERROR = NO_ERROR, 
+	INVALID_ENUM = INVALID_ENUM, 
+	INVALID_VALUE = INVALID_VALUE, 
+	INVALID_OPERATION = INVALID_OPERATION, 
+	OUT_OF_MEMORY = OUT_OF_MEMORY, 
+	CW = CW, 
+	CCW = CCW, 
+	POINT_SIZE = POINT_SIZE, 
+	POINT_SIZE_RANGE = POINT_SIZE_RANGE, 
+	POINT_SIZE_GRANULARITY = POINT_SIZE_GRANULARITY, 
+	LINE_SMOOTH = LINE_SMOOTH, 
+	LINE_WIDTH = LINE_WIDTH, 
+	LINE_WIDTH_RANGE = LINE_WIDTH_RANGE, 
+	LINE_WIDTH_GRANULARITY = LINE_WIDTH_GRANULARITY, 
+	POLYGON_MODE = POLYGON_MODE, 
+	POLYGON_SMOOTH = POLYGON_SMOOTH, 
+	CULL_FACE = CULL_FACE, 
+	CULL_FACE_MODE = CULL_FACE_MODE, 
+	FRONT_FACE = FRONT_FACE, 
+	DEPTH_RANGE = DEPTH_RANGE, 
+	DEPTH_TEST = DEPTH_TEST, 
+	DEPTH_WRITEMASK = DEPTH_WRITEMASK, 
+	DEPTH_CLEAR_VALUE = DEPTH_CLEAR_VALUE, 
+	DEPTH_FUNC = DEPTH_FUNC, 
+	STENCIL_TEST = STENCIL_TEST, 
+	STENCIL_CLEAR_VALUE = STENCIL_CLEAR_VALUE, 
+	STENCIL_FUNC = STENCIL_FUNC, 
+	STENCIL_VALUE_MASK = STENCIL_VALUE_MASK, 
+	STENCIL_FAIL = STENCIL_FAIL, 
+	STENCIL_PASS_DEPTH_FAIL = STENCIL_PASS_DEPTH_FAIL, 
+	STENCIL_PASS_DEPTH_PASS = STENCIL_PASS_DEPTH_PASS, 
+	STENCIL_REF = STENCIL_REF, 
+	STENCIL_WRITEMASK = STENCIL_WRITEMASK, 
+	VIEWPORT = VIEWPORT, 
+	DITHER = DITHER, 
+	BLEND_DST = BLEND_DST, 
+	BLEND_SRC = BLEND_SRC, 
+	BLEND = BLEND, 
+	LOGIC_OP_MODE = LOGIC_OP_MODE, 
+	COLOR_LOGIC_OP = COLOR_LOGIC_OP, 
+	DRAW_BUFFER = DRAW_BUFFER, 
+	READ_BUFFER = READ_BUFFER, 
+	SCISSOR_BOX = SCISSOR_BOX, 
+	SCISSOR_TEST = SCISSOR_TEST, 
+	COLOR_CLEAR_VALUE = COLOR_CLEAR_VALUE, 
+	COLOR_WRITEMASK = COLOR_WRITEMASK, 
+	DOUBLEBUFFER = DOUBLEBUFFER, 
+	STEREO = STEREO, 
+	LINE_SMOOTH_HINT = LINE_SMOOTH_HINT, 
+	POLYGON_SMOOTH_HINT = POLYGON_SMOOTH_HINT, 
+	UNPACK_SWAP_BYTES = UNPACK_SWAP_BYTES, 
+	UNPACK_LSB_FIRST = UNPACK_LSB_FIRST, 
+	UNPACK_ROW_LENGTH = UNPACK_ROW_LENGTH, 
+	UNPACK_SKIP_ROWS = UNPACK_SKIP_ROWS, 
+	UNPACK_SKIP_PIXELS = UNPACK_SKIP_PIXELS, 
+	UNPACK_ALIGNMENT = UNPACK_ALIGNMENT, 
+	PACK_SWAP_BYTES = PACK_SWAP_BYTES, 
+	PACK_LSB_FIRST = PACK_LSB_FIRST, 
+	PACK_ROW_LENGTH = PACK_ROW_LENGTH, 
+	PACK_SKIP_ROWS = PACK_SKIP_ROWS, 
+	PACK_SKIP_PIXELS = PACK_SKIP_PIXELS, 
+	PACK_ALIGNMENT = PACK_ALIGNMENT, 
+	MAX_TEXTURE_SIZE = MAX_TEXTURE_SIZE, 
+	MAX_VIEWPORT_DIMS = MAX_VIEWPORT_DIMS, 
+	SUBPIXEL_BITS = SUBPIXEL_BITS, 
+	TEXTURE_1D = TEXTURE_1D, 
+	TEXTURE_2D = TEXTURE_2D, 
+	POLYGON_OFFSET_UNITS = POLYGON_OFFSET_UNITS, 
+	POLYGON_OFFSET_POINT = POLYGON_OFFSET_POINT, 
+	POLYGON_OFFSET_LINE = POLYGON_OFFSET_LINE, 
+	POLYGON_OFFSET_FILL = POLYGON_OFFSET_FILL, 
+	POLYGON_OFFSET_FACTOR = POLYGON_OFFSET_FACTOR, 
+	TEXTURE_BINDING_1D = TEXTURE_BINDING_1D, 
+	TEXTURE_BINDING_2D = TEXTURE_BINDING_2D, 
+	TEXTURE_WIDTH = TEXTURE_WIDTH, 
+	TEXTURE_HEIGHT = TEXTURE_HEIGHT, 
+	TEXTURE_INTERNAL_FORMAT = TEXTURE_INTERNAL_FORMAT, 
+	TEXTURE_BORDER_COLOR = TEXTURE_BORDER_COLOR, 
+	TEXTURE_RED_SIZE = TEXTURE_RED_SIZE, 
+	TEXTURE_GREEN_SIZE = TEXTURE_GREEN_SIZE, 
+	TEXTURE_BLUE_SIZE = TEXTURE_BLUE_SIZE, 
+	TEXTURE_ALPHA_SIZE = TEXTURE_ALPHA_SIZE, 
+	DONT_CARE = DONT_CARE, 
+	FASTEST = FASTEST, 
+	NICEST = NICEST, 
+	BYTE = BYTE, 
+	UNSIGNED_BYTE = UNSIGNED_BYTE, 
+	SHORT = SHORT, 
+	UNSIGNED_SHORT = UNSIGNED_SHORT, 
+	INT = INT, 
+	UNSIGNED_INT = UNSIGNED_INT, 
+	FLOAT = FLOAT, 
+	DOUBLE = DOUBLE, 
+	STACK_OVERFLOW = STACK_OVERFLOW, 
+	STACK_UNDERFLOW = STACK_UNDERFLOW, 
+	CLEAR = CLEAR, 
+	AND = AND, 
+	AND_REVERSE = AND_REVERSE, 
+	COPY = COPY, 
+	AND_INVERTED = AND_INVERTED, 
+	NOOP = NOOP, 
+	XOR = XOR, 
+	OR = OR, 
+	NOR = NOR, 
+	EQUIV = EQUIV, 
+	INVERT = INVERT, 
+	OR_REVERSE = OR_REVERSE, 
+	COPY_INVERTED = COPY_INVERTED, 
+	OR_INVERTED = OR_INVERTED, 
+	NAND = NAND, 
+	SET = SET, 
+	TEXTURE = TEXTURE, 
+	COLOR = COLOR, 
+	DEPTH = DEPTH, 
+	STENCIL = STENCIL, 
+	STENCIL_INDEX = STENCIL_INDEX, 
+	DEPTH_COMPONENT = DEPTH_COMPONENT, 
+	RED = RED, 
+	GREEN = GREEN, 
+	BLUE = BLUE, 
+	ALPHA = ALPHA, 
+	RGB = RGB, 
+	RGBA = RGBA, 
+	POINT = POINT, 
+	LINE = LINE, 
+	FILL = FILL, 
+	KEEP = KEEP, 
+	REPLACE = REPLACE, 
+	INCR = INCR, 
+	DECR = DECR, 
+	VENDOR = VENDOR, 
+	RENDERER = RENDERER, 
+	VERSION = VERSION, 
+	EXTENSIONS = EXTENSIONS, 
+	NEAREST = NEAREST, 
+	LINEAR = LINEAR, 
+	NEAREST_MIPMAP_NEAREST = NEAREST_MIPMAP_NEAREST, 
+	LINEAR_MIPMAP_NEAREST = LINEAR_MIPMAP_NEAREST, 
+	NEAREST_MIPMAP_LINEAR = NEAREST_MIPMAP_LINEAR, 
+	LINEAR_MIPMAP_LINEAR = LINEAR_MIPMAP_LINEAR, 
+	TEXTURE_MAG_FILTER = TEXTURE_MAG_FILTER, 
+	TEXTURE_MIN_FILTER = TEXTURE_MIN_FILTER, 
+	TEXTURE_WRAP_S = TEXTURE_WRAP_S, 
+	TEXTURE_WRAP_T = TEXTURE_WRAP_T, 
+	PROXY_TEXTURE_1D = PROXY_TEXTURE_1D, 
+	PROXY_TEXTURE_2D = PROXY_TEXTURE_2D, 
+	REPEAT = REPEAT, 
+	R3_G3_B2 = R3_G3_B2, 
+	RGB4 = RGB4, 
+	RGB5 = RGB5, 
+	RGB8 = RGB8, 
+	RGB10 = RGB10, 
+	RGB12 = RGB12, 
+	RGB16 = RGB16, 
+	RGBA2 = RGBA2, 
+	RGBA4 = RGBA4, 
+	RGB5_A1 = RGB5_A1, 
+	RGBA8 = RGBA8, 
+	RGB10_A2 = RGB10_A2, 
+	RGBA12 = RGBA12, 
+	RGBA16 = RGBA16, 
+	VERTEX_ARRAY = VERTEX_ARRAY, 
+
+	UNSIGNED_BYTE_3_3_2 = UNSIGNED_BYTE_3_3_2, 
+	UNSIGNED_SHORT_4_4_4_4 = UNSIGNED_SHORT_4_4_4_4, 
+	UNSIGNED_SHORT_5_5_5_1 = UNSIGNED_SHORT_5_5_5_1, 
+	UNSIGNED_INT_8_8_8_8 = UNSIGNED_INT_8_8_8_8, 
+	UNSIGNED_INT_10_10_10_2 = UNSIGNED_INT_10_10_10_2, 
+	TEXTURE_BINDING_3D = TEXTURE_BINDING_3D, 
+	PACK_SKIP_IMAGES = PACK_SKIP_IMAGES, 
+	PACK_IMAGE_HEIGHT = PACK_IMAGE_HEIGHT, 
+	UNPACK_SKIP_IMAGES = UNPACK_SKIP_IMAGES, 
+	UNPACK_IMAGE_HEIGHT = UNPACK_IMAGE_HEIGHT, 
+	TEXTURE_3D = TEXTURE_3D, 
+	PROXY_TEXTURE_3D = PROXY_TEXTURE_3D, 
+	TEXTURE_DEPTH = TEXTURE_DEPTH, 
+	TEXTURE_WRAP_R = TEXTURE_WRAP_R, 
+	MAX_3D_TEXTURE_SIZE = MAX_3D_TEXTURE_SIZE, 
+	UNSIGNED_BYTE_2_3_3_REV = UNSIGNED_BYTE_2_3_3_REV, 
+	UNSIGNED_SHORT_5_6_5 = UNSIGNED_SHORT_5_6_5, 
+	UNSIGNED_SHORT_5_6_5_REV = UNSIGNED_SHORT_5_6_5_REV, 
+	UNSIGNED_SHORT_4_4_4_4_REV = UNSIGNED_SHORT_4_4_4_4_REV, 
+	UNSIGNED_SHORT_1_5_5_5_REV = UNSIGNED_SHORT_1_5_5_5_REV, 
+	UNSIGNED_INT_8_8_8_8_REV = UNSIGNED_INT_8_8_8_8_REV, 
+	UNSIGNED_INT_2_10_10_10_REV = UNSIGNED_INT_2_10_10_10_REV, 
+	BGR = BGR, 
+	BGRA = BGRA, 
+	MAX_ELEMENTS_VERTICES = MAX_ELEMENTS_VERTICES, 
+	MAX_ELEMENTS_INDICES = MAX_ELEMENTS_INDICES, 
+	CLAMP_TO_EDGE = CLAMP_TO_EDGE, 
+	TEXTURE_MIN_LOD = TEXTURE_MIN_LOD, 
+	TEXTURE_MAX_LOD = TEXTURE_MAX_LOD, 
+	TEXTURE_BASE_LEVEL = TEXTURE_BASE_LEVEL, 
+	TEXTURE_MAX_LEVEL = TEXTURE_MAX_LEVEL, 
+	SMOOTH_POINT_SIZE_RANGE = SMOOTH_POINT_SIZE_RANGE, 
+	SMOOTH_POINT_SIZE_GRANULARITY = SMOOTH_POINT_SIZE_GRANULARITY, 
+	SMOOTH_LINE_WIDTH_RANGE = SMOOTH_LINE_WIDTH_RANGE, 
+	SMOOTH_LINE_WIDTH_GRANULARITY = SMOOTH_LINE_WIDTH_GRANULARITY, 
+	ALIASED_LINE_WIDTH_RANGE = ALIASED_LINE_WIDTH_RANGE, 
+
+	TEXTURE0 = TEXTURE0, 
+	TEXTURE1 = TEXTURE1, 
+	TEXTURE2 = TEXTURE2, 
+	TEXTURE3 = TEXTURE3, 
+	TEXTURE4 = TEXTURE4, 
+	TEXTURE5 = TEXTURE5, 
+	TEXTURE6 = TEXTURE6, 
+	TEXTURE7 = TEXTURE7, 
+	TEXTURE8 = TEXTURE8, 
+	TEXTURE9 = TEXTURE9, 
+	TEXTURE10 = TEXTURE10, 
+	TEXTURE11 = TEXTURE11, 
+	TEXTURE12 = TEXTURE12, 
+	TEXTURE13 = TEXTURE13, 
+	TEXTURE14 = TEXTURE14, 
+	TEXTURE15 = TEXTURE15, 
+	TEXTURE16 = TEXTURE16, 
+	TEXTURE17 = TEXTURE17, 
+	TEXTURE18 = TEXTURE18, 
+	TEXTURE19 = TEXTURE19, 
+	TEXTURE20 = TEXTURE20, 
+	TEXTURE21 = TEXTURE21, 
+	TEXTURE22 = TEXTURE22, 
+	TEXTURE23 = TEXTURE23, 
+	TEXTURE24 = TEXTURE24, 
+	TEXTURE25 = TEXTURE25, 
+	TEXTURE26 = TEXTURE26, 
+	TEXTURE27 = TEXTURE27, 
+	TEXTURE28 = TEXTURE28, 
+	TEXTURE29 = TEXTURE29, 
+	TEXTURE30 = TEXTURE30, 
+	TEXTURE31 = TEXTURE31, 
+	ACTIVE_TEXTURE = ACTIVE_TEXTURE, 
+	MULTISAMPLE = MULTISAMPLE, 
+	SAMPLE_ALPHA_TO_COVERAGE = SAMPLE_ALPHA_TO_COVERAGE, 
+	SAMPLE_ALPHA_TO_ONE = SAMPLE_ALPHA_TO_ONE, 
+	SAMPLE_COVERAGE = SAMPLE_COVERAGE, 
+	SAMPLE_BUFFERS = SAMPLE_BUFFERS, 
+	SAMPLES = SAMPLES, 
+	SAMPLE_COVERAGE_VALUE = SAMPLE_COVERAGE_VALUE, 
+	SAMPLE_COVERAGE_INVERT = SAMPLE_COVERAGE_INVERT, 
+	TEXTURE_CUBE_MAP = TEXTURE_CUBE_MAP, 
+	TEXTURE_BINDING_CUBE_MAP = TEXTURE_BINDING_CUBE_MAP, 
+	TEXTURE_CUBE_MAP_POSITIVE_X = TEXTURE_CUBE_MAP_POSITIVE_X, 
+	TEXTURE_CUBE_MAP_NEGATIVE_X = TEXTURE_CUBE_MAP_NEGATIVE_X, 
+	TEXTURE_CUBE_MAP_POSITIVE_Y = TEXTURE_CUBE_MAP_POSITIVE_Y, 
+	TEXTURE_CUBE_MAP_NEGATIVE_Y = TEXTURE_CUBE_MAP_NEGATIVE_Y, 
+	TEXTURE_CUBE_MAP_POSITIVE_Z = TEXTURE_CUBE_MAP_POSITIVE_Z, 
+	TEXTURE_CUBE_MAP_NEGATIVE_Z = TEXTURE_CUBE_MAP_NEGATIVE_Z, 
+	PROXY_TEXTURE_CUBE_MAP = PROXY_TEXTURE_CUBE_MAP, 
+	MAX_CUBE_MAP_TEXTURE_SIZE = MAX_CUBE_MAP_TEXTURE_SIZE, 
+	COMPRESSED_RGB = COMPRESSED_RGB, 
+	COMPRESSED_RGBA = COMPRESSED_RGBA, 
+	TEXTURE_COMPRESSION_HINT = TEXTURE_COMPRESSION_HINT, 
+	TEXTURE_COMPRESSED_IMAGE_SIZE = TEXTURE_COMPRESSED_IMAGE_SIZE, 
+	TEXTURE_COMPRESSED = TEXTURE_COMPRESSED, 
+	NUM_COMPRESSED_TEXTURE_FORMATS = NUM_COMPRESSED_TEXTURE_FORMATS, 
+	COMPRESSED_TEXTURE_FORMATS = COMPRESSED_TEXTURE_FORMATS, 
+	CLAMP_TO_BORDER = CLAMP_TO_BORDER, 
+
+	BLEND_DST_RGB = BLEND_DST_RGB, 
+	BLEND_SRC_RGB = BLEND_SRC_RGB, 
+	BLEND_DST_ALPHA = BLEND_DST_ALPHA, 
+	BLEND_SRC_ALPHA = BLEND_SRC_ALPHA, 
+	POINT_FADE_THRESHOLD_SIZE = POINT_FADE_THRESHOLD_SIZE, 
+	DEPTH_COMPONENT16 = DEPTH_COMPONENT16, 
+	DEPTH_COMPONENT24 = DEPTH_COMPONENT24, 
+	DEPTH_COMPONENT32 = DEPTH_COMPONENT32, 
+	MIRRORED_REPEAT = MIRRORED_REPEAT, 
+	MAX_TEXTURE_LOD_BIAS = MAX_TEXTURE_LOD_BIAS, 
+	TEXTURE_LOD_BIAS = TEXTURE_LOD_BIAS, 
+	INCR_WRAP = INCR_WRAP, 
+	DECR_WRAP = DECR_WRAP, 
+	TEXTURE_DEPTH_SIZE = TEXTURE_DEPTH_SIZE, 
+	TEXTURE_COMPARE_MODE = TEXTURE_COMPARE_MODE, 
+	TEXTURE_COMPARE_FUNC = TEXTURE_COMPARE_FUNC, 
+	FUNC_ADD = FUNC_ADD, 
+	FUNC_SUBTRACT = FUNC_SUBTRACT, 
+	FUNC_REVERSE_SUBTRACT = FUNC_REVERSE_SUBTRACT, 
+	MIN = MIN, 
+	MAX = MAX, 
+	CONSTANT_COLOR = CONSTANT_COLOR, 
+	ONE_MINUS_CONSTANT_COLOR = ONE_MINUS_CONSTANT_COLOR, 
+	CONSTANT_ALPHA = CONSTANT_ALPHA, 
+	ONE_MINUS_CONSTANT_ALPHA = ONE_MINUS_CONSTANT_ALPHA, 
+
+	BUFFER_SIZE = BUFFER_SIZE, 
+	BUFFER_USAGE = BUFFER_USAGE, 
+	QUERY_COUNTER_BITS = QUERY_COUNTER_BITS, 
+	CURRENT_QUERY = CURRENT_QUERY, 
+	QUERY_RESULT = QUERY_RESULT, 
+	QUERY_RESULT_AVAILABLE = QUERY_RESULT_AVAILABLE, 
+	ARRAY_BUFFER = ARRAY_BUFFER, 
+	ELEMENT_ARRAY_BUFFER = ELEMENT_ARRAY_BUFFER, 
+	ARRAY_BUFFER_BINDING = ARRAY_BUFFER_BINDING, 
+	ELEMENT_ARRAY_BUFFER_BINDING = ELEMENT_ARRAY_BUFFER_BINDING, 
+	VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, 
+	READ_ONLY = READ_ONLY, 
+	WRITE_ONLY = WRITE_ONLY, 
+	READ_WRITE = READ_WRITE, 
+	BUFFER_ACCESS = BUFFER_ACCESS, 
+	BUFFER_MAPPED = BUFFER_MAPPED, 
+	BUFFER_MAP_POINTER = BUFFER_MAP_POINTER, 
+	STREAM_DRAW = STREAM_DRAW, 
+	STREAM_READ = STREAM_READ, 
+	STREAM_COPY = STREAM_COPY, 
+	STATIC_DRAW = STATIC_DRAW, 
+	STATIC_READ = STATIC_READ, 
+	STATIC_COPY = STATIC_COPY, 
+	DYNAMIC_DRAW = DYNAMIC_DRAW, 
+	DYNAMIC_READ = DYNAMIC_READ, 
+	DYNAMIC_COPY = DYNAMIC_COPY, 
+	SAMPLES_PASSED = SAMPLES_PASSED, 
+	SRC1_ALPHA = SRC1_ALPHA, 
+
+	BLEND_EQUATION_RGB = BLEND_EQUATION_RGB, 
+	VERTEX_ATTRIB_ARRAY_ENABLED = VERTEX_ATTRIB_ARRAY_ENABLED, 
+	VERTEX_ATTRIB_ARRAY_SIZE = VERTEX_ATTRIB_ARRAY_SIZE, 
+	VERTEX_ATTRIB_ARRAY_STRIDE = VERTEX_ATTRIB_ARRAY_STRIDE, 
+	VERTEX_ATTRIB_ARRAY_TYPE = VERTEX_ATTRIB_ARRAY_TYPE, 
+	CURRENT_VERTEX_ATTRIB = CURRENT_VERTEX_ATTRIB, 
+	VERTEX_PROGRAM_POINT_SIZE = VERTEX_PROGRAM_POINT_SIZE, 
+	VERTEX_ATTRIB_ARRAY_POINTER = VERTEX_ATTRIB_ARRAY_POINTER, 
+	STENCIL_BACK_FUNC = STENCIL_BACK_FUNC, 
+	STENCIL_BACK_FAIL = STENCIL_BACK_FAIL, 
+	STENCIL_BACK_PASS_DEPTH_FAIL = STENCIL_BACK_PASS_DEPTH_FAIL, 
+	STENCIL_BACK_PASS_DEPTH_PASS = STENCIL_BACK_PASS_DEPTH_PASS, 
+	MAX_DRAW_BUFFERS = MAX_DRAW_BUFFERS, 
+	DRAW_BUFFER0 = DRAW_BUFFER0, 
+	DRAW_BUFFER1 = DRAW_BUFFER1, 
+	DRAW_BUFFER2 = DRAW_BUFFER2, 
+	DRAW_BUFFER3 = DRAW_BUFFER3, 
+	DRAW_BUFFER4 = DRAW_BUFFER4, 
+	DRAW_BUFFER5 = DRAW_BUFFER5, 
+	DRAW_BUFFER6 = DRAW_BUFFER6, 
+	DRAW_BUFFER7 = DRAW_BUFFER7, 
+	DRAW_BUFFER8 = DRAW_BUFFER8, 
+	DRAW_BUFFER9 = DRAW_BUFFER9, 
+	DRAW_BUFFER10 = DRAW_BUFFER10, 
+	DRAW_BUFFER11 = DRAW_BUFFER11, 
+	DRAW_BUFFER12 = DRAW_BUFFER12, 
+	DRAW_BUFFER13 = DRAW_BUFFER13, 
+	DRAW_BUFFER14 = DRAW_BUFFER14, 
+	DRAW_BUFFER15 = DRAW_BUFFER15, 
+	BLEND_EQUATION_ALPHA = BLEND_EQUATION_ALPHA, 
+	MAX_VERTEX_ATTRIBS = MAX_VERTEX_ATTRIBS, 
+	VERTEX_ATTRIB_ARRAY_NORMALIZED = VERTEX_ATTRIB_ARRAY_NORMALIZED, 
+	MAX_TEXTURE_IMAGE_UNITS = MAX_TEXTURE_IMAGE_UNITS, 
+	FRAGMENT_SHADER = FRAGMENT_SHADER, 
+	VERTEX_SHADER = VERTEX_SHADER, 
+	MAX_FRAGMENT_UNIFORM_COMPONENTS = MAX_FRAGMENT_UNIFORM_COMPONENTS, 
+	MAX_VERTEX_UNIFORM_COMPONENTS = MAX_VERTEX_UNIFORM_COMPONENTS, 
+	MAX_VARYING_FLOATS = MAX_VARYING_FLOATS, 
+	MAX_VERTEX_TEXTURE_IMAGE_UNITS = MAX_VERTEX_TEXTURE_IMAGE_UNITS, 
+	MAX_COMBINED_TEXTURE_IMAGE_UNITS = MAX_COMBINED_TEXTURE_IMAGE_UNITS, 
+	SHADER_TYPE = SHADER_TYPE, 
+	FLOAT_VEC2 = FLOAT_VEC2, 
+	FLOAT_VEC3 = FLOAT_VEC3, 
+	FLOAT_VEC4 = FLOAT_VEC4, 
+	INT_VEC2 = INT_VEC2, 
+	INT_VEC3 = INT_VEC3, 
+	INT_VEC4 = INT_VEC4, 
+	BOOL = BOOL, 
+	BOOL_VEC2 = BOOL_VEC2, 
+	BOOL_VEC3 = BOOL_VEC3, 
+	BOOL_VEC4 = BOOL_VEC4, 
+	FLOAT_MAT2 = FLOAT_MAT2, 
+	FLOAT_MAT3 = FLOAT_MAT3, 
+	FLOAT_MAT4 = FLOAT_MAT4, 
+	SAMPLER_1D = SAMPLER_1D, 
+	SAMPLER_2D = SAMPLER_2D, 
+	SAMPLER_3D = SAMPLER_3D, 
+	SAMPLER_CUBE = SAMPLER_CUBE, 
+	SAMPLER_1D_SHADOW = SAMPLER_1D_SHADOW, 
+	SAMPLER_2D_SHADOW = SAMPLER_2D_SHADOW, 
+	DELETE_STATUS = DELETE_STATUS, 
+	COMPILE_STATUS = COMPILE_STATUS, 
+	LINK_STATUS = LINK_STATUS, 
+	VALIDATE_STATUS = VALIDATE_STATUS, 
+	INFO_LOG_LENGTH = INFO_LOG_LENGTH, 
+	ATTACHED_SHADERS = ATTACHED_SHADERS, 
+	ACTIVE_UNIFORMS = ACTIVE_UNIFORMS, 
+	ACTIVE_UNIFORM_MAX_LENGTH = ACTIVE_UNIFORM_MAX_LENGTH, 
+	SHADER_SOURCE_LENGTH = SHADER_SOURCE_LENGTH, 
+	ACTIVE_ATTRIBUTES = ACTIVE_ATTRIBUTES, 
+	ACTIVE_ATTRIBUTE_MAX_LENGTH = ACTIVE_ATTRIBUTE_MAX_LENGTH, 
+	FRAGMENT_SHADER_DERIVATIVE_HINT = FRAGMENT_SHADER_DERIVATIVE_HINT, 
+	SHADING_LANGUAGE_VERSION = SHADING_LANGUAGE_VERSION, 
+	CURRENT_PROGRAM = CURRENT_PROGRAM, 
+	POINT_SPRITE_COORD_ORIGIN = POINT_SPRITE_COORD_ORIGIN, 
+	LOWER_LEFT = LOWER_LEFT, 
+	UPPER_LEFT = UPPER_LEFT, 
+	STENCIL_BACK_REF = STENCIL_BACK_REF, 
+	STENCIL_BACK_VALUE_MASK = STENCIL_BACK_VALUE_MASK, 
+	STENCIL_BACK_WRITEMASK = STENCIL_BACK_WRITEMASK, 
+
+	PIXEL_PACK_BUFFER = PIXEL_PACK_BUFFER, 
+	PIXEL_UNPACK_BUFFER = PIXEL_UNPACK_BUFFER, 
+	PIXEL_PACK_BUFFER_BINDING = PIXEL_PACK_BUFFER_BINDING, 
+	PIXEL_UNPACK_BUFFER_BINDING = PIXEL_UNPACK_BUFFER_BINDING, 
+	FLOAT_MAT2x3 = FLOAT_MAT2x3, 
+	FLOAT_MAT2x4 = FLOAT_MAT2x4, 
+	FLOAT_MAT3x2 = FLOAT_MAT3x2, 
+	FLOAT_MAT3x4 = FLOAT_MAT3x4, 
+	FLOAT_MAT4x2 = FLOAT_MAT4x2, 
+	FLOAT_MAT4x3 = FLOAT_MAT4x3, 
+	SRGB = SRGB, 
+	SRGB8 = SRGB8, 
+	SRGB_ALPHA = SRGB_ALPHA, 
+	SRGB8_ALPHA8 = SRGB8_ALPHA8, 
+	COMPRESSED_SRGB = COMPRESSED_SRGB, 
+	COMPRESSED_SRGB_ALPHA = COMPRESSED_SRGB_ALPHA, 
+
+	COMPARE_REF_TO_TEXTURE = COMPARE_REF_TO_TEXTURE, 
+	CLIP_DISTANCE0 = CLIP_DISTANCE0, 
+	CLIP_DISTANCE1 = CLIP_DISTANCE1, 
+	CLIP_DISTANCE2 = CLIP_DISTANCE2, 
+	CLIP_DISTANCE3 = CLIP_DISTANCE3, 
+	CLIP_DISTANCE4 = CLIP_DISTANCE4, 
+	CLIP_DISTANCE5 = CLIP_DISTANCE5, 
+	CLIP_DISTANCE6 = CLIP_DISTANCE6, 
+	CLIP_DISTANCE7 = CLIP_DISTANCE7, 
+	MAX_CLIP_DISTANCES = MAX_CLIP_DISTANCES, 
+	MAJOR_VERSION = MAJOR_VERSION, 
+	MINOR_VERSION = MINOR_VERSION, 
+	NUM_EXTENSIONS = NUM_EXTENSIONS, 
+	CONTEXT_FLAGS = CONTEXT_FLAGS, 
+	COMPRESSED_RED = COMPRESSED_RED, 
+	COMPRESSED_RG = COMPRESSED_RG, 
+	CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT, 
+	RGBA32F = RGBA32F, 
+	RGB32F = RGB32F, 
+	RGBA16F = RGBA16F, 
+	RGB16F = RGB16F, 
+	VERTEX_ATTRIB_ARRAY_INTEGER = VERTEX_ATTRIB_ARRAY_INTEGER, 
+	MAX_ARRAY_TEXTURE_LAYERS = MAX_ARRAY_TEXTURE_LAYERS, 
+	MIN_PROGRAM_TEXEL_OFFSET = MIN_PROGRAM_TEXEL_OFFSET, 
+	MAX_PROGRAM_TEXEL_OFFSET = MAX_PROGRAM_TEXEL_OFFSET, 
+	CLAMP_READ_COLOR = CLAMP_READ_COLOR, 
+	FIXED_ONLY = FIXED_ONLY, 
+	MAX_VARYING_COMPONENTS = MAX_VARYING_COMPONENTS, 
+	TEXTURE_1D_ARRAY = TEXTURE_1D_ARRAY, 
+	PROXY_TEXTURE_1D_ARRAY = PROXY_TEXTURE_1D_ARRAY, 
+	TEXTURE_2D_ARRAY = TEXTURE_2D_ARRAY, 
+	PROXY_TEXTURE_2D_ARRAY = PROXY_TEXTURE_2D_ARRAY, 
+	TEXTURE_BINDING_1D_ARRAY = TEXTURE_BINDING_1D_ARRAY, 
+	TEXTURE_BINDING_2D_ARRAY = TEXTURE_BINDING_2D_ARRAY, 
+	R11F_G11F_B10F = R11F_G11F_B10F, 
+	UNSIGNED_INT_10F_11F_11F_REV = UNSIGNED_INT_10F_11F_11F_REV, 
+	RGB9_E5 = RGB9_E5, 
+	UNSIGNED_INT_5_9_9_9_REV = UNSIGNED_INT_5_9_9_9_REV, 
+	TEXTURE_SHARED_SIZE = TEXTURE_SHARED_SIZE, 
+	TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH, 
+	TRANSFORM_FEEDBACK_BUFFER_MODE = TRANSFORM_FEEDBACK_BUFFER_MODE, 
+	MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS, 
+	TRANSFORM_FEEDBACK_VARYINGS = TRANSFORM_FEEDBACK_VARYINGS, 
+	TRANSFORM_FEEDBACK_BUFFER_START = TRANSFORM_FEEDBACK_BUFFER_START, 
+	TRANSFORM_FEEDBACK_BUFFER_SIZE = TRANSFORM_FEEDBACK_BUFFER_SIZE, 
+	PRIMITIVES_GENERATED = PRIMITIVES_GENERATED, 
+	TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, 
+	RASTERIZER_DISCARD = RASTERIZER_DISCARD, 
+	MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS, 
+	MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, 
+	INTERLEAVED_ATTRIBS = INTERLEAVED_ATTRIBS, 
+	SEPARATE_ATTRIBS = SEPARATE_ATTRIBS, 
+	TRANSFORM_FEEDBACK_BUFFER = TRANSFORM_FEEDBACK_BUFFER, 
+	TRANSFORM_FEEDBACK_BUFFER_BINDING = TRANSFORM_FEEDBACK_BUFFER_BINDING, 
+	RGBA32UI = RGBA32UI, 
+	RGB32UI = RGB32UI, 
+	RGBA16UI = RGBA16UI, 
+	RGB16UI = RGB16UI, 
+	RGBA8UI = RGBA8UI, 
+	RGB8UI = RGB8UI, 
+	RGBA32I = RGBA32I, 
+	RGB32I = RGB32I, 
+	RGBA16I = RGBA16I, 
+	RGB16I = RGB16I, 
+	RGBA8I = RGBA8I, 
+	RGB8I = RGB8I, 
+	RED_INTEGER = RED_INTEGER, 
+	GREEN_INTEGER = GREEN_INTEGER, 
+	BLUE_INTEGER = BLUE_INTEGER, 
+	RGB_INTEGER = RGB_INTEGER, 
+	RGBA_INTEGER = RGBA_INTEGER, 
+	BGR_INTEGER = BGR_INTEGER, 
+	BGRA_INTEGER = BGRA_INTEGER, 
+	SAMPLER_1D_ARRAY = SAMPLER_1D_ARRAY, 
+	SAMPLER_2D_ARRAY = SAMPLER_2D_ARRAY, 
+	SAMPLER_1D_ARRAY_SHADOW = SAMPLER_1D_ARRAY_SHADOW, 
+	SAMPLER_2D_ARRAY_SHADOW = SAMPLER_2D_ARRAY_SHADOW, 
+	SAMPLER_CUBE_SHADOW = SAMPLER_CUBE_SHADOW, 
+	UNSIGNED_INT_VEC2 = UNSIGNED_INT_VEC2, 
+	UNSIGNED_INT_VEC3 = UNSIGNED_INT_VEC3, 
+	UNSIGNED_INT_VEC4 = UNSIGNED_INT_VEC4, 
+	INT_SAMPLER_1D = INT_SAMPLER_1D, 
+	INT_SAMPLER_2D = INT_SAMPLER_2D, 
+	INT_SAMPLER_3D = INT_SAMPLER_3D, 
+	INT_SAMPLER_CUBE = INT_SAMPLER_CUBE, 
+	INT_SAMPLER_1D_ARRAY = INT_SAMPLER_1D_ARRAY, 
+	INT_SAMPLER_2D_ARRAY = INT_SAMPLER_2D_ARRAY, 
+	UNSIGNED_INT_SAMPLER_1D = UNSIGNED_INT_SAMPLER_1D, 
+	UNSIGNED_INT_SAMPLER_2D = UNSIGNED_INT_SAMPLER_2D, 
+	UNSIGNED_INT_SAMPLER_3D = UNSIGNED_INT_SAMPLER_3D, 
+	UNSIGNED_INT_SAMPLER_CUBE = UNSIGNED_INT_SAMPLER_CUBE, 
+	UNSIGNED_INT_SAMPLER_1D_ARRAY = UNSIGNED_INT_SAMPLER_1D_ARRAY, 
+	UNSIGNED_INT_SAMPLER_2D_ARRAY = UNSIGNED_INT_SAMPLER_2D_ARRAY, 
+	QUERY_WAIT = QUERY_WAIT, 
+	QUERY_NO_WAIT = QUERY_NO_WAIT, 
+	QUERY_BY_REGION_WAIT = QUERY_BY_REGION_WAIT, 
+	QUERY_BY_REGION_NO_WAIT = QUERY_BY_REGION_NO_WAIT, 
+	BUFFER_ACCESS_FLAGS = BUFFER_ACCESS_FLAGS, 
+	BUFFER_MAP_LENGTH = BUFFER_MAP_LENGTH, 
+	BUFFER_MAP_OFFSET = BUFFER_MAP_OFFSET, 
+	DEPTH_COMPONENT32F = DEPTH_COMPONENT32F, 
+	DEPTH32F_STENCIL8 = DEPTH32F_STENCIL8, 
+	FLOAT_32_UNSIGNED_INT_24_8_REV = FLOAT_32_UNSIGNED_INT_24_8_REV, 
+	INVALID_FRAMEBUFFER_OPERATION = INVALID_FRAMEBUFFER_OPERATION, 
+	FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING = FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, 
+	FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE = FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE, 
+	FRAMEBUFFER_ATTACHMENT_RED_SIZE = FRAMEBUFFER_ATTACHMENT_RED_SIZE, 
+	FRAMEBUFFER_ATTACHMENT_GREEN_SIZE = FRAMEBUFFER_ATTACHMENT_GREEN_SIZE, 
+	FRAMEBUFFER_ATTACHMENT_BLUE_SIZE = FRAMEBUFFER_ATTACHMENT_BLUE_SIZE, 
+	FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE = FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE, 
+	FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE = FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE, 
+	FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE = FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE, 
+	FRAMEBUFFER_DEFAULT = FRAMEBUFFER_DEFAULT, 
+	FRAMEBUFFER_UNDEFINED = FRAMEBUFFER_UNDEFINED, 
+	DEPTH_STENCIL_ATTACHMENT = DEPTH_STENCIL_ATTACHMENT, 
+	MAX_RENDERBUFFER_SIZE = MAX_RENDERBUFFER_SIZE, 
+	DEPTH_STENCIL = DEPTH_STENCIL, 
+	UNSIGNED_INT_24_8 = UNSIGNED_INT_24_8, 
+	DEPTH24_STENCIL8 = DEPTH24_STENCIL8, 
+	TEXTURE_STENCIL_SIZE = TEXTURE_STENCIL_SIZE, 
+	TEXTURE_RED_TYPE = TEXTURE_RED_TYPE, 
+	TEXTURE_GREEN_TYPE = TEXTURE_GREEN_TYPE, 
+	TEXTURE_BLUE_TYPE = TEXTURE_BLUE_TYPE, 
+	TEXTURE_ALPHA_TYPE = TEXTURE_ALPHA_TYPE, 
+	TEXTURE_DEPTH_TYPE = TEXTURE_DEPTH_TYPE, 
+	UNSIGNED_NORMALIZED = UNSIGNED_NORMALIZED, 
+	FRAMEBUFFER_BINDING = FRAMEBUFFER_BINDING, 
+	DRAW_FRAMEBUFFER_BINDING = DRAW_FRAMEBUFFER_BINDING, 
+	RENDERBUFFER_BINDING = RENDERBUFFER_BINDING, 
+	READ_FRAMEBUFFER = READ_FRAMEBUFFER, 
+	DRAW_FRAMEBUFFER = DRAW_FRAMEBUFFER, 
+	READ_FRAMEBUFFER_BINDING = READ_FRAMEBUFFER_BINDING, 
+	RENDERBUFFER_SAMPLES = RENDERBUFFER_SAMPLES, 
+	FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, 
+	FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, 
+	FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, 
+	FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, 
+	FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER = FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER, 
+	FRAMEBUFFER_COMPLETE = FRAMEBUFFER_COMPLETE, 
+	FRAMEBUFFER_INCOMPLETE_ATTACHMENT = FRAMEBUFFER_INCOMPLETE_ATTACHMENT, 
+	FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT, 
+	FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER = FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER, 
+	FRAMEBUFFER_INCOMPLETE_READ_BUFFER = FRAMEBUFFER_INCOMPLETE_READ_BUFFER, 
+	FRAMEBUFFER_UNSUPPORTED = FRAMEBUFFER_UNSUPPORTED, 
+	MAX_COLOR_ATTACHMENTS = MAX_COLOR_ATTACHMENTS, 
+	COLOR_ATTACHMENT0 = COLOR_ATTACHMENT0, 
+	COLOR_ATTACHMENT1 = COLOR_ATTACHMENT1, 
+	COLOR_ATTACHMENT2 = COLOR_ATTACHMENT2, 
+	COLOR_ATTACHMENT3 = COLOR_ATTACHMENT3, 
+	COLOR_ATTACHMENT4 = COLOR_ATTACHMENT4, 
+	COLOR_ATTACHMENT5 = COLOR_ATTACHMENT5, 
+	COLOR_ATTACHMENT6 = COLOR_ATTACHMENT6, 
+	COLOR_ATTACHMENT7 = COLOR_ATTACHMENT7, 
+	COLOR_ATTACHMENT8 = COLOR_ATTACHMENT8, 
+	COLOR_ATTACHMENT9 = COLOR_ATTACHMENT9, 
+	COLOR_ATTACHMENT10 = COLOR_ATTACHMENT10, 
+	COLOR_ATTACHMENT11 = COLOR_ATTACHMENT11, 
+	COLOR_ATTACHMENT12 = COLOR_ATTACHMENT12, 
+	COLOR_ATTACHMENT13 = COLOR_ATTACHMENT13, 
+	COLOR_ATTACHMENT14 = COLOR_ATTACHMENT14, 
+	COLOR_ATTACHMENT15 = COLOR_ATTACHMENT15, 
+	COLOR_ATTACHMENT16 = COLOR_ATTACHMENT16, 
+	COLOR_ATTACHMENT17 = COLOR_ATTACHMENT17, 
+	COLOR_ATTACHMENT18 = COLOR_ATTACHMENT18, 
+	COLOR_ATTACHMENT19 = COLOR_ATTACHMENT19, 
+	COLOR_ATTACHMENT20 = COLOR_ATTACHMENT20, 
+	COLOR_ATTACHMENT21 = COLOR_ATTACHMENT21, 
+	COLOR_ATTACHMENT22 = COLOR_ATTACHMENT22, 
+	COLOR_ATTACHMENT23 = COLOR_ATTACHMENT23, 
+	COLOR_ATTACHMENT24 = COLOR_ATTACHMENT24, 
+	COLOR_ATTACHMENT25 = COLOR_ATTACHMENT25, 
+	COLOR_ATTACHMENT26 = COLOR_ATTACHMENT26, 
+	COLOR_ATTACHMENT27 = COLOR_ATTACHMENT27, 
+	COLOR_ATTACHMENT28 = COLOR_ATTACHMENT28, 
+	COLOR_ATTACHMENT29 = COLOR_ATTACHMENT29, 
+	COLOR_ATTACHMENT30 = COLOR_ATTACHMENT30, 
+	COLOR_ATTACHMENT31 = COLOR_ATTACHMENT31, 
+	DEPTH_ATTACHMENT = DEPTH_ATTACHMENT, 
+	STENCIL_ATTACHMENT = STENCIL_ATTACHMENT, 
+	FRAMEBUFFER = FRAMEBUFFER, 
+	RENDERBUFFER = RENDERBUFFER, 
+	RENDERBUFFER_WIDTH = RENDERBUFFER_WIDTH, 
+	RENDERBUFFER_HEIGHT = RENDERBUFFER_HEIGHT, 
+	RENDERBUFFER_INTERNAL_FORMAT = RENDERBUFFER_INTERNAL_FORMAT, 
+	STENCIL_INDEX1 = STENCIL_INDEX1, 
+	STENCIL_INDEX4 = STENCIL_INDEX4, 
+	STENCIL_INDEX8 = STENCIL_INDEX8, 
+	STENCIL_INDEX16 = STENCIL_INDEX16, 
+	RENDERBUFFER_RED_SIZE = RENDERBUFFER_RED_SIZE, 
+	RENDERBUFFER_GREEN_SIZE = RENDERBUFFER_GREEN_SIZE, 
+	RENDERBUFFER_BLUE_SIZE = RENDERBUFFER_BLUE_SIZE, 
+	RENDERBUFFER_ALPHA_SIZE = RENDERBUFFER_ALPHA_SIZE, 
+	RENDERBUFFER_DEPTH_SIZE = RENDERBUFFER_DEPTH_SIZE, 
+	RENDERBUFFER_STENCIL_SIZE = RENDERBUFFER_STENCIL_SIZE, 
+	FRAMEBUFFER_INCOMPLETE_MULTISAMPLE = FRAMEBUFFER_INCOMPLETE_MULTISAMPLE, 
+	MAX_SAMPLES = MAX_SAMPLES, 
+	FRAMEBUFFER_SRGB = FRAMEBUFFER_SRGB, 
+	HALF_FLOAT = HALF_FLOAT, 
+	MAP_READ_BIT = MAP_READ_BIT, 
+	MAP_WRITE_BIT = MAP_WRITE_BIT, 
+	MAP_INVALIDATE_RANGE_BIT = MAP_INVALIDATE_RANGE_BIT, 
+	MAP_INVALIDATE_BUFFER_BIT = MAP_INVALIDATE_BUFFER_BIT, 
+	MAP_FLUSH_EXPLICIT_BIT = MAP_FLUSH_EXPLICIT_BIT, 
+	MAP_UNSYNCHRONIZED_BIT = MAP_UNSYNCHRONIZED_BIT, 
+	COMPRESSED_RED_RGTC1 = COMPRESSED_RED_RGTC1, 
+	COMPRESSED_SIGNED_RED_RGTC1 = COMPRESSED_SIGNED_RED_RGTC1, 
+	COMPRESSED_RG_RGTC2 = COMPRESSED_RG_RGTC2, 
+	COMPRESSED_SIGNED_RG_RGTC2 = COMPRESSED_SIGNED_RG_RGTC2, 
+	RG = RG, 
+	RG_INTEGER = RG_INTEGER, 
+	R8 = R8, 
+	R16 = R16, 
+	RG8 = RG8, 
+	RG16 = RG16, 
+	R16F = R16F, 
+	R32F = R32F, 
+	RG16F = RG16F, 
+	RG32F = RG32F, 
+	R8I = R8I, 
+	R8UI = R8UI, 
+	R16I = R16I, 
+	R16UI = R16UI, 
+	R32I = R32I, 
+	R32UI = R32UI, 
+	RG8I = RG8I, 
+	RG8UI = RG8UI, 
+	RG16I = RG16I, 
+	RG16UI = RG16UI, 
+	RG32I = RG32I, 
+	RG32UI = RG32UI, 
+	VERTEX_ARRAY_BINDING = VERTEX_ARRAY_BINDING, 
+
+	SAMPLER_2D_RECT = SAMPLER_2D_RECT, 
+	SAMPLER_2D_RECT_SHADOW = SAMPLER_2D_RECT_SHADOW, 
+	SAMPLER_BUFFER = SAMPLER_BUFFER, 
+	INT_SAMPLER_2D_RECT = INT_SAMPLER_2D_RECT, 
+	INT_SAMPLER_BUFFER = INT_SAMPLER_BUFFER, 
+	UNSIGNED_INT_SAMPLER_2D_RECT = UNSIGNED_INT_SAMPLER_2D_RECT, 
+	UNSIGNED_INT_SAMPLER_BUFFER = UNSIGNED_INT_SAMPLER_BUFFER, 
+	TEXTURE_BUFFER = TEXTURE_BUFFER, 
+	MAX_TEXTURE_BUFFER_SIZE = MAX_TEXTURE_BUFFER_SIZE, 
+	TEXTURE_BINDING_BUFFER = TEXTURE_BINDING_BUFFER, 
+	TEXTURE_BUFFER_DATA_STORE_BINDING = TEXTURE_BUFFER_DATA_STORE_BINDING, 
+	TEXTURE_RECTANGLE = TEXTURE_RECTANGLE, 
+	TEXTURE_BINDING_RECTANGLE = TEXTURE_BINDING_RECTANGLE, 
+	PROXY_TEXTURE_RECTANGLE = PROXY_TEXTURE_RECTANGLE, 
+	MAX_RECTANGLE_TEXTURE_SIZE = MAX_RECTANGLE_TEXTURE_SIZE, 
+	R8_SNORM = R8_SNORM, 
+	RG8_SNORM = RG8_SNORM, 
+	RGB8_SNORM = RGB8_SNORM, 
+	RGBA8_SNORM = RGBA8_SNORM, 
+	R16_SNORM = R16_SNORM, 
+	RG16_SNORM = RG16_SNORM, 
+	RGB16_SNORM = RGB16_SNORM, 
+	RGBA16_SNORM = RGBA16_SNORM, 
+	SIGNED_NORMALIZED = SIGNED_NORMALIZED, 
+	PRIMITIVE_RESTART = PRIMITIVE_RESTART, 
+	PRIMITIVE_RESTART_INDEX = PRIMITIVE_RESTART_INDEX, 
+	COPY_READ_BUFFER = COPY_READ_BUFFER, 
+	COPY_WRITE_BUFFER = COPY_WRITE_BUFFER, 
+	UNIFORM_BUFFER = UNIFORM_BUFFER, 
+	UNIFORM_BUFFER_BINDING = UNIFORM_BUFFER_BINDING, 
+	UNIFORM_BUFFER_START = UNIFORM_BUFFER_START, 
+	UNIFORM_BUFFER_SIZE = UNIFORM_BUFFER_SIZE, 
+	MAX_VERTEX_UNIFORM_BLOCKS = MAX_VERTEX_UNIFORM_BLOCKS, 
+	MAX_GEOMETRY_UNIFORM_BLOCKS = MAX_GEOMETRY_UNIFORM_BLOCKS, 
+	MAX_FRAGMENT_UNIFORM_BLOCKS = MAX_FRAGMENT_UNIFORM_BLOCKS, 
+	MAX_COMBINED_UNIFORM_BLOCKS = MAX_COMBINED_UNIFORM_BLOCKS, 
+	MAX_UNIFORM_BUFFER_BINDINGS = MAX_UNIFORM_BUFFER_BINDINGS, 
+	MAX_UNIFORM_BLOCK_SIZE = MAX_UNIFORM_BLOCK_SIZE, 
+	MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS = MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS, 
+	MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS = MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS, 
+	MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS = MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS, 
+	UNIFORM_BUFFER_OFFSET_ALIGNMENT = UNIFORM_BUFFER_OFFSET_ALIGNMENT, 
+	ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH = ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, 
+	ACTIVE_UNIFORM_BLOCKS = ACTIVE_UNIFORM_BLOCKS, 
+	UNIFORM_TYPE = UNIFORM_TYPE, 
+	UNIFORM_SIZE = UNIFORM_SIZE, 
+	UNIFORM_NAME_LENGTH = UNIFORM_NAME_LENGTH, 
+	UNIFORM_BLOCK_INDEX = UNIFORM_BLOCK_INDEX, 
+	UNIFORM_OFFSET = UNIFORM_OFFSET, 
+	UNIFORM_ARRAY_STRIDE = UNIFORM_ARRAY_STRIDE, 
+	UNIFORM_MATRIX_STRIDE = UNIFORM_MATRIX_STRIDE, 
+	UNIFORM_IS_ROW_MAJOR = UNIFORM_IS_ROW_MAJOR, 
+	UNIFORM_BLOCK_BINDING = UNIFORM_BLOCK_BINDING, 
+	UNIFORM_BLOCK_DATA_SIZE = UNIFORM_BLOCK_DATA_SIZE, 
+	UNIFORM_BLOCK_NAME_LENGTH = UNIFORM_BLOCK_NAME_LENGTH, 
+	UNIFORM_BLOCK_ACTIVE_UNIFORMS = UNIFORM_BLOCK_ACTIVE_UNIFORMS, 
+	UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES = UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES, 
+	UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER = UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER, 
+	UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER = UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER, 
+	UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER = UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER, 
+	INVALID_INDEX = INVALID_INDEX, 
+
+	CONTEXT_CORE_PROFILE_BIT = CONTEXT_CORE_PROFILE_BIT, 
+	CONTEXT_COMPATIBILITY_PROFILE_BIT = CONTEXT_COMPATIBILITY_PROFILE_BIT, 
+	LINES_ADJACENCY = LINES_ADJACENCY, 
+	LINE_STRIP_ADJACENCY = LINE_STRIP_ADJACENCY, 
+	TRIANGLES_ADJACENCY = TRIANGLES_ADJACENCY, 
+	TRIANGLE_STRIP_ADJACENCY = TRIANGLE_STRIP_ADJACENCY, 
+	PROGRAM_POINT_SIZE = PROGRAM_POINT_SIZE, 
+	MAX_GEOMETRY_TEXTURE_IMAGE_UNITS = MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, 
+	FRAMEBUFFER_ATTACHMENT_LAYERED = FRAMEBUFFER_ATTACHMENT_LAYERED, 
+	FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS = FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS, 
+	GEOMETRY_SHADER = GEOMETRY_SHADER, 
+	GEOMETRY_VERTICES_OUT = GEOMETRY_VERTICES_OUT, 
+	GEOMETRY_INPUT_TYPE = GEOMETRY_INPUT_TYPE, 
+	GEOMETRY_OUTPUT_TYPE = GEOMETRY_OUTPUT_TYPE, 
+	MAX_GEOMETRY_UNIFORM_COMPONENTS = MAX_GEOMETRY_UNIFORM_COMPONENTS, 
+	MAX_GEOMETRY_OUTPUT_VERTICES = MAX_GEOMETRY_OUTPUT_VERTICES, 
+	MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS = MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS, 
+	MAX_VERTEX_OUTPUT_COMPONENTS = MAX_VERTEX_OUTPUT_COMPONENTS, 
+	MAX_GEOMETRY_INPUT_COMPONENTS = MAX_GEOMETRY_INPUT_COMPONENTS, 
+	MAX_GEOMETRY_OUTPUT_COMPONENTS = MAX_GEOMETRY_OUTPUT_COMPONENTS, 
+	MAX_FRAGMENT_INPUT_COMPONENTS = MAX_FRAGMENT_INPUT_COMPONENTS, 
+	CONTEXT_PROFILE_MASK = CONTEXT_PROFILE_MASK, 
+	DEPTH_CLAMP = DEPTH_CLAMP, 
+	QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION, 
+	FIRST_VERTEX_CONVENTION = FIRST_VERTEX_CONVENTION, 
+	LAST_VERTEX_CONVENTION = LAST_VERTEX_CONVENTION, 
+	PROVOKING_VERTEX = PROVOKING_VERTEX, 
+	TEXTURE_CUBE_MAP_SEAMLESS = TEXTURE_CUBE_MAP_SEAMLESS, 
+	MAX_SERVER_WAIT_TIMEOUT = MAX_SERVER_WAIT_TIMEOUT, 
+	OBJECT_TYPE = OBJECT_TYPE, 
+	SYNC_CONDITION = SYNC_CONDITION, 
+	SYNC_STATUS = SYNC_STATUS, 
+	SYNC_FLAGS = SYNC_FLAGS, 
+	SYNC_FENCE = SYNC_FENCE, 
+	SYNC_GPU_COMMANDS_COMPLETE = SYNC_GPU_COMMANDS_COMPLETE, 
+	UNSIGNALED = UNSIGNALED, 
+	SIGNALED = SIGNALED, 
+	ALREADY_SIGNALED = ALREADY_SIGNALED, 
+	TIMEOUT_EXPIRED = TIMEOUT_EXPIRED, 
+	CONDITION_SATISFIED = CONDITION_SATISFIED, 
+	WAIT_FAILED = WAIT_FAILED, 
+	TIMEOUT_IGNORED = TIMEOUT_IGNORED, 
+	SYNC_FLUSH_COMMANDS_BIT = SYNC_FLUSH_COMMANDS_BIT, 
+	SAMPLE_POSITION = SAMPLE_POSITION, 
+	SAMPLE_MASK = SAMPLE_MASK, 
+	SAMPLE_MASK_VALUE = SAMPLE_MASK_VALUE, 
+	MAX_SAMPLE_MASK_WORDS = MAX_SAMPLE_MASK_WORDS, 
+	TEXTURE_2D_MULTISAMPLE = TEXTURE_2D_MULTISAMPLE, 
+	PROXY_TEXTURE_2D_MULTISAMPLE = PROXY_TEXTURE_2D_MULTISAMPLE, 
+	TEXTURE_2D_MULTISAMPLE_ARRAY = TEXTURE_2D_MULTISAMPLE_ARRAY, 
+	PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY, 
+	TEXTURE_BINDING_2D_MULTISAMPLE = TEXTURE_BINDING_2D_MULTISAMPLE, 
+	TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY, 
+	TEXTURE_SAMPLES = TEXTURE_SAMPLES, 
+	TEXTURE_FIXED_SAMPLE_LOCATIONS = TEXTURE_FIXED_SAMPLE_LOCATIONS, 
+	SAMPLER_2D_MULTISAMPLE = SAMPLER_2D_MULTISAMPLE, 
+	INT_SAMPLER_2D_MULTISAMPLE = INT_SAMPLER_2D_MULTISAMPLE, 
+	UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE, 
+	SAMPLER_2D_MULTISAMPLE_ARRAY = SAMPLER_2D_MULTISAMPLE_ARRAY, 
+	INT_SAMPLER_2D_MULTISAMPLE_ARRAY = INT_SAMPLER_2D_MULTISAMPLE_ARRAY, 
+	UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, 
+	MAX_COLOR_TEXTURE_SAMPLES = MAX_COLOR_TEXTURE_SAMPLES, 
+	MAX_DEPTH_TEXTURE_SAMPLES = MAX_DEPTH_TEXTURE_SAMPLES, 
+	MAX_INTEGER_SAMPLES = MAX_INTEGER_SAMPLES, 
+
+	VERTEX_ATTRIB_ARRAY_DIVISOR = VERTEX_ATTRIB_ARRAY_DIVISOR, 
+	SRC1_COLOR = SRC1_COLOR, 
+	ONE_MINUS_SRC1_COLOR = ONE_MINUS_SRC1_COLOR, 
+	ONE_MINUS_SRC1_ALPHA = ONE_MINUS_SRC1_ALPHA, 
+	MAX_DUAL_SOURCE_DRAW_BUFFERS = MAX_DUAL_SOURCE_DRAW_BUFFERS, 
+	ANY_SAMPLES_PASSED = ANY_SAMPLES_PASSED, 
+	SAMPLER_BINDING = SAMPLER_BINDING, 
+	RGB10_A2UI = RGB10_A2UI, 
+	TEXTURE_SWIZZLE_R = TEXTURE_SWIZZLE_R, 
+	TEXTURE_SWIZZLE_G = TEXTURE_SWIZZLE_G, 
+	TEXTURE_SWIZZLE_B = TEXTURE_SWIZZLE_B, 
+	TEXTURE_SWIZZLE_A = TEXTURE_SWIZZLE_A, 
+	TEXTURE_SWIZZLE_RGBA = TEXTURE_SWIZZLE_RGBA, 
+	TIME_ELAPSED = TIME_ELAPSED, 
+	TIMESTAMP = TIMESTAMP, 
+	INT_2_10_10_10_REV = INT_2_10_10_10_REV, 
+
+	SAMPLE_SHADING = SAMPLE_SHADING, 
+	MIN_SAMPLE_SHADING_VALUE = MIN_SAMPLE_SHADING_VALUE, 
+	MIN_PROGRAM_TEXTURE_GATHER_OFFSET = MIN_PROGRAM_TEXTURE_GATHER_OFFSET, 
+	MAX_PROGRAM_TEXTURE_GATHER_OFFSET = MAX_PROGRAM_TEXTURE_GATHER_OFFSET, 
+	TEXTURE_CUBE_MAP_ARRAY = TEXTURE_CUBE_MAP_ARRAY, 
+	TEXTURE_BINDING_CUBE_MAP_ARRAY = TEXTURE_BINDING_CUBE_MAP_ARRAY, 
+	PROXY_TEXTURE_CUBE_MAP_ARRAY = PROXY_TEXTURE_CUBE_MAP_ARRAY, 
+	SAMPLER_CUBE_MAP_ARRAY = SAMPLER_CUBE_MAP_ARRAY, 
+	SAMPLER_CUBE_MAP_ARRAY_SHADOW = SAMPLER_CUBE_MAP_ARRAY_SHADOW, 
+	INT_SAMPLER_CUBE_MAP_ARRAY = INT_SAMPLER_CUBE_MAP_ARRAY, 
+	UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY = UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY, 
+	DRAW_INDIRECT_BUFFER = DRAW_INDIRECT_BUFFER, 
+	DRAW_INDIRECT_BUFFER_BINDING = DRAW_INDIRECT_BUFFER_BINDING, 
+	GEOMETRY_SHADER_INVOCATIONS = GEOMETRY_SHADER_INVOCATIONS, 
+	MAX_GEOMETRY_SHADER_INVOCATIONS = MAX_GEOMETRY_SHADER_INVOCATIONS, 
+	MIN_FRAGMENT_INTERPOLATION_OFFSET = MIN_FRAGMENT_INTERPOLATION_OFFSET, 
+	MAX_FRAGMENT_INTERPOLATION_OFFSET = MAX_FRAGMENT_INTERPOLATION_OFFSET, 
+	FRAGMENT_INTERPOLATION_OFFSET_BITS = FRAGMENT_INTERPOLATION_OFFSET_BITS, 
+	MAX_VERTEX_STREAMS = MAX_VERTEX_STREAMS, 
+	DOUBLE_VEC2 = DOUBLE_VEC2, 
+	DOUBLE_VEC3 = DOUBLE_VEC3, 
+	DOUBLE_VEC4 = DOUBLE_VEC4, 
+	DOUBLE_MAT2 = DOUBLE_MAT2, 
+	DOUBLE_MAT3 = DOUBLE_MAT3, 
+	DOUBLE_MAT4 = DOUBLE_MAT4, 
+	DOUBLE_MAT2x3 = DOUBLE_MAT2x3, 
+	DOUBLE_MAT2x4 = DOUBLE_MAT2x4, 
+	DOUBLE_MAT3x2 = DOUBLE_MAT3x2, 
+	DOUBLE_MAT3x4 = DOUBLE_MAT3x4, 
+	DOUBLE_MAT4x2 = DOUBLE_MAT4x2, 
+	DOUBLE_MAT4x3 = DOUBLE_MAT4x3, 
+	ACTIVE_SUBROUTINES = ACTIVE_SUBROUTINES, 
+	ACTIVE_SUBROUTINE_UNIFORMS = ACTIVE_SUBROUTINE_UNIFORMS, 
+	ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS = ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS, 
+	ACTIVE_SUBROUTINE_MAX_LENGTH = ACTIVE_SUBROUTINE_MAX_LENGTH, 
+	ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH = ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH, 
+	MAX_SUBROUTINES = MAX_SUBROUTINES, 
+	MAX_SUBROUTINE_UNIFORM_LOCATIONS = MAX_SUBROUTINE_UNIFORM_LOCATIONS, 
+	NUM_COMPATIBLE_SUBROUTINES = NUM_COMPATIBLE_SUBROUTINES, 
+	COMPATIBLE_SUBROUTINES = COMPATIBLE_SUBROUTINES, 
+	PATCHES = PATCHES, 
+	PATCH_VERTICES = PATCH_VERTICES, 
+	PATCH_DEFAULT_INNER_LEVEL = PATCH_DEFAULT_INNER_LEVEL, 
+	PATCH_DEFAULT_OUTER_LEVEL = PATCH_DEFAULT_OUTER_LEVEL, 
+	TESS_CONTROL_OUTPUT_VERTICES = TESS_CONTROL_OUTPUT_VERTICES, 
+	TESS_GEN_MODE = TESS_GEN_MODE, 
+	TESS_GEN_SPACING = TESS_GEN_SPACING, 
+	TESS_GEN_VERTEX_ORDER = TESS_GEN_VERTEX_ORDER, 
+	TESS_GEN_POINT_MODE = TESS_GEN_POINT_MODE, 
+	ISOLINES = ISOLINES, 
+	FRACTIONAL_ODD = FRACTIONAL_ODD, 
+	FRACTIONAL_EVEN = FRACTIONAL_EVEN, 
+	MAX_PATCH_VERTICES = MAX_PATCH_VERTICES, 
+	MAX_TESS_GEN_LEVEL = MAX_TESS_GEN_LEVEL, 
+	MAX_TESS_CONTROL_UNIFORM_COMPONENTS = MAX_TESS_CONTROL_UNIFORM_COMPONENTS, 
+	MAX_TESS_EVALUATION_UNIFORM_COMPONENTS = MAX_TESS_EVALUATION_UNIFORM_COMPONENTS, 
+	MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS = MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS, 
+	MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS = MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS, 
+	MAX_TESS_CONTROL_OUTPUT_COMPONENTS = MAX_TESS_CONTROL_OUTPUT_COMPONENTS, 
+	MAX_TESS_PATCH_COMPONENTS = MAX_TESS_PATCH_COMPONENTS, 
+	MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS = MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS, 
+	MAX_TESS_EVALUATION_OUTPUT_COMPONENTS = MAX_TESS_EVALUATION_OUTPUT_COMPONENTS, 
+	MAX_TESS_CONTROL_UNIFORM_BLOCKS = MAX_TESS_CONTROL_UNIFORM_BLOCKS, 
+	MAX_TESS_EVALUATION_UNIFORM_BLOCKS = MAX_TESS_EVALUATION_UNIFORM_BLOCKS, 
+	MAX_TESS_CONTROL_INPUT_COMPONENTS = MAX_TESS_CONTROL_INPUT_COMPONENTS, 
+	MAX_TESS_EVALUATION_INPUT_COMPONENTS = MAX_TESS_EVALUATION_INPUT_COMPONENTS, 
+	MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS = MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS, 
+	MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS = MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS, 
+	UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER = UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER, 
+	UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER = UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER, 
+	TESS_EVALUATION_SHADER = TESS_EVALUATION_SHADER, 
+	TESS_CONTROL_SHADER = TESS_CONTROL_SHADER, 
+	TRANSFORM_FEEDBACK = TRANSFORM_FEEDBACK, 
+	TRANSFORM_FEEDBACK_BUFFER_PAUSED = TRANSFORM_FEEDBACK_BUFFER_PAUSED, 
+	TRANSFORM_FEEDBACK_BUFFER_ACTIVE = TRANSFORM_FEEDBACK_BUFFER_ACTIVE, 
+	TRANSFORM_FEEDBACK_BINDING = TRANSFORM_FEEDBACK_BINDING, 
+	MAX_TRANSFORM_FEEDBACK_BUFFERS = MAX_TRANSFORM_FEEDBACK_BUFFERS, 
+
+	FIXED = FIXED, 
+	IMPLEMENTATION_COLOR_READ_TYPE = IMPLEMENTATION_COLOR_READ_TYPE, 
+	IMPLEMENTATION_COLOR_READ_FORMAT = IMPLEMENTATION_COLOR_READ_FORMAT, 
+	LOW_FLOAT = LOW_FLOAT, 
+	MEDIUM_FLOAT = MEDIUM_FLOAT, 
+	HIGH_FLOAT = HIGH_FLOAT, 
+	LOW_INT = LOW_INT, 
+	MEDIUM_INT = MEDIUM_INT, 
+	HIGH_INT = HIGH_INT, 
+	SHADER_COMPILER = SHADER_COMPILER, 
+	SHADER_BINARY_FORMATS = SHADER_BINARY_FORMATS, 
+	NUM_SHADER_BINARY_FORMATS = NUM_SHADER_BINARY_FORMATS, 
+	MAX_VERTEX_UNIFORM_VECTORS = MAX_VERTEX_UNIFORM_VECTORS, 
+	MAX_VARYING_VECTORS = MAX_VARYING_VECTORS, 
+	MAX_FRAGMENT_UNIFORM_VECTORS = MAX_FRAGMENT_UNIFORM_VECTORS, 
+	RGB565 = RGB565, 
+	PROGRAM_BINARY_RETRIEVABLE_HINT = PROGRAM_BINARY_RETRIEVABLE_HINT, 
+	PROGRAM_BINARY_LENGTH = PROGRAM_BINARY_LENGTH, 
+	NUM_PROGRAM_BINARY_FORMATS = NUM_PROGRAM_BINARY_FORMATS, 
+	PROGRAM_BINARY_FORMATS = PROGRAM_BINARY_FORMATS, 
+	VERTEX_SHADER_BIT = VERTEX_SHADER_BIT, 
+	FRAGMENT_SHADER_BIT = FRAGMENT_SHADER_BIT, 
+	GEOMETRY_SHADER_BIT = GEOMETRY_SHADER_BIT, 
+	TESS_CONTROL_SHADER_BIT = TESS_CONTROL_SHADER_BIT, 
+	TESS_EVALUATION_SHADER_BIT = TESS_EVALUATION_SHADER_BIT, 
+	ALL_SHADER_BITS = ALL_SHADER_BITS, 
+	PROGRAM_SEPARABLE = PROGRAM_SEPARABLE, 
+	ACTIVE_PROGRAM = ACTIVE_PROGRAM, 
+	PROGRAM_PIPELINE_BINDING = PROGRAM_PIPELINE_BINDING, 
+	MAX_VIEWPORTS = MAX_VIEWPORTS, 
+	VIEWPORT_SUBPIXEL_BITS = VIEWPORT_SUBPIXEL_BITS, 
+	VIEWPORT_BOUNDS_RANGE = VIEWPORT_BOUNDS_RANGE, 
+	LAYER_PROVOKING_VERTEX = LAYER_PROVOKING_VERTEX, 
+	VIEWPORT_INDEX_PROVOKING_VERTEX = VIEWPORT_INDEX_PROVOKING_VERTEX, 
+	UNDEFINED_VERTEX = UNDEFINED_VERTEX, 
+
+	COPY_READ_BUFFER_BINDING = COPY_READ_BUFFER_BINDING, 
+	COPY_WRITE_BUFFER_BINDING = COPY_WRITE_BUFFER_BINDING, 
+	TRANSFORM_FEEDBACK_ACTIVE = TRANSFORM_FEEDBACK_ACTIVE, 
+	TRANSFORM_FEEDBACK_PAUSED = TRANSFORM_FEEDBACK_PAUSED, 
+	UNPACK_COMPRESSED_BLOCK_WIDTH = UNPACK_COMPRESSED_BLOCK_WIDTH, 
+	UNPACK_COMPRESSED_BLOCK_HEIGHT = UNPACK_COMPRESSED_BLOCK_HEIGHT, 
+	UNPACK_COMPRESSED_BLOCK_DEPTH = UNPACK_COMPRESSED_BLOCK_DEPTH, 
+	UNPACK_COMPRESSED_BLOCK_SIZE = UNPACK_COMPRESSED_BLOCK_SIZE, 
+	PACK_COMPRESSED_BLOCK_WIDTH = PACK_COMPRESSED_BLOCK_WIDTH, 
+	PACK_COMPRESSED_BLOCK_HEIGHT = PACK_COMPRESSED_BLOCK_HEIGHT, 
+	PACK_COMPRESSED_BLOCK_DEPTH = PACK_COMPRESSED_BLOCK_DEPTH, 
+	PACK_COMPRESSED_BLOCK_SIZE = PACK_COMPRESSED_BLOCK_SIZE, 
+	NUM_SAMPLE_COUNTS = NUM_SAMPLE_COUNTS, 
+	MIN_MAP_BUFFER_ALIGNMENT = MIN_MAP_BUFFER_ALIGNMENT, 
+	ATOMIC_COUNTER_BUFFER = ATOMIC_COUNTER_BUFFER, 
+	ATOMIC_COUNTER_BUFFER_BINDING = ATOMIC_COUNTER_BUFFER_BINDING, 
+	ATOMIC_COUNTER_BUFFER_START = ATOMIC_COUNTER_BUFFER_START, 
+	ATOMIC_COUNTER_BUFFER_SIZE = ATOMIC_COUNTER_BUFFER_SIZE, 
+	ATOMIC_COUNTER_BUFFER_DATA_SIZE = ATOMIC_COUNTER_BUFFER_DATA_SIZE, 
+	ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS = ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS, 
+	ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES = ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES, 
+	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER = ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER, 
+	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER = ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER, 
+	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER = ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER, 
+	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER = ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER, 
+	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER = ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER, 
+	MAX_VERTEX_ATOMIC_COUNTER_BUFFERS = MAX_VERTEX_ATOMIC_COUNTER_BUFFERS, 
+	MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS = MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS, 
+	MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS = MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS, 
+	MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS = MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS, 
+	MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS = MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, 
+	MAX_COMBINED_ATOMIC_COUNTER_BUFFERS = MAX_COMBINED_ATOMIC_COUNTER_BUFFERS, 
+	MAX_VERTEX_ATOMIC_COUNTERS = MAX_VERTEX_ATOMIC_COUNTERS, 
+	MAX_TESS_CONTROL_ATOMIC_COUNTERS = MAX_TESS_CONTROL_ATOMIC_COUNTERS, 
+	MAX_TESS_EVALUATION_ATOMIC_COUNTERS = MAX_TESS_EVALUATION_ATOMIC_COUNTERS, 
+	MAX_GEOMETRY_ATOMIC_COUNTERS = MAX_GEOMETRY_ATOMIC_COUNTERS, 
+	MAX_FRAGMENT_ATOMIC_COUNTERS = MAX_FRAGMENT_ATOMIC_COUNTERS, 
+	MAX_COMBINED_ATOMIC_COUNTERS = MAX_COMBINED_ATOMIC_COUNTERS, 
+	MAX_ATOMIC_COUNTER_BUFFER_SIZE = MAX_ATOMIC_COUNTER_BUFFER_SIZE, 
+	MAX_ATOMIC_COUNTER_BUFFER_BINDINGS = MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, 
+	ACTIVE_ATOMIC_COUNTER_BUFFERS = ACTIVE_ATOMIC_COUNTER_BUFFERS, 
+	UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX = UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX, 
+	UNSIGNED_INT_ATOMIC_COUNTER = UNSIGNED_INT_ATOMIC_COUNTER, 
+	VERTEX_ATTRIB_ARRAY_BARRIER_BIT = VERTEX_ATTRIB_ARRAY_BARRIER_BIT, 
+	ELEMENT_ARRAY_BARRIER_BIT = ELEMENT_ARRAY_BARRIER_BIT, 
+	UNIFORM_BARRIER_BIT = UNIFORM_BARRIER_BIT, 
+	TEXTURE_FETCH_BARRIER_BIT = TEXTURE_FETCH_BARRIER_BIT, 
+	SHADER_IMAGE_ACCESS_BARRIER_BIT = SHADER_IMAGE_ACCESS_BARRIER_BIT, 
+	COMMAND_BARRIER_BIT = COMMAND_BARRIER_BIT, 
+	PIXEL_BUFFER_BARRIER_BIT = PIXEL_BUFFER_BARRIER_BIT, 
+	TEXTURE_UPDATE_BARRIER_BIT = TEXTURE_UPDATE_BARRIER_BIT, 
+	BUFFER_UPDATE_BARRIER_BIT = BUFFER_UPDATE_BARRIER_BIT, 
+	FRAMEBUFFER_BARRIER_BIT = FRAMEBUFFER_BARRIER_BIT, 
+	TRANSFORM_FEEDBACK_BARRIER_BIT = TRANSFORM_FEEDBACK_BARRIER_BIT, 
+	ATOMIC_COUNTER_BARRIER_BIT = ATOMIC_COUNTER_BARRIER_BIT, 
+	ALL_BARRIER_BITS = ALL_BARRIER_BITS, 
+	MAX_IMAGE_UNITS = MAX_IMAGE_UNITS, 
+	MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS = MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS, 
+	IMAGE_BINDING_NAME = IMAGE_BINDING_NAME, 
+	IMAGE_BINDING_LEVEL = IMAGE_BINDING_LEVEL, 
+	IMAGE_BINDING_LAYERED = IMAGE_BINDING_LAYERED, 
+	IMAGE_BINDING_LAYER = IMAGE_BINDING_LAYER, 
+	IMAGE_BINDING_ACCESS = IMAGE_BINDING_ACCESS, 
+	IMAGE_1D = IMAGE_1D, 
+	IMAGE_2D = IMAGE_2D, 
+	IMAGE_3D = IMAGE_3D, 
+	IMAGE_2D_RECT = IMAGE_2D_RECT, 
+	IMAGE_CUBE = IMAGE_CUBE, 
+	IMAGE_BUFFER = IMAGE_BUFFER, 
+	IMAGE_1D_ARRAY = IMAGE_1D_ARRAY, 
+	IMAGE_2D_ARRAY = IMAGE_2D_ARRAY, 
+	IMAGE_CUBE_MAP_ARRAY = IMAGE_CUBE_MAP_ARRAY, 
+	IMAGE_2D_MULTISAMPLE = IMAGE_2D_MULTISAMPLE, 
+	IMAGE_2D_MULTISAMPLE_ARRAY = IMAGE_2D_MULTISAMPLE_ARRAY, 
+	INT_IMAGE_1D = INT_IMAGE_1D, 
+	INT_IMAGE_2D = INT_IMAGE_2D, 
+	INT_IMAGE_3D = INT_IMAGE_3D, 
+	INT_IMAGE_2D_RECT = INT_IMAGE_2D_RECT, 
+	INT_IMAGE_CUBE = INT_IMAGE_CUBE, 
+	INT_IMAGE_BUFFER = INT_IMAGE_BUFFER, 
+	INT_IMAGE_1D_ARRAY = INT_IMAGE_1D_ARRAY, 
+	INT_IMAGE_2D_ARRAY = INT_IMAGE_2D_ARRAY, 
+	INT_IMAGE_CUBE_MAP_ARRAY = INT_IMAGE_CUBE_MAP_ARRAY, 
+	INT_IMAGE_2D_MULTISAMPLE = INT_IMAGE_2D_MULTISAMPLE, 
+	INT_IMAGE_2D_MULTISAMPLE_ARRAY = INT_IMAGE_2D_MULTISAMPLE_ARRAY, 
+	UNSIGNED_INT_IMAGE_1D = UNSIGNED_INT_IMAGE_1D, 
+	UNSIGNED_INT_IMAGE_2D = UNSIGNED_INT_IMAGE_2D, 
+	UNSIGNED_INT_IMAGE_3D = UNSIGNED_INT_IMAGE_3D, 
+	UNSIGNED_INT_IMAGE_2D_RECT = UNSIGNED_INT_IMAGE_2D_RECT, 
+	UNSIGNED_INT_IMAGE_CUBE = UNSIGNED_INT_IMAGE_CUBE, 
+	UNSIGNED_INT_IMAGE_BUFFER = UNSIGNED_INT_IMAGE_BUFFER, 
+	UNSIGNED_INT_IMAGE_1D_ARRAY = UNSIGNED_INT_IMAGE_1D_ARRAY, 
+	UNSIGNED_INT_IMAGE_2D_ARRAY = UNSIGNED_INT_IMAGE_2D_ARRAY, 
+	UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY = UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY, 
+	UNSIGNED_INT_IMAGE_2D_MULTISAMPLE = UNSIGNED_INT_IMAGE_2D_MULTISAMPLE, 
+	UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY, 
+	MAX_IMAGE_SAMPLES = MAX_IMAGE_SAMPLES, 
+	IMAGE_BINDING_FORMAT = IMAGE_BINDING_FORMAT, 
+	IMAGE_FORMAT_COMPATIBILITY_TYPE = IMAGE_FORMAT_COMPATIBILITY_TYPE, 
+	IMAGE_FORMAT_COMPATIBILITY_BY_SIZE = IMAGE_FORMAT_COMPATIBILITY_BY_SIZE, 
+	IMAGE_FORMAT_COMPATIBILITY_BY_CLASS = IMAGE_FORMAT_COMPATIBILITY_BY_CLASS, 
+	MAX_VERTEX_IMAGE_UNIFORMS = MAX_VERTEX_IMAGE_UNIFORMS, 
+	MAX_TESS_CONTROL_IMAGE_UNIFORMS = MAX_TESS_CONTROL_IMAGE_UNIFORMS, 
+	MAX_TESS_EVALUATION_IMAGE_UNIFORMS = MAX_TESS_EVALUATION_IMAGE_UNIFORMS, 
+	MAX_GEOMETRY_IMAGE_UNIFORMS = MAX_GEOMETRY_IMAGE_UNIFORMS, 
+	MAX_FRAGMENT_IMAGE_UNIFORMS = MAX_FRAGMENT_IMAGE_UNIFORMS, 
+	MAX_COMBINED_IMAGE_UNIFORMS = MAX_COMBINED_IMAGE_UNIFORMS, 
+	COMPRESSED_RGBA_BPTC_UNORM = COMPRESSED_RGBA_BPTC_UNORM, 
+	COMPRESSED_SRGB_ALPHA_BPTC_UNORM = COMPRESSED_SRGB_ALPHA_BPTC_UNORM, 
+	COMPRESSED_RGB_BPTC_SIGNED_FLOAT = COMPRESSED_RGB_BPTC_SIGNED_FLOAT, 
+	COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT = COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT, 
+	TEXTURE_IMMUTABLE_FORMAT = TEXTURE_IMMUTABLE_FORMAT, 
+
+	NUM_SHADING_LANGUAGE_VERSIONS = NUM_SHADING_LANGUAGE_VERSIONS, 
+	VERTEX_ATTRIB_ARRAY_LONG = VERTEX_ATTRIB_ARRAY_LONG, 
+	COMPRESSED_RGB8_ETC2 = COMPRESSED_RGB8_ETC2, 
+	COMPRESSED_SRGB8_ETC2 = COMPRESSED_SRGB8_ETC2, 
+	COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 = COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 
+	COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 = COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 
+	COMPRESSED_RGBA8_ETC2_EAC = COMPRESSED_RGBA8_ETC2_EAC, 
+	COMPRESSED_SRGB8_ALPHA8_ETC2_EAC = COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 
+	COMPRESSED_R11_EAC = COMPRESSED_R11_EAC, 
+	COMPRESSED_SIGNED_R11_EAC = COMPRESSED_SIGNED_R11_EAC, 
+	COMPRESSED_RG11_EAC = COMPRESSED_RG11_EAC, 
+	COMPRESSED_SIGNED_RG11_EAC = COMPRESSED_SIGNED_RG11_EAC, 
+	PRIMITIVE_RESTART_FIXED_INDEX = PRIMITIVE_RESTART_FIXED_INDEX, 
+	ANY_SAMPLES_PASSED_CONSERVATIVE = ANY_SAMPLES_PASSED_CONSERVATIVE, 
+	MAX_ELEMENT_INDEX = MAX_ELEMENT_INDEX, 
+	COMPUTE_SHADER = COMPUTE_SHADER, 
+	MAX_COMPUTE_UNIFORM_BLOCKS = MAX_COMPUTE_UNIFORM_BLOCKS, 
+	MAX_COMPUTE_TEXTURE_IMAGE_UNITS = MAX_COMPUTE_TEXTURE_IMAGE_UNITS, 
+	MAX_COMPUTE_IMAGE_UNIFORMS = MAX_COMPUTE_IMAGE_UNIFORMS, 
+	MAX_COMPUTE_SHARED_MEMORY_SIZE = MAX_COMPUTE_SHARED_MEMORY_SIZE, 
+	MAX_COMPUTE_UNIFORM_COMPONENTS = MAX_COMPUTE_UNIFORM_COMPONENTS, 
+	MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS = MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS, 
+	MAX_COMPUTE_ATOMIC_COUNTERS = MAX_COMPUTE_ATOMIC_COUNTERS, 
+	MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS = MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS, 
+	MAX_COMPUTE_WORK_GROUP_INVOCATIONS = MAX_COMPUTE_WORK_GROUP_INVOCATIONS, 
+	MAX_COMPUTE_WORK_GROUP_COUNT = MAX_COMPUTE_WORK_GROUP_COUNT, 
+	MAX_COMPUTE_WORK_GROUP_SIZE = MAX_COMPUTE_WORK_GROUP_SIZE, 
+	COMPUTE_WORK_GROUP_SIZE = COMPUTE_WORK_GROUP_SIZE, 
+	UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER = UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER, 
+	ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER = ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER, 
+	DISPATCH_INDIRECT_BUFFER = DISPATCH_INDIRECT_BUFFER, 
+	DISPATCH_INDIRECT_BUFFER_BINDING = DISPATCH_INDIRECT_BUFFER_BINDING, 
+	COMPUTE_SHADER_BIT = COMPUTE_SHADER_BIT, 
+	DEBUG_OUTPUT_SYNCHRONOUS = DEBUG_OUTPUT_SYNCHRONOUS, 
+	DEBUG_NEXT_LOGGED_MESSAGE_LENGTH = DEBUG_NEXT_LOGGED_MESSAGE_LENGTH, 
+	DEBUG_CALLBACK_FUNCTION = DEBUG_CALLBACK_FUNCTION, 
+	DEBUG_CALLBACK_USER_PARAM = DEBUG_CALLBACK_USER_PARAM, 
+	DEBUG_SOURCE_API = DEBUG_SOURCE_API, 
+	DEBUG_SOURCE_WINDOW_SYSTEM = DEBUG_SOURCE_WINDOW_SYSTEM, 
+	DEBUG_SOURCE_SHADER_COMPILER = DEBUG_SOURCE_SHADER_COMPILER, 
+	DEBUG_SOURCE_THIRD_PARTY = DEBUG_SOURCE_THIRD_PARTY, 
+	DEBUG_SOURCE_APPLICATION = DEBUG_SOURCE_APPLICATION, 
+	DEBUG_SOURCE_OTHER = DEBUG_SOURCE_OTHER, 
+	DEBUG_TYPE_ERROR = DEBUG_TYPE_ERROR, 
+	DEBUG_TYPE_DEPRECATED_BEHAVIOR = DEBUG_TYPE_DEPRECATED_BEHAVIOR, 
+	DEBUG_TYPE_UNDEFINED_BEHAVIOR = DEBUG_TYPE_UNDEFINED_BEHAVIOR, 
+	DEBUG_TYPE_PORTABILITY = DEBUG_TYPE_PORTABILITY, 
+	DEBUG_TYPE_PERFORMANCE = DEBUG_TYPE_PERFORMANCE, 
+	DEBUG_TYPE_OTHER = DEBUG_TYPE_OTHER, 
+	MAX_DEBUG_MESSAGE_LENGTH = MAX_DEBUG_MESSAGE_LENGTH, 
+	MAX_DEBUG_LOGGED_MESSAGES = MAX_DEBUG_LOGGED_MESSAGES, 
+	DEBUG_LOGGED_MESSAGES = DEBUG_LOGGED_MESSAGES, 
+	DEBUG_SEVERITY_HIGH = DEBUG_SEVERITY_HIGH, 
+	DEBUG_SEVERITY_MEDIUM = DEBUG_SEVERITY_MEDIUM, 
+	DEBUG_SEVERITY_LOW = DEBUG_SEVERITY_LOW, 
+	DEBUG_TYPE_MARKER = DEBUG_TYPE_MARKER, 
+	DEBUG_TYPE_PUSH_GROUP = DEBUG_TYPE_PUSH_GROUP, 
+	DEBUG_TYPE_POP_GROUP = DEBUG_TYPE_POP_GROUP, 
+	DEBUG_SEVERITY_NOTIFICATION = DEBUG_SEVERITY_NOTIFICATION, 
+	MAX_DEBUG_GROUP_STACK_DEPTH = MAX_DEBUG_GROUP_STACK_DEPTH, 
+	DEBUG_GROUP_STACK_DEPTH = DEBUG_GROUP_STACK_DEPTH, 
+	BUFFER = BUFFER, 
+	SHADER = SHADER, 
+	PROGRAM = PROGRAM, 
+	QUERY = QUERY, 
+	PROGRAM_PIPELINE = PROGRAM_PIPELINE, 
+	SAMPLER = SAMPLER, 
+	MAX_LABEL_LENGTH = MAX_LABEL_LENGTH, 
+	DEBUG_OUTPUT = DEBUG_OUTPUT, 
+	CONTEXT_FLAG_DEBUG_BIT = CONTEXT_FLAG_DEBUG_BIT, 
+	MAX_UNIFORM_LOCATIONS = MAX_UNIFORM_LOCATIONS, 
+	FRAMEBUFFER_DEFAULT_WIDTH = FRAMEBUFFER_DEFAULT_WIDTH, 
+	FRAMEBUFFER_DEFAULT_HEIGHT = FRAMEBUFFER_DEFAULT_HEIGHT, 
+	FRAMEBUFFER_DEFAULT_LAYERS = FRAMEBUFFER_DEFAULT_LAYERS, 
+	FRAMEBUFFER_DEFAULT_SAMPLES = FRAMEBUFFER_DEFAULT_SAMPLES, 
+	FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS = FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS, 
+	MAX_FRAMEBUFFER_WIDTH = MAX_FRAMEBUFFER_WIDTH, 
+	MAX_FRAMEBUFFER_HEIGHT = MAX_FRAMEBUFFER_HEIGHT, 
+	MAX_FRAMEBUFFER_LAYERS = MAX_FRAMEBUFFER_LAYERS, 
+	MAX_FRAMEBUFFER_SAMPLES = MAX_FRAMEBUFFER_SAMPLES, 
+	INTERNALFORMAT_SUPPORTED = INTERNALFORMAT_SUPPORTED, 
+	INTERNALFORMAT_PREFERRED = INTERNALFORMAT_PREFERRED, 
+	INTERNALFORMAT_RED_SIZE = INTERNALFORMAT_RED_SIZE, 
+	INTERNALFORMAT_GREEN_SIZE = INTERNALFORMAT_GREEN_SIZE, 
+	INTERNALFORMAT_BLUE_SIZE = INTERNALFORMAT_BLUE_SIZE, 
+	INTERNALFORMAT_ALPHA_SIZE = INTERNALFORMAT_ALPHA_SIZE, 
+	INTERNALFORMAT_DEPTH_SIZE = INTERNALFORMAT_DEPTH_SIZE, 
+	INTERNALFORMAT_STENCIL_SIZE = INTERNALFORMAT_STENCIL_SIZE, 
+	INTERNALFORMAT_SHARED_SIZE = INTERNALFORMAT_SHARED_SIZE, 
+	INTERNALFORMAT_RED_TYPE = INTERNALFORMAT_RED_TYPE, 
+	INTERNALFORMAT_GREEN_TYPE = INTERNALFORMAT_GREEN_TYPE, 
+	INTERNALFORMAT_BLUE_TYPE = INTERNALFORMAT_BLUE_TYPE, 
+	INTERNALFORMAT_ALPHA_TYPE = INTERNALFORMAT_ALPHA_TYPE, 
+	INTERNALFORMAT_DEPTH_TYPE = INTERNALFORMAT_DEPTH_TYPE, 
+	INTERNALFORMAT_STENCIL_TYPE = INTERNALFORMAT_STENCIL_TYPE, 
+	MAX_WIDTH = MAX_WIDTH, 
+	MAX_HEIGHT = MAX_HEIGHT, 
+	MAX_DEPTH = MAX_DEPTH, 
+	MAX_LAYERS = MAX_LAYERS, 
+	MAX_COMBINED_DIMENSIONS = MAX_COMBINED_DIMENSIONS, 
+	COLOR_COMPONENTS = COLOR_COMPONENTS, 
+	DEPTH_COMPONENTS = DEPTH_COMPONENTS, 
+	STENCIL_COMPONENTS = STENCIL_COMPONENTS, 
+	COLOR_RENDERABLE = COLOR_RENDERABLE, 
+	DEPTH_RENDERABLE = DEPTH_RENDERABLE, 
+	STENCIL_RENDERABLE = STENCIL_RENDERABLE, 
+	FRAMEBUFFER_RENDERABLE = FRAMEBUFFER_RENDERABLE, 
+	FRAMEBUFFER_RENDERABLE_LAYERED = FRAMEBUFFER_RENDERABLE_LAYERED, 
+	FRAMEBUFFER_BLEND = FRAMEBUFFER_BLEND, 
+	READ_PIXELS = READ_PIXELS, 
+	READ_PIXELS_FORMAT = READ_PIXELS_FORMAT, 
+	READ_PIXELS_TYPE = READ_PIXELS_TYPE, 
+	TEXTURE_IMAGE_FORMAT = TEXTURE_IMAGE_FORMAT, 
+	TEXTURE_IMAGE_TYPE = TEXTURE_IMAGE_TYPE, 
+	GET_TEXTURE_IMAGE_FORMAT = GET_TEXTURE_IMAGE_FORMAT, 
+	GET_TEXTURE_IMAGE_TYPE = GET_TEXTURE_IMAGE_TYPE, 
+	MIPMAP = MIPMAP, 
+	MANUAL_GENERATE_MIPMAP = MANUAL_GENERATE_MIPMAP, 
+	AUTO_GENERATE_MIPMAP = AUTO_GENERATE_MIPMAP, 
+	COLOR_ENCODING = COLOR_ENCODING, 
+	SRGB_READ = SRGB_READ, 
+	SRGB_WRITE = SRGB_WRITE, 
+	FILTER = FILTER, 
+	VERTEX_TEXTURE = VERTEX_TEXTURE, 
+	TESS_CONTROL_TEXTURE = TESS_CONTROL_TEXTURE, 
+	TESS_EVALUATION_TEXTURE = TESS_EVALUATION_TEXTURE, 
+	GEOMETRY_TEXTURE = GEOMETRY_TEXTURE, 
+	FRAGMENT_TEXTURE = FRAGMENT_TEXTURE, 
+	COMPUTE_TEXTURE = COMPUTE_TEXTURE, 
+	TEXTURE_SHADOW = TEXTURE_SHADOW, 
+	TEXTURE_GATHER = TEXTURE_GATHER, 
+	TEXTURE_GATHER_SHADOW = TEXTURE_GATHER_SHADOW, 
+	SHADER_IMAGE_LOAD = SHADER_IMAGE_LOAD, 
+	SHADER_IMAGE_STORE = SHADER_IMAGE_STORE, 
+	SHADER_IMAGE_ATOMIC = SHADER_IMAGE_ATOMIC, 
+	IMAGE_TEXEL_SIZE = IMAGE_TEXEL_SIZE, 
+	IMAGE_COMPATIBILITY_CLASS = IMAGE_COMPATIBILITY_CLASS, 
+	IMAGE_PIXEL_FORMAT = IMAGE_PIXEL_FORMAT, 
+	IMAGE_PIXEL_TYPE = IMAGE_PIXEL_TYPE, 
+	SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST = SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST, 
+	SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST = SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST, 
+	SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE = SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE, 
+	SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE = SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE, 
+	TEXTURE_COMPRESSED_BLOCK_WIDTH = TEXTURE_COMPRESSED_BLOCK_WIDTH, 
+	TEXTURE_COMPRESSED_BLOCK_HEIGHT = TEXTURE_COMPRESSED_BLOCK_HEIGHT, 
+	TEXTURE_COMPRESSED_BLOCK_SIZE = TEXTURE_COMPRESSED_BLOCK_SIZE, 
+	CLEAR_BUFFER = CLEAR_BUFFER, 
+	TEXTURE_VIEW = TEXTURE_VIEW, 
+	VIEW_COMPATIBILITY_CLASS = VIEW_COMPATIBILITY_CLASS, 
+	FULL_SUPPORT = FULL_SUPPORT, 
+	CAVEAT_SUPPORT = CAVEAT_SUPPORT, 
+	IMAGE_CLASS_4_X_32 = IMAGE_CLASS_4_X_32, 
+	IMAGE_CLASS_2_X_32 = IMAGE_CLASS_2_X_32, 
+	IMAGE_CLASS_1_X_32 = IMAGE_CLASS_1_X_32, 
+	IMAGE_CLASS_4_X_16 = IMAGE_CLASS_4_X_16, 
+	IMAGE_CLASS_2_X_16 = IMAGE_CLASS_2_X_16, 
+	IMAGE_CLASS_1_X_16 = IMAGE_CLASS_1_X_16, 
+	IMAGE_CLASS_4_X_8 = IMAGE_CLASS_4_X_8, 
+	IMAGE_CLASS_2_X_8 = IMAGE_CLASS_2_X_8, 
+	IMAGE_CLASS_1_X_8 = IMAGE_CLASS_1_X_8, 
+	IMAGE_CLASS_11_11_10 = IMAGE_CLASS_11_11_10, 
+	IMAGE_CLASS_10_10_10_2 = IMAGE_CLASS_10_10_10_2, 
+	VIEW_CLASS_128_BITS = VIEW_CLASS_128_BITS, 
+	VIEW_CLASS_96_BITS = VIEW_CLASS_96_BITS, 
+	VIEW_CLASS_64_BITS = VIEW_CLASS_64_BITS, 
+	VIEW_CLASS_48_BITS = VIEW_CLASS_48_BITS, 
+	VIEW_CLASS_32_BITS = VIEW_CLASS_32_BITS, 
+	VIEW_CLASS_24_BITS = VIEW_CLASS_24_BITS, 
+	VIEW_CLASS_16_BITS = VIEW_CLASS_16_BITS, 
+	VIEW_CLASS_8_BITS = VIEW_CLASS_8_BITS, 
+	VIEW_CLASS_S3TC_DXT1_RGB = VIEW_CLASS_S3TC_DXT1_RGB, 
+	VIEW_CLASS_S3TC_DXT1_RGBA = VIEW_CLASS_S3TC_DXT1_RGBA, 
+	VIEW_CLASS_S3TC_DXT3_RGBA = VIEW_CLASS_S3TC_DXT3_RGBA, 
+	VIEW_CLASS_S3TC_DXT5_RGBA = VIEW_CLASS_S3TC_DXT5_RGBA, 
+	VIEW_CLASS_RGTC1_RED = VIEW_CLASS_RGTC1_RED, 
+	VIEW_CLASS_RGTC2_RG = VIEW_CLASS_RGTC2_RG, 
+	VIEW_CLASS_BPTC_UNORM = VIEW_CLASS_BPTC_UNORM, 
+	VIEW_CLASS_BPTC_FLOAT = VIEW_CLASS_BPTC_FLOAT, 
+	UNIFORM = UNIFORM, 
+	UNIFORM_BLOCK = UNIFORM_BLOCK, 
+	PROGRAM_INPUT = PROGRAM_INPUT, 
+	PROGRAM_OUTPUT = PROGRAM_OUTPUT, 
+	BUFFER_VARIABLE = BUFFER_VARIABLE, 
+	SHADER_STORAGE_BLOCK = SHADER_STORAGE_BLOCK, 
+	VERTEX_SUBROUTINE = VERTEX_SUBROUTINE, 
+	TESS_CONTROL_SUBROUTINE = TESS_CONTROL_SUBROUTINE, 
+	TESS_EVALUATION_SUBROUTINE = TESS_EVALUATION_SUBROUTINE, 
+	GEOMETRY_SUBROUTINE = GEOMETRY_SUBROUTINE, 
+	FRAGMENT_SUBROUTINE = FRAGMENT_SUBROUTINE, 
+	COMPUTE_SUBROUTINE = COMPUTE_SUBROUTINE, 
+	VERTEX_SUBROUTINE_UNIFORM = VERTEX_SUBROUTINE_UNIFORM, 
+	TESS_CONTROL_SUBROUTINE_UNIFORM = TESS_CONTROL_SUBROUTINE_UNIFORM, 
+	TESS_EVALUATION_SUBROUTINE_UNIFORM = TESS_EVALUATION_SUBROUTINE_UNIFORM, 
+	GEOMETRY_SUBROUTINE_UNIFORM = GEOMETRY_SUBROUTINE_UNIFORM, 
+	FRAGMENT_SUBROUTINE_UNIFORM = FRAGMENT_SUBROUTINE_UNIFORM, 
+	COMPUTE_SUBROUTINE_UNIFORM = COMPUTE_SUBROUTINE_UNIFORM, 
+	TRANSFORM_FEEDBACK_VARYING = TRANSFORM_FEEDBACK_VARYING, 
+	ACTIVE_RESOURCES = ACTIVE_RESOURCES, 
+	MAX_NAME_LENGTH = MAX_NAME_LENGTH, 
+	MAX_NUM_ACTIVE_VARIABLES = MAX_NUM_ACTIVE_VARIABLES, 
+	MAX_NUM_COMPATIBLE_SUBROUTINES = MAX_NUM_COMPATIBLE_SUBROUTINES, 
+	NAME_LENGTH = NAME_LENGTH, 
+	TYPE = TYPE, 
+	ARRAY_SIZE = ARRAY_SIZE, 
+	OFFSET = OFFSET, 
+	BLOCK_INDEX = BLOCK_INDEX, 
+	ARRAY_STRIDE = ARRAY_STRIDE, 
+	MATRIX_STRIDE = MATRIX_STRIDE, 
+	IS_ROW_MAJOR = IS_ROW_MAJOR, 
+	ATOMIC_COUNTER_BUFFER_INDEX = ATOMIC_COUNTER_BUFFER_INDEX, 
+	BUFFER_BINDING = BUFFER_BINDING, 
+	BUFFER_DATA_SIZE = BUFFER_DATA_SIZE, 
+	NUM_ACTIVE_VARIABLES = NUM_ACTIVE_VARIABLES, 
+	ACTIVE_VARIABLES = ACTIVE_VARIABLES, 
+	REFERENCED_BY_VERTEX_SHADER = REFERENCED_BY_VERTEX_SHADER, 
+	REFERENCED_BY_TESS_CONTROL_SHADER = REFERENCED_BY_TESS_CONTROL_SHADER, 
+	REFERENCED_BY_TESS_EVALUATION_SHADER = REFERENCED_BY_TESS_EVALUATION_SHADER, 
+	REFERENCED_BY_GEOMETRY_SHADER = REFERENCED_BY_GEOMETRY_SHADER, 
+	REFERENCED_BY_FRAGMENT_SHADER = REFERENCED_BY_FRAGMENT_SHADER, 
+	REFERENCED_BY_COMPUTE_SHADER = REFERENCED_BY_COMPUTE_SHADER, 
+	TOP_LEVEL_ARRAY_SIZE = TOP_LEVEL_ARRAY_SIZE, 
+	TOP_LEVEL_ARRAY_STRIDE = TOP_LEVEL_ARRAY_STRIDE, 
+	LOCATION = LOCATION, 
+	LOCATION_INDEX = LOCATION_INDEX, 
+	IS_PER_PATCH = IS_PER_PATCH, 
+	SHADER_STORAGE_BUFFER = SHADER_STORAGE_BUFFER, 
+	SHADER_STORAGE_BUFFER_BINDING = SHADER_STORAGE_BUFFER_BINDING, 
+	SHADER_STORAGE_BUFFER_START = SHADER_STORAGE_BUFFER_START, 
+	SHADER_STORAGE_BUFFER_SIZE = SHADER_STORAGE_BUFFER_SIZE, 
+	MAX_VERTEX_SHADER_STORAGE_BLOCKS = MAX_VERTEX_SHADER_STORAGE_BLOCKS, 
+	MAX_GEOMETRY_SHADER_STORAGE_BLOCKS = MAX_GEOMETRY_SHADER_STORAGE_BLOCKS, 
+	MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS = MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS, 
+	MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS = MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS, 
+	MAX_FRAGMENT_SHADER_STORAGE_BLOCKS = MAX_FRAGMENT_SHADER_STORAGE_BLOCKS, 
+	MAX_COMPUTE_SHADER_STORAGE_BLOCKS = MAX_COMPUTE_SHADER_STORAGE_BLOCKS, 
+	MAX_COMBINED_SHADER_STORAGE_BLOCKS = MAX_COMBINED_SHADER_STORAGE_BLOCKS, 
+	MAX_SHADER_STORAGE_BUFFER_BINDINGS = MAX_SHADER_STORAGE_BUFFER_BINDINGS, 
+	MAX_SHADER_STORAGE_BLOCK_SIZE = MAX_SHADER_STORAGE_BLOCK_SIZE, 
+	SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT = SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT, 
+	SHADER_STORAGE_BARRIER_BIT = SHADER_STORAGE_BARRIER_BIT, 
+	MAX_COMBINED_SHADER_OUTPUT_RESOURCES = MAX_COMBINED_SHADER_OUTPUT_RESOURCES, 
+	DEPTH_STENCIL_TEXTURE_MODE = DEPTH_STENCIL_TEXTURE_MODE, 
+	TEXTURE_BUFFER_OFFSET = TEXTURE_BUFFER_OFFSET, 
+	TEXTURE_BUFFER_SIZE = TEXTURE_BUFFER_SIZE, 
+	TEXTURE_BUFFER_OFFSET_ALIGNMENT = TEXTURE_BUFFER_OFFSET_ALIGNMENT, 
+	TEXTURE_VIEW_MIN_LEVEL = TEXTURE_VIEW_MIN_LEVEL, 
+	TEXTURE_VIEW_NUM_LEVELS = TEXTURE_VIEW_NUM_LEVELS, 
+	TEXTURE_VIEW_MIN_LAYER = TEXTURE_VIEW_MIN_LAYER, 
+	TEXTURE_VIEW_NUM_LAYERS = TEXTURE_VIEW_NUM_LAYERS, 
+	TEXTURE_IMMUTABLE_LEVELS = TEXTURE_IMMUTABLE_LEVELS, 
+	VERTEX_ATTRIB_BINDING = VERTEX_ATTRIB_BINDING, 
+	VERTEX_ATTRIB_RELATIVE_OFFSET = VERTEX_ATTRIB_RELATIVE_OFFSET, 
+	VERTEX_BINDING_DIVISOR = VERTEX_BINDING_DIVISOR, 
+	VERTEX_BINDING_OFFSET = VERTEX_BINDING_OFFSET, 
+	VERTEX_BINDING_STRIDE = VERTEX_BINDING_STRIDE, 
+	MAX_VERTEX_ATTRIB_RELATIVE_OFFSET = MAX_VERTEX_ATTRIB_RELATIVE_OFFSET, 
+	MAX_VERTEX_ATTRIB_BINDINGS = MAX_VERTEX_ATTRIB_BINDINGS, 
+	VERTEX_BINDING_BUFFER = VERTEX_BINDING_BUFFER, 
+
+	MAX_VERTEX_ATTRIB_STRIDE = MAX_VERTEX_ATTRIB_STRIDE, 
+	PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED = PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED, 
+	TEXTURE_BUFFER_BINDING = TEXTURE_BUFFER_BINDING, 
+	MAP_PERSISTENT_BIT = MAP_PERSISTENT_BIT, 
+	MAP_COHERENT_BIT = MAP_COHERENT_BIT, 
+	DYNAMIC_STORAGE_BIT = DYNAMIC_STORAGE_BIT, 
+	CLIENT_STORAGE_BIT = CLIENT_STORAGE_BIT, 
+	CLIENT_MAPPED_BUFFER_BARRIER_BIT = CLIENT_MAPPED_BUFFER_BARRIER_BIT, 
+	BUFFER_IMMUTABLE_STORAGE = BUFFER_IMMUTABLE_STORAGE, 
+	BUFFER_STORAGE_FLAGS = BUFFER_STORAGE_FLAGS, 
+	CLEAR_TEXTURE = CLEAR_TEXTURE, 
+	LOCATION_COMPONENT = LOCATION_COMPONENT, 
+	TRANSFORM_FEEDBACK_BUFFER_INDEX = TRANSFORM_FEEDBACK_BUFFER_INDEX, 
+	TRANSFORM_FEEDBACK_BUFFER_STRIDE = TRANSFORM_FEEDBACK_BUFFER_STRIDE, 
+	QUERY_BUFFER = QUERY_BUFFER, 
+	QUERY_BUFFER_BARRIER_BIT = QUERY_BUFFER_BARRIER_BIT, 
+	QUERY_BUFFER_BINDING = QUERY_BUFFER_BINDING, 
+	QUERY_RESULT_NO_WAIT = QUERY_RESULT_NO_WAIT, 
+	MIRROR_CLAMP_TO_EDGE = MIRROR_CLAMP_TO_EDGE, 
+
+	CONTEXT_LOST = CONTEXT_LOST, 
+	NEGATIVE_ONE_TO_ONE = NEGATIVE_ONE_TO_ONE, 
+	ZERO_TO_ONE = ZERO_TO_ONE, 
+	CLIP_ORIGIN = CLIP_ORIGIN, 
+	CLIP_DEPTH_MODE = CLIP_DEPTH_MODE, 
+	QUERY_WAIT_INVERTED = QUERY_WAIT_INVERTED, 
+	QUERY_NO_WAIT_INVERTED = QUERY_NO_WAIT_INVERTED, 
+	QUERY_BY_REGION_WAIT_INVERTED = QUERY_BY_REGION_WAIT_INVERTED, 
+	QUERY_BY_REGION_NO_WAIT_INVERTED = QUERY_BY_REGION_NO_WAIT_INVERTED, 
+	MAX_CULL_DISTANCES = MAX_CULL_DISTANCES, 
+	MAX_COMBINED_CLIP_AND_CULL_DISTANCES = MAX_COMBINED_CLIP_AND_CULL_DISTANCES, 
+	TEXTURE_TARGET = TEXTURE_TARGET, 
+	QUERY_TARGET = QUERY_TARGET, 
+	GUILTY_CONTEXT_RESET = GUILTY_CONTEXT_RESET, 
+	INNOCENT_CONTEXT_RESET = INNOCENT_CONTEXT_RESET, 
+	UNKNOWN_CONTEXT_RESET = UNKNOWN_CONTEXT_RESET, 
+	RESET_NOTIFICATION_STRATEGY = RESET_NOTIFICATION_STRATEGY, 
+	LOSE_CONTEXT_ON_RESET = LOSE_CONTEXT_ON_RESET, 
+	NO_RESET_NOTIFICATION = NO_RESET_NOTIFICATION, 
+	CONTEXT_FLAG_ROBUST_ACCESS_BIT = CONTEXT_FLAG_ROBUST_ACCESS_BIT, 
+	CONTEXT_RELEASE_BEHAVIOR = CONTEXT_RELEASE_BEHAVIOR, 
+	CONTEXT_RELEASE_BEHAVIOR_FLUSH = CONTEXT_RELEASE_BEHAVIOR_FLUSH, 
+
+	DEBUG_OUTPUT_SYNCHRONOUS_ARB = DEBUG_OUTPUT_SYNCHRONOUS_ARB, 
+	DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB = DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB, 
+	DEBUG_CALLBACK_FUNCTION_ARB = DEBUG_CALLBACK_FUNCTION_ARB, 
+	DEBUG_CALLBACK_USER_PARAM_ARB = DEBUG_CALLBACK_USER_PARAM_ARB, 
+	DEBUG_SOURCE_API_ARB = DEBUG_SOURCE_API_ARB, 
+	DEBUG_SOURCE_WINDOW_SYSTEM_ARB = DEBUG_SOURCE_WINDOW_SYSTEM_ARB, 
+	DEBUG_SOURCE_SHADER_COMPILER_ARB = DEBUG_SOURCE_SHADER_COMPILER_ARB, 
+	DEBUG_SOURCE_THIRD_PARTY_ARB = DEBUG_SOURCE_THIRD_PARTY_ARB, 
+	DEBUG_SOURCE_APPLICATION_ARB = DEBUG_SOURCE_APPLICATION_ARB, 
+	DEBUG_SOURCE_OTHER_ARB = DEBUG_SOURCE_OTHER_ARB, 
+	DEBUG_TYPE_ERROR_ARB = DEBUG_TYPE_ERROR_ARB, 
+	DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB = DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB, 
+	DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB = DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB, 
+	DEBUG_TYPE_PORTABILITY_ARB = DEBUG_TYPE_PORTABILITY_ARB, 
+	DEBUG_TYPE_PERFORMANCE_ARB = DEBUG_TYPE_PERFORMANCE_ARB, 
+	DEBUG_TYPE_OTHER_ARB = DEBUG_TYPE_OTHER_ARB, 
+	MAX_DEBUG_MESSAGE_LENGTH_ARB = MAX_DEBUG_MESSAGE_LENGTH_ARB, 
+	MAX_DEBUG_LOGGED_MESSAGES_ARB = MAX_DEBUG_LOGGED_MESSAGES_ARB, 
+	DEBUG_LOGGED_MESSAGES_ARB = DEBUG_LOGGED_MESSAGES_ARB, 
+	DEBUG_SEVERITY_HIGH_ARB = DEBUG_SEVERITY_HIGH_ARB, 
+	DEBUG_SEVERITY_MEDIUM_ARB = DEBUG_SEVERITY_MEDIUM_ARB, 
+	DEBUG_SEVERITY_LOW_ARB = DEBUG_SEVERITY_LOW_ARB, 
+
+	SHADER_BINARY_FORMAT_SPIR_V = SHADER_BINARY_FORMAT_SPIR_V, 
+	SPIR_V_BINARY = SPIR_V_BINARY, 
+	PARAMETER_BUFFER = PARAMETER_BUFFER, 
+	PARAMETER_BUFFER_BINDING = PARAMETER_BUFFER_BINDING, 
+	CONTEXT_FLAG_NO_ERROR_BIT = CONTEXT_FLAG_NO_ERROR_BIT, 
+	VERTICES_SUBMITTED = VERTICES_SUBMITTED, 
+	PRIMITIVES_SUBMITTED = PRIMITIVES_SUBMITTED, 
+	VERTEX_SHADER_INVOCATIONS = VERTEX_SHADER_INVOCATIONS, 
+	TESS_CONTROL_SHADER_PATCHES = TESS_CONTROL_SHADER_PATCHES, 
+	TESS_EVALUATION_SHADER_INVOCATIONS = TESS_EVALUATION_SHADER_INVOCATIONS, 
+	GEOMETRY_SHADER_PRIMITIVES_EMITTED = GEOMETRY_SHADER_PRIMITIVES_EMITTED, 
+	FRAGMENT_SHADER_INVOCATIONS = FRAGMENT_SHADER_INVOCATIONS, 
+	COMPUTE_SHADER_INVOCATIONS = COMPUTE_SHADER_INVOCATIONS, 
+	CLIPPING_INPUT_PRIMITIVES = CLIPPING_INPUT_PRIMITIVES, 
+	CLIPPING_OUTPUT_PRIMITIVES = CLIPPING_OUTPUT_PRIMITIVES, 
+	POLYGON_OFFSET_CLAMP = POLYGON_OFFSET_CLAMP, 
+	SPIR_V_EXTENSIONS = SPIR_V_EXTENSIONS, 
+	NUM_SPIR_V_EXTENSIONS = NUM_SPIR_V_EXTENSIONS, 
+	TEXTURE_MAX_ANISOTROPY = TEXTURE_MAX_ANISOTROPY, 
+	MAX_TEXTURE_MAX_ANISOTROPY = MAX_TEXTURE_MAX_ANISOTROPY, 
+	TRANSFORM_FEEDBACK_OVERFLOW = TRANSFORM_FEEDBACK_OVERFLOW, 
+	TRANSFORM_FEEDBACK_STREAM_OVERFLOW = TRANSFORM_FEEDBACK_STREAM_OVERFLOW, 
+
+	// Extensions
+	DEVICE_LUID_EXT = DEVICE_LUID_EXT,
+}

+ 409 - 0
vendor/OpenGL/helpers.odin

@@ -0,0 +1,409 @@
+package odin_gl
+
+// Helper for loading shaders into a program
+
+import "core:os"
+import "core:fmt"
+import "core:strings"
+
+Shader_Type :: enum i32 {
+	NONE = 0x0000,
+	FRAGMENT_SHADER        = 0x8B30,
+	VERTEX_SHADER          = 0x8B31,
+	GEOMETRY_SHADER        = 0x8DD9,
+	COMPUTE_SHADER         = 0x91B9,
+	TESS_EVALUATION_SHADER = 0x8E87,
+	TESS_CONTROL_SHADER    = 0x8E88,
+	SHADER_LINK            = -1, // @Note: Not an OpenGL constant, but used for error checking.
+}
+
+
+@(private, thread_local)
+last_compile_error_message: []byte;
+@(private, thread_local)
+last_link_error_message: []byte;
+
+@(private, thread_local)
+last_compile_error_type: Shader_Type;
+@(private, thread_local)
+last_link_error_type: Shader_Type;
+
+get_last_error_messages :: proc() -> (compile_message: string, compile_type: Shader_Type, link_message: string, link_type: Shader_Type) {
+	compile_message = string(last_compile_error_message[:max(0, len(last_compile_error_message)-1)]);
+	compile_type = last_compile_error_type;
+	link_message = string(last_link_error_message[:max(0, len(last_link_error_message)-1)]);
+	link_type = last_link_error_type;
+	return;
+}
+
+get_last_error_message :: proc() -> (compile_message: string, compile_type: Shader_Type) {
+	compile_message = string(last_compile_error_message[:max(0, len(last_compile_error_message)-1)]);
+	compile_type = last_compile_error_type;
+	return;
+}
+
+// Shader checking and linking checking are identical
+// except for calling differently named GL functions
+// it's a bit ugly looking, but meh
+when ODIN_DEBUG {
+	import "core:runtime"
+	
+	@private
+	check_error :: proc(
+		id: u32, type: Shader_Type, status: u32,
+		iv_func: proc "c" (u32, u32, [^]i32, runtime.Source_Code_Location),
+		log_func: proc "c" (u32, i32, ^i32, [^]u8, runtime.Source_Code_Location), 
+		loc := #caller_location,
+	) -> (success: bool) {
+		result, info_log_length: i32;
+		iv_func(id, status, &result, loc);
+		iv_func(id, INFO_LOG_LENGTH, &info_log_length, loc);
+
+		if result == 0 {
+			if log_func == GetShaderInfoLog {
+				delete(last_compile_error_message);
+				last_compile_error_message = make([]byte, info_log_length);
+				last_compile_error_type = type;
+
+				log_func(id, i32(info_log_length), nil, raw_data(last_compile_error_message), loc);
+				//fmt.printf_err("Error in %v:\n%s", type, string(last_compile_error_message[0:len(last_compile_error_message)-1]));
+			} else {
+
+				delete(last_link_error_message);
+				last_link_error_message = make([]byte, info_log_length);
+				last_compile_error_type = type;
+
+				log_func(id, i32(info_log_length), nil, raw_data(last_link_error_message), loc);
+				//fmt.printf_err("Error in %v:\n%s", type, string(last_link_error_message[0:len(last_link_error_message)-1]));
+			}
+
+			return false;
+		}
+
+		return true;
+	}
+} else {
+	@private
+	check_error :: proc(
+		id: u32, type: Shader_Type, status: u32,
+		iv_func: proc "c" (u32, u32, [^]i32),
+		log_func: proc "c" (u32, i32, ^i32, [^]u8),
+	) -> (success: bool) {
+		result, info_log_length: i32;
+		iv_func(id, status, &result);
+		iv_func(id, INFO_LOG_LENGTH, &info_log_length);
+
+		if result == 0 {
+			if log_func == GetShaderInfoLog {
+				delete(last_compile_error_message);
+				last_compile_error_message = make([]u8, info_log_length);
+				last_link_error_type = type;
+
+				log_func(id, i32(info_log_length), nil, raw_data(last_compile_error_message));
+				fmt.eprintf("Error in %v:\n%s", type, string(last_compile_error_message[0:len(last_compile_error_message)-1]));
+			} else {
+				delete(last_link_error_message);
+				last_link_error_message = make([]u8, info_log_length);
+				last_link_error_type = type;
+
+				log_func(id, i32(info_log_length), nil, raw_data(last_link_error_message));
+				fmt.eprintf("Error in %v:\n%s", type, string(last_link_error_message[0:len(last_link_error_message)-1]));
+
+			}
+
+			return false;
+		}
+
+		return true;
+	}
+}
+
+// Compiling shaders are identical for any shader (vertex, geometry, fragment, tesselation, (maybe compute too))
+@private
+compile_shader_from_source :: proc(shader_data: string, shader_type: Shader_Type) -> (shader_id: u32, ok: bool) {
+	shader_id = CreateShader(cast(u32)shader_type);
+	length := i32(len(shader_data));
+	shader_data_copy := cstring(raw_data(shader_data));
+	ShaderSource(shader_id, 1, &shader_data_copy, &length);
+	CompileShader(shader_id);
+
+	check_error(shader_id, shader_type, COMPILE_STATUS, GetShaderiv, GetShaderInfoLog) or_return;
+	return;
+}
+
+// only used once, but I'd just make a subprocedure(?) for consistency
+@private
+create_and_link_program :: proc(shader_ids: []u32, binary_retrievable := false) -> (program_id: u32, ok: bool) {
+	program_id = CreateProgram();
+	for id in shader_ids {
+		AttachShader(program_id, id);
+	}
+	if binary_retrievable {
+		ProgramParameteri(program_id, PROGRAM_BINARY_RETRIEVABLE_HINT, 1/*true*/);
+	}
+	LinkProgram(program_id);
+
+	check_error(program_id, Shader_Type.SHADER_LINK, LINK_STATUS, GetProgramiv, GetProgramInfoLog) or_return;
+	ok = true;
+	return;
+}
+
+load_compute_file :: proc(filename: string, binary_retrievable := false) -> (program_id: u32, ok: bool) {
+	cs_data := os.read_entire_file(filename) or_return;
+	defer delete(cs_data);
+
+	// Create the shaders
+	compute_shader_id := compile_shader_from_source(string(cs_data), Shader_Type(COMPUTE_SHADER)) or_return;
+	return create_and_link_program([]u32{compute_shader_id}, binary_retrievable);
+}
+
+load_compute_source :: proc(cs_data: string, binary_retrievable := false) -> (program_id: u32, ok: bool) {
+	// Create the shaders
+	compute_shader_id := compile_shader_from_source(cs_data, Shader_Type(COMPUTE_SHADER)) or_return;
+	return create_and_link_program([]u32{compute_shader_id}, binary_retrievable);
+}
+
+load_shaders_file :: proc(vs_filename, fs_filename: string, binary_retrievable := false) -> (program_id: u32, ok: bool) {
+	vs_data := os.read_entire_file(vs_filename) or_return;
+	defer delete(vs_data);
+	
+	fs_data := os.read_entire_file(fs_filename) or_return;
+	defer delete(fs_data);
+
+	return load_shaders_source(string(vs_data), string(fs_data), binary_retrievable);
+}
+
+load_shaders_source :: proc(vs_source, fs_source: string, binary_retrievable := false) -> (program_id: u32, ok: bool) {
+	// actual function from here
+	vertex_shader_id := compile_shader_from_source(vs_source, Shader_Type.VERTEX_SHADER) or_return;
+	defer DeleteShader(vertex_shader_id);
+
+	fragment_shader_id := compile_shader_from_source(fs_source, Shader_Type.FRAGMENT_SHADER) or_return;
+	defer DeleteShader(fragment_shader_id);
+
+	return create_and_link_program([]u32{vertex_shader_id, fragment_shader_id}, binary_retrievable);
+}
+
+load_shaders :: proc{load_shaders_file};
+
+
+when ODIN_OS == "windows" {
+	update_shader_if_changed :: proc(
+		vertex_name, fragment_name: string, 
+		program: u32, 
+		last_vertex_time, last_fragment_time: os.File_Time,
+	) -> (
+		old_program: u32, 
+		current_vertex_time, current_fragment_time: os.File_Time, 
+		updated: bool,
+	) {
+		current_vertex_time, _ = os.last_write_time_by_name(vertex_name);
+		current_fragment_time, _ = os.last_write_time_by_name(fragment_name);
+		old_program = program;
+
+		if current_vertex_time != last_vertex_time || current_fragment_time != last_fragment_time {
+			new_program, success := load_shaders(vertex_name, fragment_name);
+			if success {
+				DeleteProgram(old_program);
+				old_program = new_program;
+				fmt.println("Updated shaders");
+				updated = true;
+			} else {
+				fmt.println("Failed to update shaders");
+			}
+		}
+
+		return old_program, current_vertex_time, current_fragment_time, updated;
+	}
+
+	update_shader_if_changed_compute :: proc(
+		compute_name: string, 
+		program: u32, 
+		last_compute_time: os.File_Time,
+	) -> (
+		old_program: u32, 
+		current_compute_time: os.File_Time, 
+		updated: bool,
+	) {
+		current_compute_time, _ = os.last_write_time_by_name(compute_name);
+		old_program = program;
+
+		if current_compute_time != last_compute_time {
+			new_program, success := load_compute_file(compute_name);
+			if success {
+				DeleteProgram(old_program);
+				old_program = new_program;
+				fmt.println("Updated shaders");
+				updated = true;
+			} else {
+				fmt.println("Failed to update shaders");
+			}
+		}
+
+		return old_program, current_compute_time, updated;
+	}
+}
+
+
+Uniform_Type :: enum i32 {
+	FLOAT      = 0x1406,
+	FLOAT_VEC2 = 0x8B50,
+	FLOAT_VEC3 = 0x8B51,
+	FLOAT_VEC4 = 0x8B52,
+
+	DOUBLE      = 0x140A,
+	DOUBLE_VEC2 = 0x8FFC,
+	DOUBLE_VEC3 = 0x8FFD,
+	DOUBLE_VEC4 = 0x8FFE,
+
+	INT      = 0x1404,
+	INT_VEC2 = 0x8B53,
+	INT_VEC3 = 0x8B54,
+	INT_VEC4 = 0x8B55,
+
+	UNSIGNED_INT      = 0x1405,
+	UNSIGNED_INT_VEC2 = 0x8DC6,
+	UNSIGNED_INT_VEC3 = 0x8DC7,
+	UNSIGNED_INT_VEC4 = 0x8DC8,
+
+	BOOL      = 0x8B56,
+	BOOL_VEC2 = 0x8B57,
+	BOOL_VEC3 = 0x8B58,
+	BOOL_VEC4 = 0x8B59,
+
+	FLOAT_MAT2   = 0x8B5A,
+	FLOAT_MAT3   = 0x8B5B,
+	FLOAT_MAT4   = 0x8B5C,
+	FLOAT_MAT2x3 = 0x8B65,
+	FLOAT_MAT2x4 = 0x8B66,
+	FLOAT_MAT3x2 = 0x8B67,
+	FLOAT_MAT3x4 = 0x8B68,
+	FLOAT_MAT4x2 = 0x8B69,
+	FLOAT_MAT4x3 = 0x8B6A,
+
+	DOUBLE_MAT2   = 0x8F46,
+	DOUBLE_MAT3   = 0x8F47,
+	DOUBLE_MAT4   = 0x8F48,
+	DOUBLE_MAT2x3 = 0x8F49,
+	DOUBLE_MAT2x4 = 0x8F4A,
+	DOUBLE_MAT3x2 = 0x8F4B,
+	DOUBLE_MAT3x4 = 0x8F4C,
+	DOUBLE_MAT4x2 = 0x8F4D,
+	DOUBLE_MAT4x3 = 0x8F4E,
+
+	SAMPLER_1D                   = 0x8B5D,
+	SAMPLER_2D                   = 0x8B5E,
+	SAMPLER_3D                   = 0x8B5F,
+	SAMPLER_CUBE                 = 0x8B60,
+	SAMPLER_1D_SHADOW            = 0x8B61,
+	SAMPLER_2D_SHADOW            = 0x8B62,
+	SAMPLER_1D_ARRAY             = 0x8DC0,
+	SAMPLER_2D_ARRAY             = 0x8DC1,
+	SAMPLER_1D_ARRAY_SHADOW      = 0x8DC3,
+	SAMPLER_2D_ARRAY_SHADOW      = 0x8DC4,
+	SAMPLER_2D_MULTISAMPLE       = 0x9108,
+	SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B,
+	SAMPLER_CUBE_SHADOW          = 0x8DC5,
+	SAMPLER_BUFFER               = 0x8DC2,
+	SAMPLER_2D_RECT              = 0x8B63,
+	SAMPLER_2D_RECT_SHADOW       = 0x8B64,
+
+	INT_SAMPLER_1D                   = 0x8DC9,
+	INT_SAMPLER_2D                   = 0x8DCA,
+	INT_SAMPLER_3D                   = 0x8DCB,
+	INT_SAMPLER_CUBE                 = 0x8DCC,
+	INT_SAMPLER_1D_ARRAY             = 0x8DCE,
+	INT_SAMPLER_2D_ARRAY             = 0x8DCF,
+	INT_SAMPLER_2D_MULTISAMPLE       = 0x9109,
+	INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C,
+	INT_SAMPLER_BUFFER               = 0x8DD0,
+	INT_SAMPLER_2D_RECT              = 0x8DCD,
+
+	UNSIGNED_INT_SAMPLER_1D                   = 0x8DD1,
+	UNSIGNED_INT_SAMPLER_2D                   = 0x8DD2,
+	UNSIGNED_INT_SAMPLER_3D                   = 0x8DD3,
+	UNSIGNED_INT_SAMPLER_CUBE                 = 0x8DD4,
+	UNSIGNED_INT_SAMPLER_1D_ARRAY             = 0x8DD6,
+	UNSIGNED_INT_SAMPLER_2D_ARRAY             = 0x8DD7,
+	UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE       = 0x910A,
+	UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D,
+	UNSIGNED_INT_SAMPLER_BUFFER               = 0x8DD8,
+	UNSIGNED_INT_SAMPLER_2D_RECT              = 0x8DD5,
+
+	IMAGE_1D                   = 0x904C,
+	IMAGE_2D                   = 0x904D,
+	IMAGE_3D                   = 0x904E,
+	IMAGE_2D_RECT              = 0x904F,
+	IMAGE_CUBE                 = 0x9050,
+	IMAGE_BUFFER               = 0x9051,
+	IMAGE_1D_ARRAY             = 0x9052,
+	IMAGE_2D_ARRAY             = 0x9053,
+	IMAGE_CUBE_MAP_ARRAY       = 0x9054,
+	IMAGE_2D_MULTISAMPLE       = 0x9055,
+	IMAGE_2D_MULTISAMPLE_ARRAY = 0x9056,
+
+	INT_IMAGE_1D                   = 0x9057,
+	INT_IMAGE_2D                   = 0x9058,
+	INT_IMAGE_3D                   = 0x9059,
+	INT_IMAGE_2D_RECT              = 0x905A,
+	INT_IMAGE_CUBE                 = 0x905B,
+	INT_IMAGE_BUFFER               = 0x905C,
+	INT_IMAGE_1D_ARRAY             = 0x905D,
+	INT_IMAGE_2D_ARRAY             = 0x905E,
+	INT_IMAGE_CUBE_MAP_ARRAY       = 0x905F,
+	INT_IMAGE_2D_MULTISAMPLE       = 0x9060,
+	INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x9061,
+
+	UNSIGNED_INT_IMAGE_1D                   = 0x9062,
+	UNSIGNED_INT_IMAGE_2D                   = 0x9063,
+	UNSIGNED_INT_IMAGE_3D                   = 0x9064,
+	UNSIGNED_INT_IMAGE_2D_RECT              = 0x9065,
+	UNSIGNED_INT_IMAGE_CUBE                 = 0x9066,
+	UNSIGNED_INT_IMAGE_BUFFER               = 0x9067,
+	UNSIGNED_INT_IMAGE_1D_ARRAY             = 0x9068,
+	UNSIGNED_INT_IMAGE_2D_ARRAY             = 0x9069,
+	UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY       = 0x906A,
+	UNSIGNED_INT_IMAGE_2D_MULTISAMPLE       = 0x906B,
+	UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY = 0x906C,
+
+	UNSIGNED_INT_ATOMIC_COUNTER = 0x92DB,
+}
+
+Uniform_Info :: struct {
+	location: i32,
+	size:     i32,
+	kind:     Uniform_Type,
+	name:     string, // NOTE: This will need to be freed
+}
+
+Uniforms :: map[string]Uniform_Info;
+
+destroy_uniforms :: proc(u: Uniforms) {
+	for _, v in u {
+		delete(v.name);
+	}
+	delete(u);
+}
+
+get_uniforms_from_program :: proc(program: u32) -> (uniforms: Uniforms) {
+	uniform_count: i32;
+	GetProgramiv(program, ACTIVE_UNIFORMS, &uniform_count);
+
+	if uniform_count > 0 {
+		reserve(&uniforms, int(uniform_count));
+	}
+
+	for i in 0..<uniform_count {
+		uniform_info: Uniform_Info;
+
+		length: i32;
+		cname: [256]u8;
+		GetActiveUniform(program, u32(i), 256, &length, &uniform_info.size, cast(^u32)&uniform_info.kind, &cname[0]);
+
+		uniform_info.location = GetUniformLocation(program, cstring(&cname[0]));
+		uniform_info.name = strings.clone(string(cname[:length])); // @NOTE: These need to be freed
+		uniforms[uniform_info.name] = uniform_info;
+	}
+
+	return uniforms;
+}

+ 1590 - 0
vendor/OpenGL/impl.odin

@@ -0,0 +1,1590 @@
+package odin_gl
+
+loaded_up_to: [2]int;
+loaded_up_to_major := 0;
+loaded_up_to_minor := 0;
+
+Set_Proc_Address_Type :: #type proc(p: rawptr, name: cstring);
+
+load_up_to :: proc(major, minor : int, set_proc_address: Set_Proc_Address_Type) {
+	loaded_up_to = {0, 0};
+	loaded_up_to[0] = major;
+	loaded_up_to[1] = minor;
+	loaded_up_to_major = major;
+	loaded_up_to_minor = minor;
+
+	switch major*10+minor {
+	case 46: load_4_6(set_proc_address); fallthrough;
+	case 45: load_4_5(set_proc_address); fallthrough;
+	case 44: load_4_4(set_proc_address); fallthrough;
+	case 43: load_4_3(set_proc_address); fallthrough;
+	case 42: load_4_2(set_proc_address); fallthrough;
+	case 41: load_4_1(set_proc_address); fallthrough;
+	case 40: load_4_0(set_proc_address); fallthrough;
+	case 33: load_3_3(set_proc_address); fallthrough;
+	case 32: load_3_2(set_proc_address); fallthrough;
+	case 31: load_3_1(set_proc_address); fallthrough;
+	case 30: load_3_0(set_proc_address); fallthrough;
+	case 21: load_2_1(set_proc_address); fallthrough;
+	case 20: load_2_0(set_proc_address); fallthrough;
+	case 15: load_1_5(set_proc_address); fallthrough;
+	case 14: load_1_4(set_proc_address); fallthrough;
+	case 13: load_1_3(set_proc_address); fallthrough;
+	case 12: load_1_2(set_proc_address); fallthrough;
+	case 11: load_1_1(set_proc_address); fallthrough;
+	case 10: load_1_0(set_proc_address);
+	}
+}
+
+/*
+Type conversion overview:
+	typedef unsigned int GLenum;     -> u32
+	typedef unsigned char GLboolean; -> bool
+	typedef unsigned int GLbitfield; -> u32
+	typedef signed char GLbyte;      -> i8
+	typedef short GLshort;           -> i16
+	typedef int GLint;               -> i32
+	typedef unsigned char GLubyte;   -> u8
+	typedef unsigned short GLushort; -> u16
+	typedef unsigned int GLuint;     -> u32
+	typedef int GLsizei;             -> i32
+	typedef float GLfloat;           -> f32
+	typedef double GLdouble;         -> f64
+	typedef char GLchar;             -> u8
+	typedef ptrdiff_t GLintptr;      -> int
+	typedef ptrdiff_t GLsizeiptr;    -> int
+	typedef int64_t GLint64;         -> i64
+	typedef uint64_t GLuint64;       -> u64
+
+	void*                            -> rawptr
+*/
+
+sync_t :: rawptr;
+debug_proc_t :: #type proc "c" (source: u32, type: u32, id: u32, severity: u32, length: i32, message: cstring, userParam: rawptr);
+
+
+// VERSION_1_0
+impl_CullFace:               proc "c" (mode: u32);
+impl_FrontFace:              proc "c" (mode: u32);
+impl_Hint:                   proc "c" (target: u32, mode: u32);
+impl_LineWidth:              proc "c" (width: f32);
+impl_PointSize:              proc "c" (size: f32);
+impl_PolygonMode:            proc "c" (face: u32, mode: u32);
+impl_Scissor:                proc "c" (x: i32, y: i32, width: i32, height: i32);
+impl_TexParameterf:          proc "c" (target: u32, pname: u32, param: f32);
+impl_TexParameterfv:         proc "c" (target: u32, pname: u32, params: [^]f32);
+impl_TexParameteri:          proc "c" (target: u32, pname: u32, param: i32);
+impl_TexParameteriv:         proc "c" (target: u32, pname: u32, params: [^]i32);
+impl_TexImage1D:             proc "c" (target: u32, level: i32, internalformat: i32, width: i32, border: i32, format: u32, type: u32, pixels: rawptr);
+impl_TexImage2D:             proc "c" (target: u32, level: i32, internalformat: i32, width: i32, height: i32, border: i32, format: u32, type: u32, pixels: rawptr);
+impl_DrawBuffer:             proc "c" (buf: u32);
+impl_Clear:                  proc "c" (mask: u32);
+impl_ClearColor:             proc "c" (red: f32, green: f32, blue: f32, alpha: f32);
+impl_ClearStencil:           proc "c" (s: i32);
+impl_ClearDepth:             proc "c" (depth: f64);
+impl_StencilMask:            proc "c" (mask: u32);
+impl_ColorMask:              proc "c" (red: u8, green: u8, blue: u8, alpha: u8);
+impl_DepthMask:              proc "c" (flag: u8);
+impl_Disable:                proc "c" (cap: u32);
+impl_Enable:                 proc "c" (cap: u32);
+impl_Finish:                 proc "c" ();
+impl_Flush:                  proc "c" ();
+impl_BlendFunc:              proc "c" (sfactor: u32, dfactor: u32);
+impl_LogicOp:                proc "c" (opcode: u32);
+impl_StencilFunc:            proc "c" (func: u32, ref: i32, mask: u32);
+impl_StencilOp:              proc "c" (fail: u32, zfail: u32, zpass: u32);
+impl_DepthFunc:              proc "c" (func: u32);
+impl_PixelStoref:            proc "c" (pname: u32, param: f32);
+impl_PixelStorei:            proc "c" (pname: u32, param: i32);
+impl_ReadBuffer:             proc "c" (src: u32);
+impl_ReadPixels:             proc "c" (x: i32, y: i32, width: i32, height: i32, format: u32, type: u32, pixels: rawptr);
+impl_GetBooleanv:            proc "c" (pname: u32, data: ^bool);
+impl_GetDoublev:             proc "c" (pname: u32, data: ^f64);
+impl_GetError:               proc "c" () -> u32;
+impl_GetFloatv:              proc "c" (pname: u32, data: ^f32);
+impl_GetIntegerv:            proc "c" (pname: u32, data: ^i32);
+impl_GetString:              proc "c" (name: u32) -> cstring;
+impl_GetTexImage:            proc "c" (target: u32,  level: i32, format: u32, type: u32, pixels: rawptr);
+impl_GetTexParameterfv:      proc "c" (target: u32, pname: u32, params: [^]f32);
+impl_GetTexParameteriv:      proc "c" (target: u32, pname: u32, params: [^]i32);
+impl_GetTexLevelParameterfv: proc "c" (target: u32, level: i32, pname: u32, params: [^]f32);
+impl_GetTexLevelParameteriv: proc "c" (target: u32, level: i32, pname: u32, params: [^]i32);
+impl_IsEnabled:              proc "c" (cap: u32) -> bool;
+impl_DepthRange:             proc "c" (near: f64, far: f64);
+impl_Viewport:               proc "c" (x: i32, y: i32, width: i32, height: i32);
+
+load_1_0 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_CullFace,               "glCullFace");
+	set_proc_address(&impl_FrontFace,              "glFrontFace");
+	set_proc_address(&impl_Hint,                   "glHint");
+	set_proc_address(&impl_LineWidth,              "glLineWidth");
+	set_proc_address(&impl_PointSize,              "glPointSize");
+	set_proc_address(&impl_PolygonMode,            "glPolygonMode");
+	set_proc_address(&impl_Scissor,                "glScissor");
+	set_proc_address(&impl_TexParameterf,          "glTexParameterf");
+	set_proc_address(&impl_TexParameterfv,         "glTexParameterfv");
+	set_proc_address(&impl_TexParameteri,          "glTexParameteri");
+	set_proc_address(&impl_TexParameteriv,         "glTexParameteriv");
+	set_proc_address(&impl_TexImage1D,             "glTexImage1D");
+	set_proc_address(&impl_TexImage2D,             "glTexImage2D");
+	set_proc_address(&impl_DrawBuffer,             "glDrawBuffer");
+	set_proc_address(&impl_Clear,                  "glClear");
+	set_proc_address(&impl_ClearColor,             "glClearColor");
+	set_proc_address(&impl_ClearStencil,           "glClearStencil");
+	set_proc_address(&impl_ClearDepth,             "glClearDepth");
+	set_proc_address(&impl_StencilMask,            "glStencilMask");
+	set_proc_address(&impl_ColorMask,              "glColorMask");
+	set_proc_address(&impl_DepthMask,              "glDepthMask");
+	set_proc_address(&impl_Disable,                "glDisable");
+	set_proc_address(&impl_Enable,                 "glEnable");
+	set_proc_address(&impl_Finish,                 "glFinish");
+	set_proc_address(&impl_Flush,                  "glFlush");
+	set_proc_address(&impl_BlendFunc,              "glBlendFunc");
+	set_proc_address(&impl_LogicOp,                "glLogicOp");
+	set_proc_address(&impl_StencilFunc,            "glStencilFunc");
+	set_proc_address(&impl_StencilOp,              "glStencilOp");
+	set_proc_address(&impl_DepthFunc,              "glDepthFunc");
+	set_proc_address(&impl_PixelStoref,            "glPixelStoref");
+	set_proc_address(&impl_PixelStorei,            "glPixelStorei");
+	set_proc_address(&impl_ReadBuffer,             "glReadBuffer");
+	set_proc_address(&impl_ReadPixels,             "glReadPixels");
+	set_proc_address(&impl_GetBooleanv,            "glGetBooleanv");
+	set_proc_address(&impl_GetDoublev,             "glGetDoublev");
+	set_proc_address(&impl_GetError,               "glGetError");
+	set_proc_address(&impl_GetFloatv,              "glGetFloatv");
+	set_proc_address(&impl_GetIntegerv,            "glGetIntegerv");
+	set_proc_address(&impl_GetString,              "glGetString");
+	set_proc_address(&impl_GetTexImage,            "glGetTexImage");
+	set_proc_address(&impl_GetTexParameterfv,      "glGetTexParameterfv");
+	set_proc_address(&impl_GetTexParameteriv,      "glGetTexParameteriv");
+	set_proc_address(&impl_GetTexLevelParameterfv, "glGetTexLevelParameterfv");
+	set_proc_address(&impl_GetTexLevelParameteriv, "glGetTexLevelParameteriv");
+	set_proc_address(&impl_IsEnabled,              "glIsEnabled");
+	set_proc_address(&impl_DepthRange,             "glDepthRange");
+	set_proc_address(&impl_Viewport,               "glViewport");
+}
+
+
+// VERSION_1_1
+impl_DrawArrays:        proc "c" (mode: u32, first: i32, count: i32);
+impl_DrawElements:      proc "c" (mode: u32, count: i32, type: u32, indices: rawptr);
+impl_PolygonOffset:     proc "c" (factor: f32, units: f32);
+impl_CopyTexImage1D:    proc "c" (target: u32, level: i32, internalformat: u32, x: i32, y: i32, width: i32, border: i32);
+impl_CopyTexImage2D:    proc "c" (target: u32, level: i32, internalformat: u32, x: i32, y: i32, width: i32, height: i32, border: i32);
+impl_CopyTexSubImage1D: proc "c" (target: u32, level: i32, xoffset: i32, x: i32, y: i32, width: i32);
+impl_CopyTexSubImage2D: proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, x: i32, y: i32, width: i32, height: i32);
+impl_TexSubImage1D:     proc "c" (target: u32, level: i32, xoffset: i32, width: i32, format: u32, type: u32, pixels: rawptr);
+impl_TexSubImage2D:     proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, type: u32, pixels: rawptr);
+impl_BindTexture:       proc "c" (target: u32, texture: u32);
+impl_DeleteTextures:    proc "c" (n: i32, textures: [^]u32);
+impl_GenTextures:       proc "c" (n: i32, textures: [^]u32);
+impl_IsTexture:         proc "c" (texture: u32) -> bool;
+
+load_1_1 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_DrawArrays,        "glDrawArrays");
+	set_proc_address(&impl_DrawElements,      "glDrawElements");
+	set_proc_address(&impl_PolygonOffset,     "glPolygonOffset");
+	set_proc_address(&impl_CopyTexImage1D,    "glCopyTexImage1D");
+	set_proc_address(&impl_CopyTexImage2D,    "glCopyTexImage2D");
+	set_proc_address(&impl_CopyTexSubImage1D, "glCopyTexSubImage1D");
+	set_proc_address(&impl_CopyTexSubImage2D, "glCopyTexSubImage2D");
+	set_proc_address(&impl_TexSubImage1D,     "glTexSubImage1D");
+	set_proc_address(&impl_TexSubImage2D,     "glTexSubImage2D");
+	set_proc_address(&impl_BindTexture,       "glBindTexture");
+	set_proc_address(&impl_DeleteTextures,    "glDeleteTextures");
+	set_proc_address(&impl_GenTextures,       "glGenTextures");
+	set_proc_address(&impl_IsTexture,         "glIsTexture");
+}
+
+
+// VERSION_1_2
+impl_DrawRangeElements: proc "c" (mode: u32, start: u32, end: u32, count: i32, type: u32, indices: rawptr);
+impl_TexImage3D:        proc "c" (target: u32, level: i32, internalformat: i32, width: i32, height: i32, depth: i32, border: i32, format: u32, type: u32, pixels: rawptr);
+impl_TexSubImage3D:     proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, pixels: rawptr);
+impl_CopyTexSubImage3D: proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, x: i32, y: i32, width: i32, height: i32);
+
+load_1_2 :: proc(set_proc_address: Set_Proc_Address_Type) {
+
+	set_proc_address(&impl_DrawRangeElements, "glDrawRangeElements");
+	set_proc_address(&impl_TexImage3D,        "glTexImage3D");
+	set_proc_address(&impl_TexSubImage3D,     "glTexSubImage3D");
+	set_proc_address(&impl_CopyTexSubImage3D, "glCopyTexSubImage3D");
+}
+
+
+// VERSION_1_3
+impl_ActiveTexture:           proc "c" (texture: u32);
+impl_SampleCoverage:          proc "c" (value: f32, invert: u8);
+impl_CompressedTexImage3D:    proc "c" (target: u32, level: i32, internalformat: u32, width: i32, height: i32, depth: i32, border: i32, imageSize: i32, data: rawptr);
+impl_CompressedTexImage2D:    proc "c" (target: u32, level: i32, internalformat: u32, width: i32, height: i32, border: i32, imageSize: i32, data: rawptr);
+impl_CompressedTexImage1D:    proc "c" (target: u32, level: i32, internalformat: u32, width: i32, border: i32, imageSize: i32, data: rawptr);
+impl_CompressedTexSubImage3D: proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, imageSize: i32, data: rawptr);
+impl_CompressedTexSubImage2D: proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, imageSize: i32, data: rawptr);
+impl_CompressedTexSubImage1D: proc "c" (target: u32, level: i32, xoffset: i32, width: i32, format: u32, imageSize: i32, data: rawptr);
+impl_GetCompressedTexImage:   proc "c" (target: u32, level: i32, img: rawptr);
+
+load_1_3 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_ActiveTexture,           "glActiveTexture");
+	set_proc_address(&impl_SampleCoverage,          "glSampleCoverage");
+	set_proc_address(&impl_CompressedTexImage3D,    "glCompressedTexImage3D");
+	set_proc_address(&impl_CompressedTexImage2D,    "glCompressedTexImage2D");
+	set_proc_address(&impl_CompressedTexImage1D,    "glCompressedTexImage1D");
+	set_proc_address(&impl_CompressedTexSubImage3D, "glCompressedTexSubImage3D");
+	set_proc_address(&impl_CompressedTexSubImage2D, "glCompressedTexSubImage2D");
+	set_proc_address(&impl_CompressedTexSubImage1D, "glCompressedTexSubImage1D");
+	set_proc_address(&impl_GetCompressedTexImage,   "glGetCompressedTexImage");
+}
+
+
+// VERSION_1_4
+impl_BlendFuncSeparate: proc "c" (sfactorRGB: u32, dfactorRGB: u32, sfactorAlpha: u32, dfactorAlpha: u32);
+impl_MultiDrawArrays:   proc "c" (mode: u32, first: [^]i32, count: [^]i32, drawcount: i32);
+impl_MultiDrawElements: proc "c" (mode: u32, count: [^]i32, type: u32, indices: [^]rawptr, drawcount: i32);
+impl_PointParameterf:   proc "c" (pname: u32, param: f32);
+impl_PointParameterfv:  proc "c" (pname: u32, params: [^]f32);
+impl_PointParameteri:   proc "c" (pname: u32, param: i32);
+impl_PointParameteriv:  proc "c" (pname: u32, params: [^]i32);
+impl_BlendColor:        proc "c" (red: f32, green: f32, blue: f32, alpha: f32);
+impl_BlendEquation:     proc "c" (mode: u32);
+
+
+load_1_4 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_BlendFuncSeparate, "glBlendFuncSeparate");
+	set_proc_address(&impl_MultiDrawArrays,   "glMultiDrawArrays");
+	set_proc_address(&impl_MultiDrawElements, "glMultiDrawElements");
+	set_proc_address(&impl_PointParameterf,   "glPointParameterf");
+	set_proc_address(&impl_PointParameterfv,  "glPointParameterfv");
+	set_proc_address(&impl_PointParameteri,   "glPointParameteri");
+	set_proc_address(&impl_PointParameteriv,  "glPointParameteriv");
+	set_proc_address(&impl_BlendColor,        "glBlendColor");
+	set_proc_address(&impl_BlendEquation,     "glBlendEquation");
+}
+
+
+// VERSION_1_5
+impl_GenQueries:           proc "c" (n: i32, ids: [^]u32);
+impl_DeleteQueries:        proc "c" (n: i32, ids: [^]u32);
+impl_IsQuery:              proc "c" (id: u32) -> bool;
+impl_BeginQuery:           proc "c" (target: u32, id: u32);
+impl_EndQuery:             proc "c" (target: u32);
+impl_GetQueryiv:           proc "c" (target: u32, pname: u32, params: [^]i32);
+impl_GetQueryObjectiv:     proc "c" (id: u32, pname: u32, params: [^]i32);
+impl_GetQueryObjectuiv:    proc "c" (id: u32, pname: u32, params: [^]u32);
+impl_BindBuffer:           proc "c" (target: u32, buffer: u32);
+impl_DeleteBuffers:        proc "c" (n: i32, buffers: [^]u32);
+impl_GenBuffers:           proc "c" (n: i32, buffers: [^]u32);
+impl_IsBuffer:             proc "c" (buffer: u32) -> bool;
+impl_BufferData:           proc "c" (target: u32, size: int, data: rawptr, usage: u32);
+impl_BufferSubData:        proc "c" (target: u32, offset: int, size: int, data: rawptr);
+impl_GetBufferSubData:     proc "c" (target: u32, offset: int, size: int, data: rawptr);
+impl_MapBuffer:            proc "c" (target: u32, access: u32) -> rawptr;
+impl_UnmapBuffer:          proc "c" (target: u32) -> bool;
+impl_GetBufferParameteriv: proc "c" (target: u32, pname: u32, params: [^]i32);
+impl_GetBufferPointerv:    proc "c" (target: u32, pname: u32, params: [^]rawptr);
+
+load_1_5 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_GenQueries,           "glGenQueries");
+	set_proc_address(&impl_DeleteQueries,        "glDeleteQueries");
+	set_proc_address(&impl_IsQuery,              "glIsQuery");
+	set_proc_address(&impl_BeginQuery,           "glBeginQuery");
+	set_proc_address(&impl_EndQuery,             "glEndQuery");
+	set_proc_address(&impl_GetQueryiv,           "glGetQueryiv");
+	set_proc_address(&impl_GetQueryObjectiv,     "glGetQueryObjectiv");
+	set_proc_address(&impl_GetQueryObjectuiv,    "glGetQueryObjectuiv");
+	set_proc_address(&impl_BindBuffer,           "glBindBuffer");
+	set_proc_address(&impl_DeleteBuffers,        "glDeleteBuffers");
+	set_proc_address(&impl_GenBuffers,           "glGenBuffers");
+	set_proc_address(&impl_IsBuffer,             "glIsBuffer");
+	set_proc_address(&impl_BufferData,           "glBufferData");
+	set_proc_address(&impl_BufferSubData,        "glBufferSubData");
+	set_proc_address(&impl_GetBufferSubData,     "glGetBufferSubData");
+	set_proc_address(&impl_MapBuffer,            "glMapBuffer");
+	set_proc_address(&impl_UnmapBuffer,          "glUnmapBuffer");
+	set_proc_address(&impl_GetBufferParameteriv, "glGetBufferParameteriv");
+	set_proc_address(&impl_GetBufferPointerv,    "glGetBufferPointerv");
+}
+
+
+// VERSION_2_0
+impl_BlendEquationSeparate:    proc "c" (modeRGB: u32, modeAlpha: u32);
+impl_DrawBuffers:              proc "c" (n: i32, bufs: [^]u32);
+impl_StencilOpSeparate:        proc "c" (face: u32, sfail: u32, dpfail: u32, dppass: u32);
+impl_StencilFuncSeparate:      proc "c" (face: u32, func: u32, ref: i32, mask: u32);
+impl_StencilMaskSeparate:      proc "c" (face: u32, mask: u32);
+impl_AttachShader:             proc "c" (program: u32, shader: u32);
+impl_BindAttribLocation:       proc "c" (program: u32, index: u32, name: cstring);
+impl_CompileShader:            proc "c" (shader: u32);
+impl_CreateProgram:            proc "c" () -> u32;
+impl_CreateShader:             proc "c" (type: u32) -> u32;
+impl_DeleteProgram:            proc "c" (program: u32);
+impl_DeleteShader:             proc "c" (shader: u32);
+impl_DetachShader:             proc "c" (program: u32, shader: u32);
+impl_DisableVertexAttribArray: proc "c" (index: u32);
+impl_EnableVertexAttribArray:  proc "c" (index: u32);
+impl_GetActiveAttrib:          proc "c" (program: u32, index: u32, bufSize: i32, length: ^i32, size: ^i32, type: ^u32, name: [^]u8);
+impl_GetActiveUniform:         proc "c" (program: u32, index: u32, bufSize: i32, length: ^i32, size: ^i32, type: ^u32, name: [^]u8);
+impl_GetAttachedShaders:       proc "c" (program: u32, maxCount: i32, count: ^i32, shaders: ^u32);
+impl_GetAttribLocation:        proc "c" (program: u32, name: cstring) -> i32;
+impl_GetProgramiv:             proc "c" (program: u32, pname: u32, params: [^]i32);
+impl_GetProgramInfoLog:        proc "c" (program: u32, bufSize: i32, length: ^i32, infoLog: ^u8);
+impl_GetShaderiv:              proc "c" (shader: u32, pname: u32, params: [^]i32);
+impl_GetShaderInfoLog:         proc "c" (shader: u32, bufSize: i32, length: ^i32, infoLog: ^u8);
+impl_GetShaderSource:          proc "c" (shader: u32, bufSize: i32, length: ^i32, source: ^u8);
+impl_GetUniformLocation:       proc "c" (program: u32, name: cstring) -> i32;
+impl_GetUniformfv:             proc "c" (program: u32, location: i32, params: [^]f32);
+impl_GetUniformiv:             proc "c" (program: u32, location: i32, params: [^]i32);
+impl_GetVertexAttribdv:        proc "c" (index: u32, pname: u32, params: [^]f64);
+impl_GetVertexAttribfv:        proc "c" (index: u32, pname: u32, params: [^]f32);
+impl_GetVertexAttribiv:        proc "c" (index: u32, pname: u32, params: [^]i32);
+impl_GetVertexAttribPointerv:  proc "c" (index: u32, pname: u32, pointer: ^rawptr);
+impl_IsProgram:                proc "c" (program: u32) -> bool;
+impl_IsShader:                 proc "c" (shader: u32) -> bool;
+impl_LinkProgram:              proc "c" (program: u32);
+impl_ShaderSource:             proc "c" (shader: u32, count: i32, string: [^]cstring, length: [^]i32);
+impl_UseProgram:               proc "c" (program: u32);
+impl_Uniform1f:                proc "c" (location: i32, v0: f32);
+impl_Uniform2f:                proc "c" (location: i32, v0: f32, v1: f32);
+impl_Uniform3f:                proc "c" (location: i32, v0: f32, v1: f32, v2: f32);
+impl_Uniform4f:                proc "c" (location: i32, v0: f32, v1: f32, v2: f32, v3: f32);
+impl_Uniform1i:                proc "c" (location: i32, v0: i32);
+impl_Uniform2i:                proc "c" (location: i32, v0: i32, v1: i32);
+impl_Uniform3i:                proc "c" (location: i32, v0: i32, v1: i32, v2: i32);
+impl_Uniform4i:                proc "c" (location: i32, v0: i32, v1: i32, v2: i32, v3: i32);
+impl_Uniform1fv:               proc "c" (location: i32, count: i32, value: [^]f32);
+impl_Uniform2fv:               proc "c" (location: i32, count: i32, value: [^]f32);
+impl_Uniform3fv:               proc "c" (location: i32, count: i32, value: [^]f32);
+impl_Uniform4fv:               proc "c" (location: i32, count: i32, value: [^]f32);
+impl_Uniform1iv:               proc "c" (location: i32, count: i32, value: [^]i32);
+impl_Uniform2iv:               proc "c" (location: i32, count: i32, value: [^]i32);
+impl_Uniform3iv:               proc "c" (location: i32, count: i32, value: [^]i32);
+impl_Uniform4iv:               proc "c" (location: i32, count: i32, value: [^]i32);
+impl_UniformMatrix2fv:         proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_UniformMatrix3fv:         proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_UniformMatrix4fv:         proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_ValidateProgram:          proc "c" (program: u32);
+impl_VertexAttrib1d:           proc "c" (index: u32, x: f64);
+impl_VertexAttrib1dv:          proc "c" (index: u32, v: ^f64);
+impl_VertexAttrib1f:           proc "c" (index: u32, x: f32);
+impl_VertexAttrib1fv:          proc "c" (index: u32, v: ^f32);
+impl_VertexAttrib1s:           proc "c" (index: u32, x: i16);
+impl_VertexAttrib1sv:          proc "c" (index: u32, v: ^i16);
+impl_VertexAttrib2d:           proc "c" (index: u32, x: f64, y: f64);
+impl_VertexAttrib2dv:          proc "c" (index: u32, v: ^f64);
+impl_VertexAttrib2f:           proc "c" (index: u32, x: f32, y: f32);
+impl_VertexAttrib2fv:          proc "c" (index: u32, v: ^f32);
+impl_VertexAttrib2s:           proc "c" (index: u32, x: i16, y: i16);
+impl_VertexAttrib2sv:          proc "c" (index: u32, v: ^i16);
+impl_VertexAttrib3d:           proc "c" (index: u32, x: f64, y: f64, z: f64);
+impl_VertexAttrib3dv:          proc "c" (index: u32, v: ^f64);
+impl_VertexAttrib3f:           proc "c" (index: u32, x: f32, y: f32, z: f32);
+impl_VertexAttrib3fv:          proc "c" (index: u32, v: ^f32);
+impl_VertexAttrib3s:           proc "c" (index: u32, x: i16, y: i16, z: i16);
+impl_VertexAttrib3sv:          proc "c" (index: u32, v: ^i16);
+impl_VertexAttrib4Nbv:         proc "c" (index: u32, v: ^i8);
+impl_VertexAttrib4Niv:         proc "c" (index: u32, v: ^i32);
+impl_VertexAttrib4Nsv:         proc "c" (index: u32, v: ^i16);
+impl_VertexAttrib4Nub:         proc "c" (index: u32, x: u8, y: u8, z: u8, w: u8);
+impl_VertexAttrib4Nubv:        proc "c" (index: u32, v: ^u8);
+impl_VertexAttrib4Nuiv:        proc "c" (index: u32, v: ^u32);
+impl_VertexAttrib4Nusv:        proc "c" (index: u32, v: ^u16);
+impl_VertexAttrib4bv:          proc "c" (index: u32, v: ^i8);
+impl_VertexAttrib4d:           proc "c" (index: u32, x: f64, y: f64, z: f64, w: f64);
+impl_VertexAttrib4dv:          proc "c" (index: u32, v: ^f64);
+impl_VertexAttrib4f:           proc "c" (index: u32, x: f32, y: f32, z: f32, w: f32);
+impl_VertexAttrib4fv:          proc "c" (index: u32, v: ^f32);
+impl_VertexAttrib4iv:          proc "c" (index: u32, v: ^i32);
+impl_VertexAttrib4s:           proc "c" (index: u32, x: i16, y: i16, z: i16, w: i16);
+impl_VertexAttrib4sv:          proc "c" (index: u32, v: ^i16);
+impl_VertexAttrib4ubv:         proc "c" (index: u32, v: ^u8);
+impl_VertexAttrib4uiv:         proc "c" (index: u32, v: ^u32);
+impl_VertexAttrib4usv:         proc "c" (index: u32, v: ^u16);
+impl_VertexAttribPointer:      proc "c" (index: u32, size: i32, type: u32, normalized: bool, stride: i32, pointer: rawptr);
+
+load_2_0 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_BlendEquationSeparate,    "glBlendEquationSeparate");
+	set_proc_address(&impl_DrawBuffers,              "glDrawBuffers");
+	set_proc_address(&impl_StencilOpSeparate,        "glStencilOpSeparate");
+	set_proc_address(&impl_StencilFuncSeparate,      "glStencilFuncSeparate");
+	set_proc_address(&impl_StencilMaskSeparate,      "glStencilMaskSeparate");
+	set_proc_address(&impl_AttachShader,             "glAttachShader");
+	set_proc_address(&impl_BindAttribLocation,       "glBindAttribLocation");
+	set_proc_address(&impl_CompileShader,            "glCompileShader");
+	set_proc_address(&impl_CreateProgram,            "glCreateProgram");
+	set_proc_address(&impl_CreateShader,             "glCreateShader");
+	set_proc_address(&impl_DeleteProgram,            "glDeleteProgram");
+	set_proc_address(&impl_DeleteShader,             "glDeleteShader");
+	set_proc_address(&impl_DetachShader,             "glDetachShader");
+	set_proc_address(&impl_DisableVertexAttribArray, "glDisableVertexAttribArray");
+	set_proc_address(&impl_EnableVertexAttribArray,  "glEnableVertexAttribArray");
+	set_proc_address(&impl_GetActiveAttrib,          "glGetActiveAttrib");
+	set_proc_address(&impl_GetActiveUniform,         "glGetActiveUniform");
+	set_proc_address(&impl_GetAttachedShaders,       "glGetAttachedShaders");
+	set_proc_address(&impl_GetAttribLocation,        "glGetAttribLocation");
+	set_proc_address(&impl_GetProgramiv,             "glGetProgramiv");
+	set_proc_address(&impl_GetProgramInfoLog,        "glGetProgramInfoLog");
+	set_proc_address(&impl_GetShaderiv,              "glGetShaderiv");
+	set_proc_address(&impl_GetShaderInfoLog,         "glGetShaderInfoLog");
+	set_proc_address(&impl_GetShaderSource,          "glGetShaderSource");
+	set_proc_address(&impl_GetUniformLocation,       "glGetUniformLocation");
+	set_proc_address(&impl_GetUniformfv,             "glGetUniformfv");
+	set_proc_address(&impl_GetUniformiv,             "glGetUniformiv");
+	set_proc_address(&impl_GetVertexAttribdv,        "glGetVertexAttribdv");
+	set_proc_address(&impl_GetVertexAttribfv,        "glGetVertexAttribfv");
+	set_proc_address(&impl_GetVertexAttribiv,        "glGetVertexAttribiv");
+	set_proc_address(&impl_GetVertexAttribPointerv,  "glGetVertexAttribPointerv");
+	set_proc_address(&impl_IsProgram,                "glIsProgram");
+	set_proc_address(&impl_IsShader,                 "glIsShader");
+	set_proc_address(&impl_LinkProgram,              "glLinkProgram");
+	set_proc_address(&impl_ShaderSource,             "glShaderSource");
+	set_proc_address(&impl_UseProgram,               "glUseProgram");
+	set_proc_address(&impl_Uniform1f,                "glUniform1f");
+	set_proc_address(&impl_Uniform2f,                "glUniform2f");
+	set_proc_address(&impl_Uniform3f,                "glUniform3f");
+	set_proc_address(&impl_Uniform4f,                "glUniform4f");
+	set_proc_address(&impl_Uniform1i,                "glUniform1i");
+	set_proc_address(&impl_Uniform2i,                "glUniform2i");
+	set_proc_address(&impl_Uniform3i,                "glUniform3i");
+	set_proc_address(&impl_Uniform4i,                "glUniform4i");
+	set_proc_address(&impl_Uniform1fv,               "glUniform1fv");
+	set_proc_address(&impl_Uniform2fv,               "glUniform2fv");
+	set_proc_address(&impl_Uniform3fv,               "glUniform3fv");
+	set_proc_address(&impl_Uniform4fv,               "glUniform4fv");
+	set_proc_address(&impl_Uniform1iv,               "glUniform1iv");
+	set_proc_address(&impl_Uniform2iv,               "glUniform2iv");
+	set_proc_address(&impl_Uniform3iv,               "glUniform3iv");
+	set_proc_address(&impl_Uniform4iv,               "glUniform4iv");
+	set_proc_address(&impl_UniformMatrix2fv,         "glUniformMatrix2fv");
+	set_proc_address(&impl_UniformMatrix3fv,         "glUniformMatrix3fv");
+	set_proc_address(&impl_UniformMatrix4fv,         "glUniformMatrix4fv");
+	set_proc_address(&impl_ValidateProgram,          "glValidateProgram");
+	set_proc_address(&impl_VertexAttrib1d,           "glVertexAttrib1d");
+	set_proc_address(&impl_VertexAttrib1dv,          "glVertexAttrib1dv");
+	set_proc_address(&impl_VertexAttrib1f,           "glVertexAttrib1f");
+	set_proc_address(&impl_VertexAttrib1fv,          "glVertexAttrib1fv");
+	set_proc_address(&impl_VertexAttrib1s,           "glVertexAttrib1s");
+	set_proc_address(&impl_VertexAttrib1sv,          "glVertexAttrib1sv");
+	set_proc_address(&impl_VertexAttrib2d,           "glVertexAttrib2d");
+	set_proc_address(&impl_VertexAttrib2dv,          "glVertexAttrib2dv");
+	set_proc_address(&impl_VertexAttrib2f,           "glVertexAttrib2f");
+	set_proc_address(&impl_VertexAttrib2fv,          "glVertexAttrib2fv");
+	set_proc_address(&impl_VertexAttrib2s,           "glVertexAttrib2s");
+	set_proc_address(&impl_VertexAttrib2sv,          "glVertexAttrib2sv");
+	set_proc_address(&impl_VertexAttrib3d,           "glVertexAttrib3d");
+	set_proc_address(&impl_VertexAttrib3dv,          "glVertexAttrib3dv");
+	set_proc_address(&impl_VertexAttrib3f,           "glVertexAttrib3f");
+	set_proc_address(&impl_VertexAttrib3fv,          "glVertexAttrib3fv");
+	set_proc_address(&impl_VertexAttrib3s,           "glVertexAttrib3s");
+	set_proc_address(&impl_VertexAttrib3sv,          "glVertexAttrib3sv");
+	set_proc_address(&impl_VertexAttrib4Nbv,         "glVertexAttrib4Nbv");
+	set_proc_address(&impl_VertexAttrib4Niv,         "glVertexAttrib4Niv");
+	set_proc_address(&impl_VertexAttrib4Nsv,         "glVertexAttrib4Nsv");
+	set_proc_address(&impl_VertexAttrib4Nub,         "glVertexAttrib4Nub");
+	set_proc_address(&impl_VertexAttrib4Nubv,        "glVertexAttrib4Nubv");
+	set_proc_address(&impl_VertexAttrib4Nuiv,        "glVertexAttrib4Nuiv");
+	set_proc_address(&impl_VertexAttrib4Nusv,        "glVertexAttrib4Nusv");
+	set_proc_address(&impl_VertexAttrib4bv,          "glVertexAttrib4bv");
+	set_proc_address(&impl_VertexAttrib4d,           "glVertexAttrib4d");
+	set_proc_address(&impl_VertexAttrib4dv,          "glVertexAttrib4dv");
+	set_proc_address(&impl_VertexAttrib4f,           "glVertexAttrib4f");
+	set_proc_address(&impl_VertexAttrib4fv,          "glVertexAttrib4fv");
+	set_proc_address(&impl_VertexAttrib4iv,          "glVertexAttrib4iv");
+	set_proc_address(&impl_VertexAttrib4s,           "glVertexAttrib4s");
+	set_proc_address(&impl_VertexAttrib4sv,          "glVertexAttrib4sv");
+	set_proc_address(&impl_VertexAttrib4ubv,         "glVertexAttrib4ubv");
+	set_proc_address(&impl_VertexAttrib4uiv,         "glVertexAttrib4uiv");
+	set_proc_address(&impl_VertexAttrib4usv,         "glVertexAttrib4usv");
+	set_proc_address(&impl_VertexAttribPointer,      "glVertexAttribPointer");
+}
+
+
+// VERSION_2_1
+impl_UniformMatrix2x3fv: proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_UniformMatrix3x2fv: proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_UniformMatrix2x4fv: proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_UniformMatrix4x2fv: proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_UniformMatrix3x4fv: proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_UniformMatrix4x3fv: proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32);
+
+load_2_1 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_UniformMatrix2x3fv, "glUniformMatrix2x3fv");
+	set_proc_address(&impl_UniformMatrix3x2fv, "glUniformMatrix3x2fv");
+	set_proc_address(&impl_UniformMatrix2x4fv, "glUniformMatrix2x4fv");
+	set_proc_address(&impl_UniformMatrix4x2fv, "glUniformMatrix4x2fv");
+	set_proc_address(&impl_UniformMatrix3x4fv, "glUniformMatrix3x4fv");
+	set_proc_address(&impl_UniformMatrix4x3fv, "glUniformMatrix4x3fv");
+}
+
+
+// VERSION_3_0
+ impl_ColorMaski:                          proc "c" (index: u32, r: u8, g: u8, b: u8, a: u8);
+ impl_GetBooleani_v:                       proc "c" (target: u32, index: u32, data: ^bool);
+ impl_GetIntegeri_v:                       proc "c" (target: u32, index: u32, data: ^i32);
+ impl_Enablei:                             proc "c" (target: u32, index: u32);
+ impl_Disablei:                            proc "c" (target: u32, index: u32);
+ impl_IsEnabledi:                          proc "c" (target: u32, index: u32) -> bool;
+ impl_BeginTransformFeedback:              proc "c" (primitiveMode: u32);
+ impl_EndTransformFeedback:                proc "c" ();
+ impl_BindBufferRange:                     proc "c" (target: u32, index: u32, buffer: u32, offset: int, size: int);
+ impl_BindBufferBase:                      proc "c" (target: u32, index: u32, buffer: u32);
+ impl_TransformFeedbackVaryings:           proc "c" (program: u32, count: i32, varyings: [^]cstring, bufferMode: u32);
+ impl_GetTransformFeedbackVarying:         proc "c" (program: u32, index: u32, bufSize: i32, length: ^i32, size: ^i32, type: ^u32, name: [^]u8);
+ impl_ClampColor:                          proc "c" (target: u32, clamp: u32);
+ impl_BeginConditionalRender:              proc "c" (id: u32, mode: u32);
+ impl_EndConditionalRender:                proc "c" ();
+ impl_VertexAttribIPointer:                proc "c" (index: u32, size: i32, type: u32, stride: i32, pointer: rawptr);
+ impl_GetVertexAttribIiv:                  proc "c" (index: u32, pname: u32, params: [^]i32);
+ impl_GetVertexAttribIuiv:                 proc "c" (index: u32, pname: u32, params: [^]u32);
+ impl_VertexAttribI1i:                     proc "c" (index: u32, x: i32);
+ impl_VertexAttribI2i:                     proc "c" (index: u32, x: i32, y: i32);
+ impl_VertexAttribI3i:                     proc "c" (index: u32, x: i32, y: i32, z: i32);
+ impl_VertexAttribI4i:                     proc "c" (index: u32, x: i32, y: i32, z: i32, w: i32);
+ impl_VertexAttribI1ui:                    proc "c" (index: u32, x: u32);
+ impl_VertexAttribI2ui:                    proc "c" (index: u32, x: u32, y: u32);
+ impl_VertexAttribI3ui:                    proc "c" (index: u32, x: u32, y: u32, z: u32);
+ impl_VertexAttribI4ui:                    proc "c" (index: u32, x: u32, y: u32, z: u32, w: u32);
+ impl_VertexAttribI1iv:                    proc "c" (index: u32, v: ^i32);
+ impl_VertexAttribI2iv:                    proc "c" (index: u32, v: ^i32);
+ impl_VertexAttribI3iv:                    proc "c" (index: u32, v: ^i32);
+ impl_VertexAttribI4iv:                    proc "c" (index: u32, v: ^i32);
+ impl_VertexAttribI1uiv:                   proc "c" (index: u32, v: ^u32);
+ impl_VertexAttribI2uiv:                   proc "c" (index: u32, v: ^u32);
+ impl_VertexAttribI3uiv:                   proc "c" (index: u32, v: ^u32);
+ impl_VertexAttribI4uiv:                   proc "c" (index: u32, v: ^u32);
+ impl_VertexAttribI4bv:                    proc "c" (index: u32, v: ^i8);
+ impl_VertexAttribI4sv:                    proc "c" (index: u32, v: ^i16);
+ impl_VertexAttribI4ubv:                   proc "c" (index: u32, v: ^u8);
+ impl_VertexAttribI4usv:                   proc "c" (index: u32, v: ^u16);
+ impl_GetUniformuiv:                       proc "c" (program: u32, location: i32, params: [^]u32);
+ impl_BindFragDataLocation:                proc "c" (program: u32, color: u32, name: cstring);
+ impl_GetFragDataLocation:                 proc "c" (program: u32, name: cstring) -> i32;
+ impl_Uniform1ui:                          proc "c" (location: i32, v0: u32);
+ impl_Uniform2ui:                          proc "c" (location: i32, v0: u32, v1: u32);
+ impl_Uniform3ui:                          proc "c" (location: i32, v0: u32, v1: u32, v2: u32);
+ impl_Uniform4ui:                          proc "c" (location: i32, v0: u32, v1: u32, v2: u32, v3: u32);
+ impl_Uniform1uiv:                         proc "c" (location: i32, count: i32, value: [^]u32);
+ impl_Uniform2uiv:                         proc "c" (location: i32, count: i32, value: [^]u32);
+ impl_Uniform3uiv:                         proc "c" (location: i32, count: i32, value: [^]u32);
+ impl_Uniform4uiv:                         proc "c" (location: i32, count: i32, value: [^]u32);
+ impl_TexParameterIiv:                     proc "c" (target: u32, pname: u32, params: [^]i32);
+ impl_TexParameterIuiv:                    proc "c" (target: u32, pname: u32, params: [^]u32);
+ impl_GetTexParameterIiv:                  proc "c" (target: u32, pname: u32, params: [^]i32);
+ impl_GetTexParameterIuiv:                 proc "c" (target: u32, pname: u32, params: [^]u32);
+ impl_ClearBufferiv:                       proc "c" (buffer: u32, drawbuffer: i32, value: ^i32);
+ impl_ClearBufferuiv:                      proc "c" (buffer: u32, drawbuffer: i32, value: ^u32);
+ impl_ClearBufferfv:                       proc "c" (buffer: u32, drawbuffer: i32, value: ^f32);
+ impl_ClearBufferfi:                       proc "c" (buffer: u32, drawbuffer: i32, depth: f32, stencil: i32) -> rawptr;
+ impl_GetStringi:                          proc "c" (name: u32, index: u32) -> cstring;
+ impl_IsRenderbuffer:                      proc "c" (renderbuffer: u32) -> bool;
+ impl_BindRenderbuffer:                    proc "c" (target: u32, renderbuffer: u32);
+ impl_DeleteRenderbuffers:                 proc "c" (n: i32, renderbuffers: [^]u32);
+ impl_GenRenderbuffers:                    proc "c" (n: i32, renderbuffers: [^]u32);
+ impl_RenderbufferStorage:                 proc "c" (target: u32, internalformat: u32, width: i32, height: i32);
+ impl_GetRenderbufferParameteriv:          proc "c" (target: u32, pname: u32, params: [^]i32);
+ impl_IsFramebuffer:                       proc "c" (framebuffer: u32) -> bool;
+ impl_BindFramebuffer:                     proc "c" (target: u32, framebuffer: u32);
+ impl_DeleteFramebuffers:                  proc "c" (n: i32, framebuffers: [^]u32);
+ impl_GenFramebuffers:                     proc "c" (n: i32, framebuffers: [^]u32);
+ impl_CheckFramebufferStatus:              proc "c" (target: u32) -> u32;
+ impl_FramebufferTexture1D:                proc "c" (target: u32, attachment: u32, textarget: u32, texture: u32, level: i32);
+ impl_FramebufferTexture2D:                proc "c" (target: u32, attachment: u32, textarget: u32, texture: u32, level: i32);
+ impl_FramebufferTexture3D:                proc "c" (target: u32, attachment: u32, textarget: u32, texture: u32, level: i32, zoffset: i32);
+ impl_FramebufferRenderbuffer:             proc "c" (target: u32, attachment: u32, renderbuffertarget: u32, renderbuffer: u32);
+ impl_GetFramebufferAttachmentParameteriv: proc "c" (target: u32, attachment: u32, pname: u32, params: [^]i32);
+ impl_GenerateMipmap:                      proc "c" (target: u32);
+ impl_BlitFramebuffer:                     proc "c" (srcX0: i32, srcY0: i32, srcX1: i32, srcY1: i32, dstX0: i32, dstY0: i32, dstX1: i32, dstY1: i32, mask: u32, filter: u32);
+ impl_RenderbufferStorageMultisample:      proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32);
+ impl_FramebufferTextureLayer:             proc "c" (target: u32, attachment: u32, texture: u32, level: i32, layer: i32);
+ impl_MapBufferRange:                      proc "c" (target: u32, offset: int, length: int, access: u32) -> rawptr;
+ impl_FlushMappedBufferRange:              proc "c" (target: u32, offset: int, length: int);
+ impl_BindVertexArray:                     proc "c" (array: u32);
+ impl_DeleteVertexArrays:                  proc "c" (n: i32, arrays: [^]u32);
+ impl_GenVertexArrays:                     proc "c" (n: i32, arrays: [^]u32);
+ impl_IsVertexArray:                       proc "c" (array: u32) -> bool;
+
+load_3_0 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_ColorMaski,                          "glColorMaski");
+	set_proc_address(&impl_GetBooleani_v,                       "glGetBooleani_v");
+	set_proc_address(&impl_GetIntegeri_v,                       "glGetIntegeri_v");
+	set_proc_address(&impl_Enablei,                             "glEnablei");
+	set_proc_address(&impl_Disablei,                            "glDisablei");
+	set_proc_address(&impl_IsEnabledi,                          "glIsEnabledi");
+	set_proc_address(&impl_BeginTransformFeedback,              "glBeginTransformFeedback");
+	set_proc_address(&impl_EndTransformFeedback,                "glEndTransformFeedback");
+	set_proc_address(&impl_BindBufferRange,                     "glBindBufferRange");
+	set_proc_address(&impl_BindBufferBase,                      "glBindBufferBase");
+	set_proc_address(&impl_TransformFeedbackVaryings,           "glTransformFeedbackVaryings");
+	set_proc_address(&impl_GetTransformFeedbackVarying,         "glGetTransformFeedbackVarying");
+	set_proc_address(&impl_ClampColor,                          "glClampColor");
+	set_proc_address(&impl_BeginConditionalRender,              "glBeginConditionalRender");
+	set_proc_address(&impl_EndConditionalRender,                "glEndConditionalRender");
+	set_proc_address(&impl_VertexAttribIPointer,                "glVertexAttribIPointer");
+	set_proc_address(&impl_GetVertexAttribIiv,                  "glGetVertexAttribIiv");
+	set_proc_address(&impl_GetVertexAttribIuiv,                 "glGetVertexAttribIuiv");
+	set_proc_address(&impl_VertexAttribI1i,                     "glVertexAttribI1i");
+	set_proc_address(&impl_VertexAttribI2i,                     "glVertexAttribI2i");
+	set_proc_address(&impl_VertexAttribI3i,                     "glVertexAttribI3i");
+	set_proc_address(&impl_VertexAttribI4i,                     "glVertexAttribI4i");
+	set_proc_address(&impl_VertexAttribI1ui,                    "glVertexAttribI1ui");
+	set_proc_address(&impl_VertexAttribI2ui,                    "glVertexAttribI2ui");
+	set_proc_address(&impl_VertexAttribI3ui,                    "glVertexAttribI3ui");
+	set_proc_address(&impl_VertexAttribI4ui,                    "glVertexAttribI4ui");
+	set_proc_address(&impl_VertexAttribI1iv,                    "glVertexAttribI1iv");
+	set_proc_address(&impl_VertexAttribI2iv,                    "glVertexAttribI2iv");
+	set_proc_address(&impl_VertexAttribI3iv,                    "glVertexAttribI3iv");
+	set_proc_address(&impl_VertexAttribI4iv,                    "glVertexAttribI4iv");
+	set_proc_address(&impl_VertexAttribI1uiv,                   "glVertexAttribI1uiv");
+	set_proc_address(&impl_VertexAttribI2uiv,                   "glVertexAttribI2uiv");
+	set_proc_address(&impl_VertexAttribI3uiv,                   "glVertexAttribI3uiv");
+	set_proc_address(&impl_VertexAttribI4uiv,                   "glVertexAttribI4uiv");
+	set_proc_address(&impl_VertexAttribI4bv,                    "glVertexAttribI4bv");
+	set_proc_address(&impl_VertexAttribI4sv,                    "glVertexAttribI4sv");
+	set_proc_address(&impl_VertexAttribI4ubv,                   "glVertexAttribI4ubv");
+	set_proc_address(&impl_VertexAttribI4usv,                   "glVertexAttribI4usv");
+	set_proc_address(&impl_GetUniformuiv,                       "glGetUniformuiv");
+	set_proc_address(&impl_BindFragDataLocation,                "glBindFragDataLocation");
+	set_proc_address(&impl_GetFragDataLocation,                 "glGetFragDataLocation");
+	set_proc_address(&impl_Uniform1ui,                          "glUniform1ui");
+	set_proc_address(&impl_Uniform2ui,                          "glUniform2ui");
+	set_proc_address(&impl_Uniform3ui,                          "glUniform3ui");
+	set_proc_address(&impl_Uniform4ui,                          "glUniform4ui");
+	set_proc_address(&impl_Uniform1uiv,                         "glUniform1uiv");
+	set_proc_address(&impl_Uniform2uiv,                         "glUniform2uiv");
+	set_proc_address(&impl_Uniform3uiv,                         "glUniform3uiv");
+	set_proc_address(&impl_Uniform4uiv,                         "glUniform4uiv");
+	set_proc_address(&impl_TexParameterIiv,                     "glTexParameterIiv");
+	set_proc_address(&impl_TexParameterIuiv,                    "glTexParameterIuiv");
+	set_proc_address(&impl_GetTexParameterIiv,                  "glGetTexParameterIiv");
+	set_proc_address(&impl_GetTexParameterIuiv,                 "glGetTexParameterIuiv");
+	set_proc_address(&impl_ClearBufferiv,                       "glClearBufferiv");
+	set_proc_address(&impl_ClearBufferuiv,                      "glClearBufferuiv");
+	set_proc_address(&impl_ClearBufferfv,                       "glClearBufferfv");
+	set_proc_address(&impl_ClearBufferfi,                       "glClearBufferfi");
+	set_proc_address(&impl_GetStringi,                          "glGetStringi");
+	set_proc_address(&impl_IsRenderbuffer,                      "glIsRenderbuffer");
+	set_proc_address(&impl_BindRenderbuffer,                    "glBindRenderbuffer");
+	set_proc_address(&impl_DeleteRenderbuffers,                 "glDeleteRenderbuffers");
+	set_proc_address(&impl_GenRenderbuffers,                    "glGenRenderbuffers");
+	set_proc_address(&impl_RenderbufferStorage,                 "glRenderbufferStorage");
+	set_proc_address(&impl_GetRenderbufferParameteriv,          "glGetRenderbufferParameteriv");
+	set_proc_address(&impl_IsFramebuffer,                       "glIsFramebuffer");
+	set_proc_address(&impl_BindFramebuffer,                     "glBindFramebuffer");
+	set_proc_address(&impl_DeleteFramebuffers,                  "glDeleteFramebuffers");
+	set_proc_address(&impl_GenFramebuffers,                     "glGenFramebuffers");
+	set_proc_address(&impl_CheckFramebufferStatus,              "glCheckFramebufferStatus");
+	set_proc_address(&impl_FramebufferTexture1D,                "glFramebufferTexture1D");
+	set_proc_address(&impl_FramebufferTexture2D,                "glFramebufferTexture2D");
+	set_proc_address(&impl_FramebufferTexture3D,                "glFramebufferTexture3D");
+	set_proc_address(&impl_FramebufferRenderbuffer,             "glFramebufferRenderbuffer");
+	set_proc_address(&impl_GetFramebufferAttachmentParameteriv, "glGetFramebufferAttachmentParameteriv");
+	set_proc_address(&impl_GenerateMipmap,                      "glGenerateMipmap");
+	set_proc_address(&impl_BlitFramebuffer,                     "glBlitFramebuffer");
+	set_proc_address(&impl_RenderbufferStorageMultisample,      "glRenderbufferStorageMultisample");
+	set_proc_address(&impl_FramebufferTextureLayer,             "glFramebufferTextureLayer");
+	set_proc_address(&impl_MapBufferRange,                      "glMapBufferRange");
+	set_proc_address(&impl_FlushMappedBufferRange,              "glFlushMappedBufferRange");
+	set_proc_address(&impl_BindVertexArray,                     "glBindVertexArray");
+	set_proc_address(&impl_DeleteVertexArrays,                  "glDeleteVertexArrays");
+	set_proc_address(&impl_GenVertexArrays,                     "glGenVertexArrays");
+	set_proc_address(&impl_IsVertexArray,                       "glIsVertexArray");
+}
+
+
+// VERSION_3_1
+impl_DrawArraysInstanced:       proc "c" (mode: u32, first: i32, count: i32, instancecount: i32);
+impl_DrawElementsInstanced:     proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32);
+impl_TexBuffer:                 proc "c" (target: u32, internalformat: u32, buffer: u32);
+impl_PrimitiveRestartIndex:     proc "c" (index: u32);
+impl_CopyBufferSubData:         proc "c" (readTarget: u32, writeTarget: u32, readOffset: int, writeOffset: int, size: int);
+impl_GetUniformIndices:         proc "c" (program: u32, uniformCount: i32, uniformNames: [^]cstring, uniformIndices: [^]u32);
+impl_GetActiveUniformsiv:       proc "c" (program: u32, uniformCount: i32, uniformIndices: [^]u32, pname: u32, params: [^]i32);
+impl_GetActiveUniformName:      proc "c" (program: u32, uniformIndex: u32, bufSize: i32, length: ^i32, uniformName: [^]u8);
+impl_GetUniformBlockIndex:      proc "c" (program: u32, uniformBlockName: cstring) -> u32;
+impl_GetActiveUniformBlockiv:   proc "c" (program: u32, uniformBlockIndex: u32, pname: u32, params: [^]i32);
+impl_GetActiveUniformBlockName: proc "c" (program: u32, uniformBlockIndex: u32, bufSize: i32, length: ^i32, uniformBlockName: [^]u8);
+impl_UniformBlockBinding:       proc "c" (program: u32, uniformBlockIndex: u32, uniformBlockBinding: u32);
+
+load_3_1 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_DrawArraysInstanced,       "glDrawArraysInstanced");
+	set_proc_address(&impl_DrawElementsInstanced,     "glDrawElementsInstanced");
+	set_proc_address(&impl_TexBuffer,                 "glTexBuffer");
+	set_proc_address(&impl_PrimitiveRestartIndex,     "glPrimitiveRestartIndex");
+	set_proc_address(&impl_CopyBufferSubData,         "glCopyBufferSubData");
+	set_proc_address(&impl_GetUniformIndices,         "glGetUniformIndices");
+	set_proc_address(&impl_GetActiveUniformsiv,       "glGetActiveUniformsiv");
+	set_proc_address(&impl_GetActiveUniformName,      "glGetActiveUniformName");
+	set_proc_address(&impl_GetUniformBlockIndex,      "glGetUniformBlockIndex");
+	set_proc_address(&impl_GetActiveUniformBlockiv,   "glGetActiveUniformBlockiv");
+	set_proc_address(&impl_GetActiveUniformBlockName, "glGetActiveUniformBlockName");
+	set_proc_address(&impl_UniformBlockBinding,       "glUniformBlockBinding");
+}
+
+
+// VERSION_3_2
+impl_DrawElementsBaseVertex:          proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, basevertex: i32);
+impl_DrawRangeElementsBaseVertex:     proc "c" (mode: u32, start: u32, end: u32, count: i32, type: u32, indices: rawptr, basevertex: i32);
+impl_DrawElementsInstancedBaseVertex: proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32, basevertex: i32);
+impl_MultiDrawElementsBaseVertex:     proc "c" (mode: u32, count: ^i32, type: u32, indices: [^]rawptr, drawcount: i32, basevertex: ^i32);
+impl_ProvokingVertex:                 proc "c" (mode: u32);
+impl_FenceSync:                       proc "c" (condition: u32, flags: u32) -> sync_t;
+impl_IsSync:                          proc "c" (sync: sync_t) -> bool;
+impl_DeleteSync:                      proc "c" (sync: sync_t);
+impl_ClientWaitSync:                  proc "c" (sync: sync_t, flags: u32, timeout: u64) -> u32;
+impl_WaitSync:                        proc "c" (sync: sync_t, flags: u32, timeout: u64);
+impl_GetInteger64v:                   proc "c" (pname: u32, data: ^i64);
+impl_GetSynciv:                       proc "c" (sync: sync_t, pname: u32, bufSize: i32, length: ^i32, values: [^]i32);
+impl_GetInteger64i_v:                 proc "c" (target: u32, index: u32, data: ^i64);
+impl_GetBufferParameteri64v:          proc "c" (target: u32, pname: u32, params: [^]i64);
+impl_FramebufferTexture:              proc "c" (target: u32, attachment: u32, texture: u32, level: i32);
+impl_TexImage2DMultisample:           proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: u8);
+impl_TexImage3DMultisample:           proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: u8);
+impl_GetMultisamplefv:                proc "c" (pname: u32, index: u32, val: ^f32);
+impl_SampleMaski:                     proc "c" (maskNumber: u32, mask: u32);
+
+load_3_2 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_DrawElementsBaseVertex,          "glDrawElementsBaseVertex");
+	set_proc_address(&impl_DrawRangeElementsBaseVertex,     "glDrawRangeElementsBaseVertex");
+	set_proc_address(&impl_DrawElementsInstancedBaseVertex, "glDrawElementsInstancedBaseVertex");
+	set_proc_address(&impl_MultiDrawElementsBaseVertex,     "glMultiDrawElementsBaseVertex");
+	set_proc_address(&impl_ProvokingVertex,                 "glProvokingVertex");
+	set_proc_address(&impl_FenceSync,                       "glFenceSync");
+	set_proc_address(&impl_IsSync,                          "glIsSync");
+	set_proc_address(&impl_DeleteSync,                      "glDeleteSync");
+	set_proc_address(&impl_ClientWaitSync,                  "glClientWaitSync");
+	set_proc_address(&impl_WaitSync,                        "glWaitSync");
+	set_proc_address(&impl_GetInteger64v,                   "glGetInteger64v");
+	set_proc_address(&impl_GetSynciv,                       "glGetSynciv");
+	set_proc_address(&impl_GetInteger64i_v,                 "glGetInteger64i_v");
+	set_proc_address(&impl_GetBufferParameteri64v,          "glGetBufferParameteri64v");
+	set_proc_address(&impl_FramebufferTexture,              "glFramebufferTexture");
+	set_proc_address(&impl_TexImage2DMultisample,           "glTexImage2DMultisample");
+	set_proc_address(&impl_TexImage3DMultisample,           "glTexImage3DMultisample");
+	set_proc_address(&impl_GetMultisamplefv,                "glGetMultisamplefv");
+	set_proc_address(&impl_SampleMaski,                     "glSampleMaski");
+}
+
+
+// VERSION_3_3
+impl_BindFragDataLocationIndexed: proc "c" (program: u32, colorNumber: u32, index: u32, name: cstring);
+impl_GetFragDataIndex:            proc "c" (program: u32, name: cstring) -> i32;
+impl_GenSamplers:                 proc "c" (count: i32, samplers: [^]u32);
+impl_DeleteSamplers:              proc "c" (count: i32, samplers: [^]u32);
+impl_IsSampler:                   proc "c" (sampler: u32) -> bool;
+impl_BindSampler:                 proc "c" (unit: u32, sampler: u32);
+impl_SamplerParameteri:           proc "c" (sampler: u32, pname: u32, param: i32);
+impl_SamplerParameteriv:          proc "c" (sampler: u32, pname: u32, param: ^i32);
+impl_SamplerParameterf:           proc "c" (sampler: u32, pname: u32, param: f32);
+impl_SamplerParameterfv:          proc "c" (sampler: u32, pname: u32, param: ^f32);
+impl_SamplerParameterIiv:         proc "c" (sampler: u32, pname: u32, param: ^i32);
+impl_SamplerParameterIuiv:        proc "c" (sampler: u32, pname: u32, param: ^u32);
+impl_GetSamplerParameteriv:       proc "c" (sampler: u32, pname: u32, params: [^]i32);
+impl_GetSamplerParameterIiv:      proc "c" (sampler: u32, pname: u32, params: [^]i32);
+impl_GetSamplerParameterfv:       proc "c" (sampler: u32, pname: u32, params: [^]f32);
+impl_GetSamplerParameterIuiv:     proc "c" (sampler: u32, pname: u32, params: [^]u32);
+impl_QueryCounter:                proc "c" (id: u32, target: u32);
+impl_GetQueryObjecti64v:          proc "c" (id: u32, pname: u32, params: [^]i64);
+impl_GetQueryObjectui64v:         proc "c" (id: u32, pname: u32, params: [^]u64);
+impl_VertexAttribDivisor:         proc "c" (index: u32, divisor: u32);
+impl_VertexAttribP1ui:            proc "c" (index: u32, type: u32, normalized: bool, value: u32);
+impl_VertexAttribP1uiv:           proc "c" (index: u32, type: u32, normalized: bool, value: ^u32);
+impl_VertexAttribP2ui:            proc "c" (index: u32, type: u32, normalized: bool, value: u32);
+impl_VertexAttribP2uiv:           proc "c" (index: u32, type: u32, normalized: bool, value: ^u32);
+impl_VertexAttribP3ui:            proc "c" (index: u32, type: u32, normalized: bool, value: u32);
+impl_VertexAttribP3uiv:           proc "c" (index: u32, type: u32, normalized: bool, value: ^u32);
+impl_VertexAttribP4ui:            proc "c" (index: u32, type: u32, normalized: bool, value: u32);
+impl_VertexAttribP4uiv:           proc "c" (index: u32, type: u32, normalized: bool, value: ^u32);
+impl_VertexP2ui:                  proc "c" (type: u32, value: u32);
+impl_VertexP2uiv:                 proc "c" (type: u32, value: ^u32);
+impl_VertexP3ui:                  proc "c" (type: u32, value: u32);
+impl_VertexP3uiv:                 proc "c" (type: u32, value: ^u32);
+impl_VertexP4ui:                  proc "c" (type: u32, value: u32);
+impl_VertexP4uiv:                 proc "c" (type: u32, value: ^u32);
+impl_TexCoordP1ui:                proc "c" (type: u32, coords: u32);
+impl_TexCoordP1uiv:               proc "c" (type: u32, coords: [^]u32);
+impl_TexCoordP2ui:                proc "c" (type: u32, coords: u32);
+impl_TexCoordP2uiv:               proc "c" (type: u32, coords: [^]u32);
+impl_TexCoordP3ui:                proc "c" (type: u32, coords: u32);
+impl_TexCoordP3uiv:               proc "c" (type: u32, coords: [^]u32);
+impl_TexCoordP4ui:                proc "c" (type: u32, coords: u32);
+impl_TexCoordP4uiv:               proc "c" (type: u32, coords: [^]u32);
+impl_MultiTexCoordP1ui:           proc "c" (texture: u32, type: u32, coords: u32);
+impl_MultiTexCoordP1uiv:          proc "c" (texture: u32, type: u32, coords: [^]u32);
+impl_MultiTexCoordP2ui:           proc "c" (texture: u32, type: u32, coords: u32);
+impl_MultiTexCoordP2uiv:          proc "c" (texture: u32, type: u32, coords: [^]u32);
+impl_MultiTexCoordP3ui:           proc "c" (texture: u32, type: u32, coords: u32);
+impl_MultiTexCoordP3uiv:          proc "c" (texture: u32, type: u32, coords: [^]u32);
+impl_MultiTexCoordP4ui:           proc "c" (texture: u32, type: u32, coords: u32);
+impl_MultiTexCoordP4uiv:          proc "c" (texture: u32, type: u32, coords: [^]u32);
+impl_NormalP3ui:                  proc "c" (type: u32, coords: u32);
+impl_NormalP3uiv:                 proc "c" (type: u32, coords: [^]u32);
+impl_ColorP3ui:                   proc "c" (type: u32, color: u32);
+impl_ColorP3uiv:                  proc "c" (type: u32, color: ^u32);
+impl_ColorP4ui:                   proc "c" (type: u32, color: u32);
+impl_ColorP4uiv:                  proc "c" (type: u32, color: ^u32);
+impl_SecondaryColorP3ui:          proc "c" (type: u32, color: u32);
+impl_SecondaryColorP3uiv:         proc "c" (type: u32, color: ^u32);
+
+load_3_3 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_BindFragDataLocationIndexed, "glBindFragDataLocationIndexed");
+	set_proc_address(&impl_GetFragDataIndex,            "glGetFragDataIndex");
+	set_proc_address(&impl_GenSamplers,                 "glGenSamplers");
+	set_proc_address(&impl_DeleteSamplers,              "glDeleteSamplers");
+	set_proc_address(&impl_IsSampler,                   "glIsSampler");
+	set_proc_address(&impl_BindSampler,                 "glBindSampler");
+	set_proc_address(&impl_SamplerParameteri,           "glSamplerParameteri");
+	set_proc_address(&impl_SamplerParameteriv,          "glSamplerParameteriv");
+	set_proc_address(&impl_SamplerParameterf,           "glSamplerParameterf");
+	set_proc_address(&impl_SamplerParameterfv,          "glSamplerParameterfv");
+	set_proc_address(&impl_SamplerParameterIiv,         "glSamplerParameterIiv");
+	set_proc_address(&impl_SamplerParameterIuiv,        "glSamplerParameterIuiv");
+	set_proc_address(&impl_GetSamplerParameteriv,       "glGetSamplerParameteriv");
+	set_proc_address(&impl_GetSamplerParameterIiv,      "glGetSamplerParameterIiv");
+	set_proc_address(&impl_GetSamplerParameterfv,       "glGetSamplerParameterfv");
+	set_proc_address(&impl_GetSamplerParameterIuiv,     "glGetSamplerParameterIuiv");
+	set_proc_address(&impl_QueryCounter,                "glQueryCounter");
+	set_proc_address(&impl_GetQueryObjecti64v,          "glGetQueryObjecti64v");
+	set_proc_address(&impl_GetQueryObjectui64v,         "glGetQueryObjectui64v");
+	set_proc_address(&impl_VertexAttribDivisor,         "glVertexAttribDivisor");
+	set_proc_address(&impl_VertexAttribP1ui,            "glVertexAttribP1ui");
+	set_proc_address(&impl_VertexAttribP1uiv,           "glVertexAttribP1uiv");
+	set_proc_address(&impl_VertexAttribP2ui,            "glVertexAttribP2ui");
+	set_proc_address(&impl_VertexAttribP2uiv,           "glVertexAttribP2uiv");
+	set_proc_address(&impl_VertexAttribP3ui,            "glVertexAttribP3ui");
+	set_proc_address(&impl_VertexAttribP3uiv,           "glVertexAttribP3uiv");
+	set_proc_address(&impl_VertexAttribP4ui,            "glVertexAttribP4ui");
+	set_proc_address(&impl_VertexAttribP4uiv,           "glVertexAttribP4uiv");
+	set_proc_address(&impl_VertexP2ui,                  "glVertexP2ui");
+	set_proc_address(&impl_VertexP2uiv,                 "glVertexP2uiv");
+	set_proc_address(&impl_VertexP3ui,                  "glVertexP3ui");
+	set_proc_address(&impl_VertexP3uiv,                 "glVertexP3uiv");
+	set_proc_address(&impl_VertexP4ui,                  "glVertexP4ui");
+	set_proc_address(&impl_VertexP4uiv,                 "glVertexP4uiv");
+	set_proc_address(&impl_TexCoordP1ui,                "glTexCoordP1ui");
+	set_proc_address(&impl_TexCoordP1uiv,               "glTexCoordP1uiv");
+	set_proc_address(&impl_TexCoordP2ui,                "glTexCoordP2ui");
+	set_proc_address(&impl_TexCoordP2uiv,               "glTexCoordP2uiv");
+	set_proc_address(&impl_TexCoordP3ui,                "glTexCoordP3ui");
+	set_proc_address(&impl_TexCoordP3uiv,               "glTexCoordP3uiv");
+	set_proc_address(&impl_TexCoordP4ui,                "glTexCoordP4ui");
+	set_proc_address(&impl_TexCoordP4uiv,               "glTexCoordP4uiv");
+	set_proc_address(&impl_MultiTexCoordP1ui,           "glMultiTexCoordP1ui");
+	set_proc_address(&impl_MultiTexCoordP1uiv,          "glMultiTexCoordP1uiv");
+	set_proc_address(&impl_MultiTexCoordP2ui,           "glMultiTexCoordP2ui");
+	set_proc_address(&impl_MultiTexCoordP2uiv,          "glMultiTexCoordP2uiv");
+	set_proc_address(&impl_MultiTexCoordP3ui,           "glMultiTexCoordP3ui");
+	set_proc_address(&impl_MultiTexCoordP3uiv,          "glMultiTexCoordP3uiv");
+	set_proc_address(&impl_MultiTexCoordP4ui,           "glMultiTexCoordP4ui");
+	set_proc_address(&impl_MultiTexCoordP4uiv,          "glMultiTexCoordP4uiv");
+	set_proc_address(&impl_NormalP3ui,                  "glNormalP3ui");
+	set_proc_address(&impl_NormalP3uiv,                 "glNormalP3uiv");
+	set_proc_address(&impl_ColorP3ui,                   "glColorP3ui");
+	set_proc_address(&impl_ColorP3uiv,                  "glColorP3uiv");
+	set_proc_address(&impl_ColorP4ui,                   "glColorP4ui");
+	set_proc_address(&impl_ColorP4uiv,                  "glColorP4uiv");
+	set_proc_address(&impl_SecondaryColorP3ui,          "glSecondaryColorP3ui");
+	set_proc_address(&impl_SecondaryColorP3uiv,         "glSecondaryColorP3uiv");
+}
+
+
+// VERSION_4_0
+impl_MinSampleShading:               proc "c" (value: f32);
+impl_BlendEquationi:                 proc "c" (buf: u32, mode: u32);
+impl_BlendEquationSeparatei:         proc "c" (buf: u32, modeRGB: u32, modeAlpha: u32);
+impl_BlendFunci:                     proc "c" (buf: u32, src: u32, dst: u32);
+impl_BlendFuncSeparatei:             proc "c" (buf: u32, srcRGB: u32, dstRGB: u32, srcAlpha: u32, dstAlpha: u32);
+impl_DrawArraysIndirect:             proc "c" (mode: u32, indirect: rawptr);
+impl_DrawElementsIndirect:           proc "c" (mode: u32, type: u32, indirect: rawptr);
+impl_Uniform1d:                      proc "c" (location: i32, x: f64);
+impl_Uniform2d:                      proc "c" (location: i32, x: f64, y: f64);
+impl_Uniform3d:                      proc "c" (location: i32, x: f64, y: f64, z: f64);
+impl_Uniform4d:                      proc "c" (location: i32, x: f64, y: f64, z: f64, w: f64);
+impl_Uniform1dv:                     proc "c" (location: i32, count: i32, value: [^]f64);
+impl_Uniform2dv:                     proc "c" (location: i32, count: i32, value: [^]f64);
+impl_Uniform3dv:                     proc "c" (location: i32, count: i32, value: [^]f64);
+impl_Uniform4dv:                     proc "c" (location: i32, count: i32, value: [^]f64);
+impl_UniformMatrix2dv:               proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_UniformMatrix3dv:               proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_UniformMatrix4dv:               proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_UniformMatrix2x3dv:             proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_UniformMatrix2x4dv:             proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_UniformMatrix3x2dv:             proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_UniformMatrix3x4dv:             proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_UniformMatrix4x2dv:             proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_UniformMatrix4x3dv:             proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_GetUniformdv:                   proc "c" (program: u32, location: i32, params: [^]f64);
+impl_GetSubroutineUniformLocation:   proc "c" (program: u32, shadertype: u32, name: cstring) -> i32;
+impl_GetSubroutineIndex:             proc "c" (program: u32, shadertype: u32, name: cstring) -> u32;
+impl_GetActiveSubroutineUniformiv:   proc "c" (program: u32, shadertype: u32, index: u32, pname: u32, values: ^i32);
+impl_GetActiveSubroutineUniformName: proc "c" (program: u32, shadertype: u32, index: u32, bufsize: i32, length: ^i32, name: [^]u8);
+impl_GetActiveSubroutineName:        proc "c" (program: u32, shadertype: u32, index: u32, bufsize: i32, length: ^i32, name: [^]u8);
+impl_UniformSubroutinesuiv:          proc "c" (shadertype: u32, count: i32, indices: ^u32);
+impl_GetUniformSubroutineuiv:        proc "c" (shadertype: u32, location: i32, params: [^]u32);
+impl_GetProgramStageiv:              proc "c" (program: u32, shadertype: u32, pname: u32, values: ^i32);
+impl_PatchParameteri:                proc "c" (pname: u32, value: i32);
+impl_PatchParameterfv:               proc "c" (pname: u32, values: ^f32);
+impl_BindTransformFeedback:          proc "c" (target: u32, id: u32);
+impl_DeleteTransformFeedbacks:       proc "c" (n: i32, ids: [^]u32);
+impl_GenTransformFeedbacks:          proc "c" (n: i32, ids: [^]u32);
+impl_IsTransformFeedback:            proc "c" (id: u32) -> bool;
+impl_PauseTransformFeedback:         proc "c" ();
+impl_ResumeTransformFeedback:        proc "c" ();
+impl_DrawTransformFeedback:          proc "c" (mode: u32, id: u32);
+impl_DrawTransformFeedbackStream:    proc "c" (mode: u32, id: u32, stream: u32);
+impl_BeginQueryIndexed:              proc "c" (target: u32, index: u32, id: u32);
+impl_EndQueryIndexed:                proc "c" (target: u32, index: u32);
+impl_GetQueryIndexediv:              proc "c" (target: u32, index: u32, pname: u32, params: [^]i32);
+
+load_4_0 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_MinSampleShading,               "glMinSampleShading");
+	set_proc_address(&impl_BlendEquationi,                 "glBlendEquationi");
+	set_proc_address(&impl_BlendEquationSeparatei,         "glBlendEquationSeparatei");
+	set_proc_address(&impl_BlendFunci,                     "glBlendFunci");
+	set_proc_address(&impl_BlendFuncSeparatei,             "glBlendFuncSeparatei");
+	set_proc_address(&impl_DrawArraysIndirect,             "glDrawArraysIndirect");
+	set_proc_address(&impl_DrawElementsIndirect,           "glDrawElementsIndirect");
+	set_proc_address(&impl_Uniform1d,                      "glUniform1d");
+	set_proc_address(&impl_Uniform2d,                      "glUniform2d");
+	set_proc_address(&impl_Uniform3d,                      "glUniform3d");
+	set_proc_address(&impl_Uniform4d,                      "glUniform4d");
+	set_proc_address(&impl_Uniform1dv,                     "glUniform1dv");
+	set_proc_address(&impl_Uniform2dv,                     "glUniform2dv");
+	set_proc_address(&impl_Uniform3dv,                     "glUniform3dv");
+	set_proc_address(&impl_Uniform4dv,                     "glUniform4dv");
+	set_proc_address(&impl_UniformMatrix2dv,               "glUniformMatrix2dv");
+	set_proc_address(&impl_UniformMatrix3dv,               "glUniformMatrix3dv");
+	set_proc_address(&impl_UniformMatrix4dv,               "glUniformMatrix4dv");
+	set_proc_address(&impl_UniformMatrix2x3dv,             "glUniformMatrix2x3dv");
+	set_proc_address(&impl_UniformMatrix2x4dv,             "glUniformMatrix2x4dv");
+	set_proc_address(&impl_UniformMatrix3x2dv,             "glUniformMatrix3x2dv");
+	set_proc_address(&impl_UniformMatrix3x4dv,             "glUniformMatrix3x4dv");
+	set_proc_address(&impl_UniformMatrix4x2dv,             "glUniformMatrix4x2dv");
+	set_proc_address(&impl_UniformMatrix4x3dv,             "glUniformMatrix4x3dv");
+	set_proc_address(&impl_GetUniformdv,                   "glGetUniformdv");
+	set_proc_address(&impl_GetSubroutineUniformLocation,   "glGetSubroutineUniformLocation");
+	set_proc_address(&impl_GetSubroutineIndex,             "glGetSubroutineIndex");
+	set_proc_address(&impl_GetActiveSubroutineUniformiv,   "glGetActiveSubroutineUniformiv");
+	set_proc_address(&impl_GetActiveSubroutineUniformName, "glGetActiveSubroutineUniformName");
+	set_proc_address(&impl_GetActiveSubroutineName,        "glGetActiveSubroutineName");
+	set_proc_address(&impl_UniformSubroutinesuiv,          "glUniformSubroutinesuiv");
+	set_proc_address(&impl_GetUniformSubroutineuiv,        "glGetUniformSubroutineuiv");
+	set_proc_address(&impl_GetProgramStageiv,              "glGetProgramStageiv");
+	set_proc_address(&impl_PatchParameteri,                "glPatchParameteri");
+	set_proc_address(&impl_PatchParameterfv,               "glPatchParameterfv");
+	set_proc_address(&impl_BindTransformFeedback,          "glBindTransformFeedback");
+	set_proc_address(&impl_DeleteTransformFeedbacks,       "glDeleteTransformFeedbacks");
+	set_proc_address(&impl_GenTransformFeedbacks,          "glGenTransformFeedbacks");
+	set_proc_address(&impl_IsTransformFeedback,            "glIsTransformFeedback");
+	set_proc_address(&impl_PauseTransformFeedback,         "glPauseTransformFeedback");
+	set_proc_address(&impl_ResumeTransformFeedback,        "glResumeTransformFeedback");
+	set_proc_address(&impl_DrawTransformFeedback,          "glDrawTransformFeedback");
+	set_proc_address(&impl_DrawTransformFeedbackStream,    "glDrawTransformFeedbackStream");
+	set_proc_address(&impl_BeginQueryIndexed,              "glBeginQueryIndexed");
+	set_proc_address(&impl_EndQueryIndexed,                "glEndQueryIndexed");
+	set_proc_address(&impl_GetQueryIndexediv,              "glGetQueryIndexediv");
+}
+
+
+// VERSION_4_1
+impl_ReleaseShaderCompiler:     proc "c" ();
+impl_ShaderBinary:              proc "c" (count: i32, shaders: ^u32, binaryformat: u32, binary: rawptr, length: i32);
+impl_GetShaderPrecisionFormat:  proc "c" (shadertype: u32, precisiontype: u32, range: ^i32, precision: ^i32);
+impl_DepthRangef:               proc "c" (n: f32, f: f32);
+impl_ClearDepthf:               proc "c" (d: f32);
+impl_GetProgramBinary:          proc "c" (program: u32, bufSize: i32, length: ^i32, binaryFormat: ^u32, binary: rawptr);
+impl_ProgramBinary:             proc "c" (program: u32, binaryFormat: u32, binary: rawptr, length: i32);
+impl_ProgramParameteri:         proc "c" (program: u32, pname: u32, value: i32);
+impl_UseProgramStages:          proc "c" (pipeline: u32, stages: u32, program: u32);
+impl_ActiveShaderProgram:       proc "c" (pipeline: u32, program: u32);
+impl_CreateShaderProgramv:      proc "c" (type: u32, count: i32, strings: [^]cstring) -> u32;
+impl_BindProgramPipeline:       proc "c" (pipeline: u32);
+impl_DeleteProgramPipelines:    proc "c" (n: i32, pipelines: [^]u32);
+impl_GenProgramPipelines:       proc "c" (n: i32, pipelines: [^]u32);
+impl_IsProgramPipeline:         proc "c" (pipeline: u32) -> bool;
+impl_GetProgramPipelineiv:      proc "c" (pipeline: u32, pname: u32, params: [^]i32);
+impl_ProgramUniform1i:          proc "c" (program: u32, location: i32, v0: i32);
+impl_ProgramUniform1iv:         proc "c" (program: u32, location: i32, count: i32, value: [^]i32);
+impl_ProgramUniform1f:          proc "c" (program: u32, location: i32, v0: f32);
+impl_ProgramUniform1fv:         proc "c" (program: u32, location: i32, count: i32, value: [^]f32);
+impl_ProgramUniform1d:          proc "c" (program: u32, location: i32, v0: f64);
+impl_ProgramUniform1dv:         proc "c" (program: u32, location: i32, count: i32, value: [^]f64);
+impl_ProgramUniform1ui:         proc "c" (program: u32, location: i32, v0: u32);
+impl_ProgramUniform1uiv:        proc "c" (program: u32, location: i32, count: i32, value: [^]u32);
+impl_ProgramUniform2i:          proc "c" (program: u32, location: i32, v0: i32, v1: i32);
+impl_ProgramUniform2iv:         proc "c" (program: u32, location: i32, count: i32, value: [^]i32);
+impl_ProgramUniform2f:          proc "c" (program: u32, location: i32, v0: f32, v1: f32);
+impl_ProgramUniform2fv:         proc "c" (program: u32, location: i32, count: i32, value: [^]f32);
+impl_ProgramUniform2d:          proc "c" (program: u32, location: i32, v0: f64, v1: f64);
+impl_ProgramUniform2dv:         proc "c" (program: u32, location: i32, count: i32, value: [^]f64);
+impl_ProgramUniform2ui:         proc "c" (program: u32, location: i32, v0: u32, v1: u32);
+impl_ProgramUniform2uiv:        proc "c" (program: u32, location: i32, count: i32, value: [^]u32);
+impl_ProgramUniform3i:          proc "c" (program: u32, location: i32, v0: i32, v1: i32, v2: i32);
+impl_ProgramUniform3iv:         proc "c" (program: u32, location: i32, count: i32, value: [^]i32);
+impl_ProgramUniform3f:          proc "c" (program: u32, location: i32, v0: f32, v1: f32, v2: f32);
+impl_ProgramUniform3fv:         proc "c" (program: u32, location: i32, count: i32, value: [^]f32);
+impl_ProgramUniform3d:          proc "c" (program: u32, location: i32, v0: f64, v1: f64, v2: f64);
+impl_ProgramUniform3dv:         proc "c" (program: u32, location: i32, count: i32, value: [^]f64);
+impl_ProgramUniform3ui:         proc "c" (program: u32, location: i32, v0: u32, v1: u32, v2: u32);
+impl_ProgramUniform3uiv:        proc "c" (program: u32, location: i32, count: i32, value: [^]u32);
+impl_ProgramUniform4i:          proc "c" (program: u32, location: i32, v0: i32, v1: i32, v2: i32, v3: i32);
+impl_ProgramUniform4iv:         proc "c" (program: u32, location: i32, count: i32, value: [^]i32);
+impl_ProgramUniform4f:          proc "c" (program: u32, location: i32, v0: f32, v1: f32, v2: f32, v3: f32);
+impl_ProgramUniform4fv:         proc "c" (program: u32, location: i32, count: i32, value: [^]f32);
+impl_ProgramUniform4d:          proc "c" (program: u32, location: i32, v0: f64, v1: f64, v2: f64, v3: f64);
+impl_ProgramUniform4dv:         proc "c" (program: u32, location: i32, count: i32, value: [^]f64);
+impl_ProgramUniform4ui:         proc "c" (program: u32, location: i32, v0: u32, v1: u32, v2: u32, v3: u32);
+impl_ProgramUniform4uiv:        proc "c" (program: u32, location: i32, count: i32, value: [^]u32);
+impl_ProgramUniformMatrix2fv:   proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_ProgramUniformMatrix3fv:   proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_ProgramUniformMatrix4fv:   proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_ProgramUniformMatrix2dv:   proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_ProgramUniformMatrix3dv:   proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_ProgramUniformMatrix4dv:   proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_ProgramUniformMatrix2x3fv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_ProgramUniformMatrix3x2fv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_ProgramUniformMatrix2x4fv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_ProgramUniformMatrix4x2fv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_ProgramUniformMatrix3x4fv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_ProgramUniformMatrix4x3fv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32);
+impl_ProgramUniformMatrix2x3dv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_ProgramUniformMatrix3x2dv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_ProgramUniformMatrix2x4dv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_ProgramUniformMatrix4x2dv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_ProgramUniformMatrix3x4dv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_ProgramUniformMatrix4x3dv: proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64);
+impl_ValidateProgramPipeline:   proc "c" (pipeline: u32);
+impl_GetProgramPipelineInfoLog: proc "c" (pipeline: u32, bufSize: i32, length: ^i32, infoLog: ^u8);
+impl_VertexAttribL1d:           proc "c" (index: u32, x: f64);
+impl_VertexAttribL2d:           proc "c" (index: u32, x: f64, y: f64);
+impl_VertexAttribL3d:           proc "c" (index: u32, x: f64, y: f64, z: f64);
+impl_VertexAttribL4d:           proc "c" (index: u32, x: f64, y: f64, z: f64, w: f64);
+impl_VertexAttribL1dv:          proc "c" (index: u32, v: ^f64);
+impl_VertexAttribL2dv:          proc "c" (index: u32, v: ^f64);
+impl_VertexAttribL3dv:          proc "c" (index: u32, v: ^f64);
+impl_VertexAttribL4dv:          proc "c" (index: u32, v: ^f64);
+impl_VertexAttribLPointer:      proc "c" (index: u32, size: i32, type: u32, stride: i32, pointer: rawptr);
+impl_GetVertexAttribLdv:        proc "c" (index: u32, pname: u32, params: [^]f64);
+impl_ViewportArrayv:            proc "c" (first: u32, count: i32, v: ^f32);
+impl_ViewportIndexedf:          proc "c" (index: u32, x: f32, y: f32, w: f32, h: f32);
+impl_ViewportIndexedfv:         proc "c" (index: u32, v: ^f32);
+impl_ScissorArrayv:             proc "c" (first: u32, count: i32, v: ^i32);
+impl_ScissorIndexed:            proc "c" (index: u32, left: i32, bottom: i32, width: i32, height: i32);
+impl_ScissorIndexedv:           proc "c" (index: u32, v: ^i32);
+impl_DepthRangeArrayv:          proc "c" (first: u32, count: i32, v: ^f64);
+impl_DepthRangeIndexed:         proc "c" (index: u32, n: f64, f: f64);
+impl_GetFloati_v:               proc "c" (target: u32, index: u32, data: ^f32);
+impl_GetDoublei_v:              proc "c" (target: u32, index: u32, data: ^f64);
+
+load_4_1 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_ReleaseShaderCompiler,     "glReleaseShaderCompiler");
+	set_proc_address(&impl_ShaderBinary,              "glShaderBinary");
+	set_proc_address(&impl_GetShaderPrecisionFormat,  "glGetShaderPrecisionFormat");
+	set_proc_address(&impl_DepthRangef,               "glDepthRangef");
+	set_proc_address(&impl_ClearDepthf,               "glClearDepthf");
+	set_proc_address(&impl_GetProgramBinary,          "glGetProgramBinary");
+	set_proc_address(&impl_ProgramBinary,             "glProgramBinary");
+	set_proc_address(&impl_ProgramParameteri,         "glProgramParameteri");
+	set_proc_address(&impl_UseProgramStages,          "glUseProgramStages");
+	set_proc_address(&impl_ActiveShaderProgram,       "glActiveShaderProgram");
+	set_proc_address(&impl_CreateShaderProgramv,      "glCreateShaderProgramv");
+	set_proc_address(&impl_BindProgramPipeline,       "glBindProgramPipeline");
+	set_proc_address(&impl_DeleteProgramPipelines,    "glDeleteProgramPipelines");
+	set_proc_address(&impl_GenProgramPipelines,       "glGenProgramPipelines");
+	set_proc_address(&impl_IsProgramPipeline,         "glIsProgramPipeline");
+	set_proc_address(&impl_GetProgramPipelineiv,      "glGetProgramPipelineiv");
+	set_proc_address(&impl_ProgramUniform1i,          "glProgramUniform1i");
+	set_proc_address(&impl_ProgramUniform1iv,         "glProgramUniform1iv");
+	set_proc_address(&impl_ProgramUniform1f,          "glProgramUniform1f");
+	set_proc_address(&impl_ProgramUniform1fv,         "glProgramUniform1fv");
+	set_proc_address(&impl_ProgramUniform1d,          "glProgramUniform1d");
+	set_proc_address(&impl_ProgramUniform1dv,         "glProgramUniform1dv");
+	set_proc_address(&impl_ProgramUniform1ui,         "glProgramUniform1ui");
+	set_proc_address(&impl_ProgramUniform1uiv,        "glProgramUniform1uiv");
+	set_proc_address(&impl_ProgramUniform2i,          "glProgramUniform2i");
+	set_proc_address(&impl_ProgramUniform2iv,         "glProgramUniform2iv");
+	set_proc_address(&impl_ProgramUniform2f,          "glProgramUniform2f");
+	set_proc_address(&impl_ProgramUniform2fv,         "glProgramUniform2fv");
+	set_proc_address(&impl_ProgramUniform2d,          "glProgramUniform2d");
+	set_proc_address(&impl_ProgramUniform2dv,         "glProgramUniform2dv");
+	set_proc_address(&impl_ProgramUniform2ui,         "glProgramUniform2ui");
+	set_proc_address(&impl_ProgramUniform2uiv,        "glProgramUniform2uiv");
+	set_proc_address(&impl_ProgramUniform3i,          "glProgramUniform3i");
+	set_proc_address(&impl_ProgramUniform3iv,         "glProgramUniform3iv");
+	set_proc_address(&impl_ProgramUniform3f,          "glProgramUniform3f");
+	set_proc_address(&impl_ProgramUniform3fv,         "glProgramUniform3fv");
+	set_proc_address(&impl_ProgramUniform3d,          "glProgramUniform3d");
+	set_proc_address(&impl_ProgramUniform3dv,         "glProgramUniform3dv");
+	set_proc_address(&impl_ProgramUniform3ui,         "glProgramUniform3ui");
+	set_proc_address(&impl_ProgramUniform3uiv,        "glProgramUniform3uiv");
+	set_proc_address(&impl_ProgramUniform4i,          "glProgramUniform4i");
+	set_proc_address(&impl_ProgramUniform4iv,         "glProgramUniform4iv");
+	set_proc_address(&impl_ProgramUniform4f,          "glProgramUniform4f");
+	set_proc_address(&impl_ProgramUniform4fv,         "glProgramUniform4fv");
+	set_proc_address(&impl_ProgramUniform4d,          "glProgramUniform4d");
+	set_proc_address(&impl_ProgramUniform4dv,         "glProgramUniform4dv");
+	set_proc_address(&impl_ProgramUniform4ui,         "glProgramUniform4ui");
+	set_proc_address(&impl_ProgramUniform4uiv,        "glProgramUniform4uiv");
+	set_proc_address(&impl_ProgramUniformMatrix2fv,   "glProgramUniformMatrix2fv");
+	set_proc_address(&impl_ProgramUniformMatrix3fv,   "glProgramUniformMatrix3fv");
+	set_proc_address(&impl_ProgramUniformMatrix4fv,   "glProgramUniformMatrix4fv");
+	set_proc_address(&impl_ProgramUniformMatrix2dv,   "glProgramUniformMatrix2dv");
+	set_proc_address(&impl_ProgramUniformMatrix3dv,   "glProgramUniformMatrix3dv");
+	set_proc_address(&impl_ProgramUniformMatrix4dv,   "glProgramUniformMatrix4dv");
+	set_proc_address(&impl_ProgramUniformMatrix2x3fv, "glProgramUniformMatrix2x3fv");
+	set_proc_address(&impl_ProgramUniformMatrix3x2fv, "glProgramUniformMatrix3x2fv");
+	set_proc_address(&impl_ProgramUniformMatrix2x4fv, "glProgramUniformMatrix2x4fv");
+	set_proc_address(&impl_ProgramUniformMatrix4x2fv, "glProgramUniformMatrix4x2fv");
+	set_proc_address(&impl_ProgramUniformMatrix3x4fv, "glProgramUniformMatrix3x4fv");
+	set_proc_address(&impl_ProgramUniformMatrix4x3fv, "glProgramUniformMatrix4x3fv");
+	set_proc_address(&impl_ProgramUniformMatrix2x3dv, "glProgramUniformMatrix2x3dv");
+	set_proc_address(&impl_ProgramUniformMatrix3x2dv, "glProgramUniformMatrix3x2dv");
+	set_proc_address(&impl_ProgramUniformMatrix2x4dv, "glProgramUniformMatrix2x4dv");
+	set_proc_address(&impl_ProgramUniformMatrix4x2dv, "glProgramUniformMatrix4x2dv");
+	set_proc_address(&impl_ProgramUniformMatrix3x4dv, "glProgramUniformMatrix3x4dv");
+	set_proc_address(&impl_ProgramUniformMatrix4x3dv, "glProgramUniformMatrix4x3dv");
+	set_proc_address(&impl_ValidateProgramPipeline,   "glValidateProgramPipeline");
+	set_proc_address(&impl_GetProgramPipelineInfoLog, "glGetProgramPipelineInfoLog");
+	set_proc_address(&impl_VertexAttribL1d,           "glVertexAttribL1d");
+	set_proc_address(&impl_VertexAttribL2d,           "glVertexAttribL2d");
+	set_proc_address(&impl_VertexAttribL3d,           "glVertexAttribL3d");
+	set_proc_address(&impl_VertexAttribL4d,           "glVertexAttribL4d");
+	set_proc_address(&impl_VertexAttribL1dv,          "glVertexAttribL1dv");
+	set_proc_address(&impl_VertexAttribL2dv,          "glVertexAttribL2dv");
+	set_proc_address(&impl_VertexAttribL3dv,          "glVertexAttribL3dv");
+	set_proc_address(&impl_VertexAttribL4dv,          "glVertexAttribL4dv");
+	set_proc_address(&impl_VertexAttribLPointer,      "glVertexAttribLPointer");
+	set_proc_address(&impl_GetVertexAttribLdv,        "glGetVertexAttribLdv");
+	set_proc_address(&impl_ViewportArrayv,            "glViewportArrayv");
+	set_proc_address(&impl_ViewportIndexedf,          "glViewportIndexedf");
+	set_proc_address(&impl_ViewportIndexedfv,         "glViewportIndexedfv");
+	set_proc_address(&impl_ScissorArrayv,             "glScissorArrayv");
+	set_proc_address(&impl_ScissorIndexed,            "glScissorIndexed");
+	set_proc_address(&impl_ScissorIndexedv,           "glScissorIndexedv");
+	set_proc_address(&impl_DepthRangeArrayv,          "glDepthRangeArrayv");
+	set_proc_address(&impl_DepthRangeIndexed,         "glDepthRangeIndexed");
+	set_proc_address(&impl_GetFloati_v,               "glGetFloati_v");
+	set_proc_address(&impl_GetDoublei_v,              "glGetDoublei_v");
+}
+
+
+// VERSION_4_2
+impl_DrawArraysInstancedBaseInstance:             proc "c" (mode: u32, first: i32, count: i32, instancecount: i32, baseinstance: u32);
+impl_DrawElementsInstancedBaseInstance:           proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32, baseinstance: u32);
+impl_DrawElementsInstancedBaseVertexBaseInstance: proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32, basevertex: i32, baseinstance: u32);
+impl_GetInternalformativ:                         proc "c" (target: u32, internalformat: u32, pname: u32, bufSize: i32, params: [^]i32);
+impl_GetActiveAtomicCounterBufferiv:              proc "c" (program: u32, bufferIndex: u32, pname: u32, params: [^]i32);
+impl_BindImageTexture:                            proc "c" (unit: u32, texture: u32, level: i32, layered: u8, layer: i32, access: u32, format: u32);
+impl_MemoryBarrier:                               proc "c" (barriers: u32);
+impl_TexStorage1D:                                proc "c" (target: u32, levels: i32, internalformat: u32, width: i32);
+impl_TexStorage2D:                                proc "c" (target: u32, levels: i32, internalformat: u32, width: i32, height: i32);
+impl_TexStorage3D:                                proc "c" (target: u32, levels: i32, internalformat: u32, width: i32, height: i32, depth: i32);
+impl_DrawTransformFeedbackInstanced:              proc "c" (mode: u32, id: u32, instancecount: i32);
+impl_DrawTransformFeedbackStreamInstanced:        proc "c" (mode: u32, id: u32, stream: u32, instancecount: i32);
+
+load_4_2 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_DrawArraysInstancedBaseInstance,             "glDrawArraysInstancedBaseInstance");
+	set_proc_address(&impl_DrawElementsInstancedBaseInstance,           "glDrawElementsInstancedBaseInstance");
+	set_proc_address(&impl_DrawElementsInstancedBaseVertexBaseInstance, "glDrawElementsInstancedBaseVertexBaseInstance");
+	set_proc_address(&impl_GetInternalformativ,                         "glGetInternalformativ");
+	set_proc_address(&impl_GetActiveAtomicCounterBufferiv,              "glGetActiveAtomicCounterBufferiv");
+	set_proc_address(&impl_BindImageTexture,                            "glBindImageTexture");
+	set_proc_address(&impl_MemoryBarrier,                               "glMemoryBarrier");
+	set_proc_address(&impl_TexStorage1D,                                "glTexStorage1D");
+	set_proc_address(&impl_TexStorage2D,                                "glTexStorage2D");
+	set_proc_address(&impl_TexStorage3D,                                "glTexStorage3D");
+	set_proc_address(&impl_DrawTransformFeedbackInstanced,              "glDrawTransformFeedbackInstanced");
+	set_proc_address(&impl_DrawTransformFeedbackStreamInstanced,        "glDrawTransformFeedbackStreamInstanced");
+}
+
+// VERSION_4_3
+impl_ClearBufferData:                 proc "c" (target: u32, internalformat: u32, format: u32, type: u32, data: rawptr);
+impl_ClearBufferSubData:              proc "c" (target: u32, internalformat: u32, offset: int, size: int, format: u32, type: u32, data: rawptr);
+impl_DispatchCompute:                 proc "c" (num_groups_x: u32, num_groups_y: u32, num_groups_z: u32);
+impl_DispatchComputeIndirect:         proc "c" (indirect: int);
+impl_CopyImageSubData:                proc "c" (srcName: u32, srcTarget: u32, srcLevel: i32, srcX: i32, srcY: i32, srcZ: i32, dstName: u32, dstTarget: u32, dstLevel: i32, dstX: i32, dstY: i32, dstZ: i32, srcWidth: i32, srcHeight: i32, srcDepth: i32);
+impl_FramebufferParameteri:           proc "c" (target: u32, pname: u32, param: i32);
+impl_GetFramebufferParameteriv:       proc "c" (target: u32, pname: u32, params: [^]i32);
+impl_GetInternalformati64v:           proc "c" (target: u32, internalformat: u32, pname: u32, bufSize: i32, params: [^]i64);
+impl_InvalidateTexSubImage:           proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32);
+impl_InvalidateTexImage:              proc "c" (texture: u32, level: i32);
+impl_InvalidateBufferSubData:         proc "c" (buffer: u32, offset: int, length: int);
+impl_InvalidateBufferData:            proc "c" (buffer: u32);
+impl_InvalidateFramebuffer:           proc "c" (target: u32, numAttachments: i32, attachments: ^u32);
+impl_InvalidateSubFramebuffer:        proc "c" (target: u32, numAttachments: i32, attachments: ^u32, x: i32, y: i32, width: i32, height: i32);
+impl_MultiDrawArraysIndirect:         proc "c" (mode: u32, indirect: rawptr, drawcount: i32, stride: i32);
+impl_MultiDrawElementsIndirect:       proc "c" (mode: u32, type: u32, indirect: rawptr, drawcount: i32, stride: i32);
+impl_GetProgramInterfaceiv:           proc "c" (program: u32, programInterface: u32, pname: u32, params: [^]i32);
+impl_GetProgramResourceIndex:         proc "c" (program: u32, programInterface: u32, name: cstring) -> u32;
+impl_GetProgramResourceName:          proc "c" (program: u32, programInterface: u32, index: u32, bufSize: i32, length: ^i32, name: [^]u8);
+impl_GetProgramResourceiv:            proc "c" (program: u32, programInterface: u32, index: u32, propCount: i32, props: ^u32, bufSize: i32, length: ^i32, params: [^]i32);
+impl_GetProgramResourceLocation:      proc "c" (program: u32, programInterface: u32, name: cstring) -> i32;
+impl_GetProgramResourceLocationIndex: proc "c" (program: u32, programInterface: u32, name: cstring) -> i32;
+impl_ShaderStorageBlockBinding:       proc "c" (program: u32, storageBlockIndex: u32, storageBlockBinding: u32);
+impl_TexBufferRange:                  proc "c" (target: u32, internalformat: u32, buffer: u32, offset: int, size: int);
+impl_TexStorage2DMultisample:         proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: u8);
+impl_TexStorage3DMultisample:         proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: u8);
+impl_TextureView:                     proc "c" (texture: u32, target: u32, origtexture: u32, internalformat: u32, minlevel: u32, numlevels: u32, minlayer: u32, numlayers: u32);
+impl_BindVertexBuffer:                proc "c" (bindingindex: u32, buffer: u32, offset: int, stride: i32);
+impl_VertexAttribFormat:              proc "c" (attribindex: u32, size: i32, type: u32, normalized: bool, relativeoffset: u32);
+impl_VertexAttribIFormat:             proc "c" (attribindex: u32, size: i32, type: u32, relativeoffset: u32);
+impl_VertexAttribLFormat:             proc "c" (attribindex: u32, size: i32, type: u32, relativeoffset: u32);
+impl_VertexAttribBinding:             proc "c" (attribindex: u32, bindingindex: u32);
+impl_VertexBindingDivisor:            proc "c" (bindingindex: u32, divisor: u32);
+impl_DebugMessageControl:             proc "c" (source: u32, type: u32, severity: u32, count: i32, ids: ^u32, enabled: u8);
+impl_DebugMessageInsert:              proc "c" (source: u32, type: u32, id: u32, severity: u32, length: i32, buf: ^u8);
+impl_DebugMessageCallback:            proc "c" (callback: debug_proc_t, userParam: rawptr);
+impl_GetDebugMessageLog:              proc "c" (count: u32, bufSize: i32, sources: [^]u32, types: [^]u32, ids: [^]u32, severities: [^]u32, lengths: [^]i32, messageLog: [^]u8) -> u32;
+impl_PushDebugGroup:                  proc "c" (source: u32, id: u32, length: i32, message: cstring);
+impl_PopDebugGroup:                   proc "c" ();
+impl_ObjectLabel:                     proc "c" (identifier: u32, name: u32, length: i32, label: [^]u8);
+impl_GetObjectLabel:                  proc "c" (identifier: u32, name: u32, bufSize: i32, length: ^i32, label: [^]u8);
+impl_ObjectPtrLabel:                  proc "c" (ptr: rawptr, length: i32, label: [^]u8);
+impl_GetObjectPtrLabel:               proc "c" (ptr: rawptr, bufSize: i32, length: ^i32, label: [^]u8);
+
+load_4_3 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_ClearBufferData,                 "glClearBufferData");
+	set_proc_address(&impl_ClearBufferSubData,              "glClearBufferSubData");
+	set_proc_address(&impl_DispatchCompute,                 "glDispatchCompute");
+	set_proc_address(&impl_DispatchComputeIndirect,         "glDispatchComputeIndirect");
+	set_proc_address(&impl_CopyImageSubData,                "glCopyImageSubData");
+	set_proc_address(&impl_FramebufferParameteri,           "glFramebufferParameteri");
+	set_proc_address(&impl_GetFramebufferParameteriv,       "glGetFramebufferParameteriv");
+	set_proc_address(&impl_GetInternalformati64v,           "glGetInternalformati64v");
+	set_proc_address(&impl_InvalidateTexSubImage,           "glInvalidateTexSubImage");
+	set_proc_address(&impl_InvalidateTexImage,              "glInvalidateTexImage");
+	set_proc_address(&impl_InvalidateBufferSubData,         "glInvalidateBufferSubData");
+	set_proc_address(&impl_InvalidateBufferData,            "glInvalidateBufferData");
+	set_proc_address(&impl_InvalidateFramebuffer,           "glInvalidateFramebuffer");
+	set_proc_address(&impl_InvalidateSubFramebuffer,        "glInvalidateSubFramebuffer");
+	set_proc_address(&impl_MultiDrawArraysIndirect,         "glMultiDrawArraysIndirect");
+	set_proc_address(&impl_MultiDrawElementsIndirect,       "glMultiDrawElementsIndirect");
+	set_proc_address(&impl_GetProgramInterfaceiv,           "glGetProgramInterfaceiv");
+	set_proc_address(&impl_GetProgramResourceIndex,         "glGetProgramResourceIndex");
+	set_proc_address(&impl_GetProgramResourceName,          "glGetProgramResourceName");
+	set_proc_address(&impl_GetProgramResourceiv,            "glGetProgramResourceiv");
+	set_proc_address(&impl_GetProgramResourceLocation,      "glGetProgramResourceLocation");
+	set_proc_address(&impl_GetProgramResourceLocationIndex, "glGetProgramResourceLocationIndex");
+	set_proc_address(&impl_ShaderStorageBlockBinding,       "glShaderStorageBlockBinding");
+	set_proc_address(&impl_TexBufferRange,                  "glTexBufferRange");
+	set_proc_address(&impl_TexStorage2DMultisample,         "glTexStorage2DMultisample");
+	set_proc_address(&impl_TexStorage3DMultisample,         "glTexStorage3DMultisample");
+	set_proc_address(&impl_TextureView,                     "glTextureView");
+	set_proc_address(&impl_BindVertexBuffer,                "glBindVertexBuffer");
+	set_proc_address(&impl_VertexAttribFormat,              "glVertexAttribFormat");
+	set_proc_address(&impl_VertexAttribIFormat,             "glVertexAttribIFormat");
+	set_proc_address(&impl_VertexAttribLFormat,             "glVertexAttribLFormat");
+	set_proc_address(&impl_VertexAttribBinding,             "glVertexAttribBinding");
+	set_proc_address(&impl_VertexBindingDivisor,            "glVertexBindingDivisor");
+	set_proc_address(&impl_DebugMessageControl,             "glDebugMessageControl");
+	set_proc_address(&impl_DebugMessageInsert,              "glDebugMessageInsert");
+	set_proc_address(&impl_DebugMessageCallback,            "glDebugMessageCallback");
+	set_proc_address(&impl_GetDebugMessageLog,              "glGetDebugMessageLog");
+	set_proc_address(&impl_PushDebugGroup,                  "glPushDebugGroup");
+	set_proc_address(&impl_PopDebugGroup,                   "glPopDebugGroup");
+	set_proc_address(&impl_ObjectLabel,                     "glObjectLabel");
+	set_proc_address(&impl_GetObjectLabel,                  "glGetObjectLabel");
+	set_proc_address(&impl_ObjectPtrLabel,                  "glObjectPtrLabel");
+	set_proc_address(&impl_GetObjectPtrLabel,               "glGetObjectPtrLabel");
+}
+
+// VERSION_4_4
+impl_BufferStorage:     proc "c" (target: u32, size: int, data: rawptr, flags: u32);
+impl_ClearTexImage:     proc "c" (texture: u32, level: i32, format: u32, type: u32, data: rawptr);
+impl_ClearTexSubImage:  proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, data: rawptr);
+impl_BindBuffersBase:   proc "c" (target: u32, first: u32, count: i32, buffers: [^]u32);
+impl_BindBuffersRange:  proc "c" (target: u32, first: u32, count: i32, buffers: [^]u32, offsets: [^]uintptr, sizes: [^]int);
+impl_BindTextures:      proc "c" (first: u32, count: i32, textures: [^]u32);
+impl_BindSamplers:      proc "c" (first: u32, count: i32, samplers: [^]u32);
+impl_BindImageTextures: proc "c" (first: u32, count: i32, textures: [^]u32);
+impl_BindVertexBuffers: proc "c" (first: u32, count: i32, buffers: [^]u32, offsets: [^]uintptr, strides: [^]i32);
+
+load_4_4 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_BufferStorage,     "glBufferStorage");
+	set_proc_address(&impl_ClearTexImage,     "glClearTexImage");
+	set_proc_address(&impl_ClearTexSubImage,  "glClearTexSubImage");
+	set_proc_address(&impl_BindBuffersBase,   "glBindBuffersBase");
+	set_proc_address(&impl_BindBuffersRange,  "glBindBuffersRange");
+	set_proc_address(&impl_BindTextures,      "glBindTextures");
+	set_proc_address(&impl_BindSamplers,      "glBindSamplers");
+	set_proc_address(&impl_BindImageTextures, "glBindImageTextures");
+	set_proc_address(&impl_BindVertexBuffers, "glBindVertexBuffers");
+}
+
+// VERSION_4_5
+impl_ClipControl:                              proc "c" (origin: u32, depth: u32);
+impl_CreateTransformFeedbacks:                 proc "c" (n: i32, ids: [^]u32);
+impl_TransformFeedbackBufferBase:              proc "c" (xfb: u32, index: u32, buffer: u32);
+impl_TransformFeedbackBufferRange:             proc "c" (xfb: u32, index: u32, buffer: u32, offset: int, size: int);
+impl_GetTransformFeedbackiv:                   proc "c" (xfb: u32, pname: u32, param: ^i32);
+impl_GetTransformFeedbacki_v:                  proc "c" (xfb: u32, pname: u32, index: u32, param: ^i32);
+impl_GetTransformFeedbacki64_v:                proc "c" (xfb: u32, pname: u32, index: u32, param: ^i64);
+impl_CreateBuffers:                            proc "c" (n: i32, buffers: [^]u32);
+impl_NamedBufferStorage:                       proc "c" (buffer: u32, size: int, data: rawptr, flags: u32);
+impl_NamedBufferData:                          proc "c" (buffer: u32, size: int, data: rawptr, usage: u32);
+impl_NamedBufferSubData:                       proc "c" (buffer: u32, offset: int, size: int, data: rawptr);
+impl_CopyNamedBufferSubData:                   proc "c" (readBuffer: u32, writeBuffer: u32, readOffset: int, writeOffset: int, size: int);
+impl_ClearNamedBufferData:                     proc "c" (buffer: u32, internalformat: u32, format: u32, type: u32, data: rawptr);
+impl_ClearNamedBufferSubData:                  proc "c" (buffer: u32, internalformat: u32, offset: int, size: int, format: u32, type: u32, data: rawptr);
+impl_MapNamedBuffer:                           proc "c" (buffer: u32, access: u32) -> rawptr;
+impl_MapNamedBufferRange:                      proc "c" (buffer: u32, offset: int, length: int, access: u32) -> rawptr;
+impl_UnmapNamedBuffer:                         proc "c" (buffer: u32) -> bool;
+impl_FlushMappedNamedBufferRange:              proc "c" (buffer: u32, offset: int, length: int);
+impl_GetNamedBufferParameteriv:                proc "c" (buffer: u32, pname: u32, params: [^]i32);
+impl_GetNamedBufferParameteri64v:              proc "c" (buffer: u32, pname: u32, params: [^]i64);
+impl_GetNamedBufferPointerv:                   proc "c" (buffer: u32, pname: u32, params: [^]rawptr);
+impl_GetNamedBufferSubData:                    proc "c" (buffer: u32, offset: int, size: int, data: rawptr);
+impl_CreateFramebuffers:                       proc "c" (n: i32, framebuffers: [^]u32);
+impl_NamedFramebufferRenderbuffer:             proc "c" (framebuffer: u32, attachment: u32, renderbuffertarget: u32, renderbuffer: u32);
+impl_NamedFramebufferParameteri:               proc "c" (framebuffer: u32, pname: u32, param: i32);
+impl_NamedFramebufferTexture:                  proc "c" (framebuffer: u32, attachment: u32, texture: u32, level: i32);
+impl_NamedFramebufferTextureLayer:             proc "c" (framebuffer: u32, attachment: u32, texture: u32, level: i32, layer: i32);
+impl_NamedFramebufferDrawBuffer:               proc "c" (framebuffer: u32, buf: u32);
+impl_NamedFramebufferDrawBuffers:              proc "c" (framebuffer: u32, n: i32, bufs: ^u32);
+impl_NamedFramebufferReadBuffer:               proc "c" (framebuffer: u32, src: u32);
+impl_InvalidateNamedFramebufferData:           proc "c" (framebuffer: u32, numAttachments: i32, attachments: ^u32);
+impl_InvalidateNamedFramebufferSubData:        proc "c" (framebuffer: u32, numAttachments: i32, attachments: ^u32, x: i32, y: i32, width: i32, height: i32);
+impl_ClearNamedFramebufferiv:                  proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, value: ^i32);
+impl_ClearNamedFramebufferuiv:                 proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, value: ^u32);
+impl_ClearNamedFramebufferfv:                  proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, value: ^f32);
+impl_ClearNamedFramebufferfi:                  proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, depth: f32, stencil: i32);
+impl_BlitNamedFramebuffer:                     proc "c" (readFramebuffer: u32, drawFramebuffer: u32, srcX0: i32, srcY0: i32, srcX1: i32, srcY1: i32, dstX0: i32, dstY0: i32, dstX1: i32, dstY1: i32, mask: u32, filter: u32);
+impl_CheckNamedFramebufferStatus:              proc "c" (framebuffer: u32, target: u32) -> u32;
+impl_GetNamedFramebufferParameteriv:           proc "c" (framebuffer: u32, pname: u32, param: ^i32);
+impl_GetNamedFramebufferAttachmentParameteriv: proc "c" (framebuffer: u32, attachment: u32, pname: u32, params: [^]i32);
+impl_CreateRenderbuffers:                      proc "c" (n: i32, renderbuffers: [^]u32);
+impl_NamedRenderbufferStorage:                 proc "c" (renderbuffer: u32, internalformat: u32, width: i32, height: i32);
+impl_NamedRenderbufferStorageMultisample:      proc "c" (renderbuffer: u32, samples: i32, internalformat: u32, width: i32, height: i32);
+impl_GetNamedRenderbufferParameteriv:          proc "c" (renderbuffer: u32, pname: u32, params: [^]i32);
+impl_CreateTextures:                           proc "c" (target: u32, n: i32, textures: [^]u32);
+impl_TextureBuffer:                            proc "c" (texture: u32, internalformat: u32, buffer: u32);
+impl_TextureBufferRange:                       proc "c" (texture: u32, internalformat: u32, buffer: u32, offset: int, size: int);
+impl_TextureStorage1D:                         proc "c" (texture: u32, levels: i32, internalformat: u32, width: i32);
+impl_TextureStorage2D:                         proc "c" (texture: u32, levels: i32, internalformat: u32, width: i32, height: i32);
+impl_TextureStorage3D:                         proc "c" (texture: u32, levels: i32, internalformat: u32, width: i32, height: i32, depth: i32);
+impl_TextureStorage2DMultisample:              proc "c" (texture: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: u8);
+impl_TextureStorage3DMultisample:              proc "c" (texture: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: u8);
+impl_TextureSubImage1D:                        proc "c" (texture: u32, level: i32, xoffset: i32, width: i32, format: u32, type: u32, pixels: rawptr);
+impl_TextureSubImage2D:                        proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, type: u32, pixels: rawptr);
+impl_TextureSubImage3D:                        proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, pixels: rawptr);
+impl_CompressedTextureSubImage1D:              proc "c" (texture: u32, level: i32, xoffset: i32, width: i32, format: u32, imageSize: i32, data: rawptr);
+impl_CompressedTextureSubImage2D:              proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, imageSize: i32, data: rawptr);
+impl_CompressedTextureSubImage3D:              proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, imageSize: i32, data: rawptr);
+impl_CopyTextureSubImage1D:                    proc "c" (texture: u32, level: i32, xoffset: i32, x: i32, y: i32, width: i32);
+impl_CopyTextureSubImage2D:                    proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, x: i32, y: i32, width: i32, height: i32);
+impl_CopyTextureSubImage3D:                    proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, x: i32, y: i32, width: i32, height: i32);
+impl_TextureParameterf:                        proc "c" (texture: u32, pname: u32, param: f32);
+impl_TextureParameterfv:                       proc "c" (texture: u32, pname: u32, param: ^f32);
+impl_TextureParameteri:                        proc "c" (texture: u32, pname: u32, param: i32);
+impl_TextureParameterIiv:                      proc "c" (texture: u32, pname: u32, params: [^]i32);
+impl_TextureParameterIuiv:                     proc "c" (texture: u32, pname: u32, params: [^]u32);
+impl_TextureParameteriv:                       proc "c" (texture: u32, pname: u32, param: ^i32);
+impl_GenerateTextureMipmap:                    proc "c" (texture: u32);
+impl_BindTextureUnit:                          proc "c" (unit: u32, texture: u32);
+impl_GetTextureImage:                          proc "c" (texture: u32, level: i32, format: u32, type: u32, bufSize: i32, pixels: rawptr);
+impl_GetCompressedTextureImage:                proc "c" (texture: u32, level: i32, bufSize: i32, pixels: rawptr);
+impl_GetTextureLevelParameterfv:               proc "c" (texture: u32, level: i32, pname: u32, params: [^]f32);
+impl_GetTextureLevelParameteriv:               proc "c" (texture: u32, level: i32, pname: u32, params: [^]i32);
+impl_GetTextureParameterfv:                    proc "c" (texture: u32, pname: u32, params: [^]f32);
+impl_GetTextureParameterIiv:                   proc "c" (texture: u32, pname: u32, params: [^]i32);
+impl_GetTextureParameterIuiv:                  proc "c" (texture: u32, pname: u32, params: [^]u32);
+impl_GetTextureParameteriv:                    proc "c" (texture: u32, pname: u32, params: [^]i32);
+impl_CreateVertexArrays:                       proc "c" (n: i32, arrays: [^]u32);
+impl_DisableVertexArrayAttrib:                 proc "c" (vaobj: u32, index: u32);
+impl_EnableVertexArrayAttrib:                  proc "c" (vaobj: u32, index: u32);
+impl_VertexArrayElementBuffer:                 proc "c" (vaobj: u32, buffer: u32);
+impl_VertexArrayVertexBuffer:                  proc "c" (vaobj: u32, bindingindex: u32, buffer: u32, offset: int, stride: i32);
+impl_VertexArrayVertexBuffers:                 proc "c" (vaobj: u32, first: u32, count: i32, buffers: [^]u32, offsets: [^]uintptr, strides: [^]i32);
+impl_VertexArrayAttribBinding:                 proc "c" (vaobj: u32, attribindex: u32, bindingindex: u32);
+impl_VertexArrayAttribFormat:                  proc "c" (vaobj: u32, attribindex: u32, size: i32, type: u32, normalized: bool, relativeoffset: u32);
+impl_VertexArrayAttribIFormat:                 proc "c" (vaobj: u32, attribindex: u32, size: i32, type: u32, relativeoffset: u32);
+impl_VertexArrayAttribLFormat:                 proc "c" (vaobj: u32, attribindex: u32, size: i32, type: u32, relativeoffset: u32);
+impl_VertexArrayBindingDivisor:                proc "c" (vaobj: u32, bindingindex: u32, divisor: u32);
+impl_GetVertexArrayiv:                         proc "c" (vaobj: u32, pname: u32, param: ^i32);
+impl_GetVertexArrayIndexediv:                  proc "c" (vaobj: u32, index: u32, pname: u32, param: ^i32);
+impl_GetVertexArrayIndexed64iv:                proc "c" (vaobj: u32, index: u32, pname: u32, param: ^i64);
+impl_CreateSamplers:                           proc "c" (n: i32, samplers: [^]u32);
+impl_CreateProgramPipelines:                   proc "c" (n: i32, pipelines: [^]u32);
+impl_CreateQueries:                            proc "c" (target: u32, n: i32, ids: [^]u32);
+impl_GetQueryBufferObjecti64v:                 proc "c" (id: u32, buffer: u32, pname: u32, offset: int);
+impl_GetQueryBufferObjectiv:                   proc "c" (id: u32, buffer: u32, pname: u32, offset: int);
+impl_GetQueryBufferObjectui64v:                proc "c" (id: u32, buffer: u32, pname: u32, offset: int);
+impl_GetQueryBufferObjectuiv:                  proc "c" (id: u32, buffer: u32, pname: u32, offset: int);
+impl_MemoryBarrierByRegion:                    proc "c" (barriers: u32);
+impl_GetTextureSubImage:                       proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, bufSize: i32, pixels: rawptr);
+impl_GetCompressedTextureSubImage:             proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, bufSize: i32, pixels: rawptr);
+impl_GetGraphicsResetStatus:                   proc "c" () -> u32;
+impl_GetnCompressedTexImage:                   proc "c" (target: u32, lod: i32, bufSize: i32, pixels: rawptr);
+impl_GetnTexImage:                             proc "c" (target: u32, level: i32, format: u32, type: u32, bufSize: i32, pixels: rawptr);
+impl_GetnUniformdv:                            proc "c" (program: u32, location: i32, bufSize: i32, params: [^]f64);
+impl_GetnUniformfv:                            proc "c" (program: u32, location: i32, bufSize: i32, params: [^]f32);
+impl_GetnUniformiv:                            proc "c" (program: u32, location: i32, bufSize: i32, params: [^]i32);
+impl_GetnUniformuiv:                           proc "c" (program: u32, location: i32, bufSize: i32, params: [^]u32);
+impl_ReadnPixels:                              proc "c" (x: i32, y: i32, width: i32, height: i32, format: u32, type: u32, bufSize: i32, data: rawptr);
+impl_GetnMapdv:                                proc "c" (target: u32, query: u32, bufSize: i32, v: ^f64);
+impl_GetnMapfv:                                proc "c" (target: u32, query: u32, bufSize: i32, v: ^f32);
+impl_GetnMapiv:                                proc "c" (target: u32, query: u32, bufSize: i32, v: ^i32);
+impl_GetnPixelMapusv:                          proc "c" (map_: u32, bufSize: i32, values: ^u16);
+impl_GetnPixelMapfv:                           proc "c" (map_: u32, bufSize: i32, values: ^f32);
+impl_GetnPixelMapuiv:                          proc "c" (map_: u32, bufSize: i32, values: ^u32);
+impl_GetnPolygonStipple:                       proc "c" (bufSize: i32, pattern: ^u8);
+impl_GetnColorTable:                           proc "c" (target: u32, format: u32, type: u32, bufSize: i32, table: rawptr);
+impl_GetnConvolutionFilter:                    proc "c" (target: u32, format: u32, type: u32, bufSize: i32, image: rawptr);
+impl_GetnSeparableFilter:                      proc "c" (target: u32, format: u32, type: u32, rowBufSize: i32, row: rawptr, columnBufSize: i32, column: rawptr, span: rawptr);
+impl_GetnHistogram:                            proc "c" (target: u32, reset: u8, format: u32, type: u32, bufSize: i32, values: rawptr);
+impl_GetnMinmax:                               proc "c" (target: u32, reset: u8, format: u32, type: u32, bufSize: i32, values: rawptr);
+impl_TextureBarrier:                           proc "c" ();
+impl_glGetUnsignedBytevEXT:                    proc "c" (pname: u32, data: ^byte);
+impl_TexPageCommitmentARB:                     proc "c"(target: u32,
+														level: i32,
+														xoffset: i32,
+														yoffset: i32,
+														zoffset: i32,
+														width: i32,
+														height: i32,
+														depth: i32,
+														commit: bool);
+
+load_4_5 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_ClipControl,                              "glClipControl");
+	set_proc_address(&impl_CreateTransformFeedbacks,                 "glCreateTransformFeedbacks");
+	set_proc_address(&impl_TransformFeedbackBufferBase,              "glTransformFeedbackBufferBase");
+	set_proc_address(&impl_TransformFeedbackBufferRange,             "glTransformFeedbackBufferRange");
+	set_proc_address(&impl_GetTransformFeedbackiv,                   "glGetTransformFeedbackiv");
+	set_proc_address(&impl_GetTransformFeedbacki_v,                  "glGetTransformFeedbacki_v");
+	set_proc_address(&impl_GetTransformFeedbacki64_v,                "glGetTransformFeedbacki64_v");
+	set_proc_address(&impl_CreateBuffers,                            "glCreateBuffers");
+	set_proc_address(&impl_NamedBufferStorage,                       "glNamedBufferStorage");
+	set_proc_address(&impl_NamedBufferData,                          "glNamedBufferData");
+	set_proc_address(&impl_NamedBufferSubData,                       "glNamedBufferSubData");
+	set_proc_address(&impl_CopyNamedBufferSubData,                   "glCopyNamedBufferSubData");
+	set_proc_address(&impl_ClearNamedBufferData,                     "glClearNamedBufferData");
+	set_proc_address(&impl_ClearNamedBufferSubData,                  "glClearNamedBufferSubData");
+	set_proc_address(&impl_MapNamedBuffer,                           "glMapNamedBuffer");
+	set_proc_address(&impl_MapNamedBufferRange,                      "glMapNamedBufferRange");
+	set_proc_address(&impl_UnmapNamedBuffer,                         "glUnmapNamedBuffer");
+	set_proc_address(&impl_FlushMappedNamedBufferRange,              "glFlushMappedNamedBufferRange");
+	set_proc_address(&impl_GetNamedBufferParameteriv,                "glGetNamedBufferParameteriv");
+	set_proc_address(&impl_GetNamedBufferParameteri64v,              "glGetNamedBufferParameteri64v");
+	set_proc_address(&impl_GetNamedBufferPointerv,                   "glGetNamedBufferPointerv");
+	set_proc_address(&impl_GetNamedBufferSubData,                    "glGetNamedBufferSubData");
+	set_proc_address(&impl_CreateFramebuffers,                       "glCreateFramebuffers");
+	set_proc_address(&impl_NamedFramebufferRenderbuffer,             "glNamedFramebufferRenderbuffer");
+	set_proc_address(&impl_NamedFramebufferParameteri,               "glNamedFramebufferParameteri");
+	set_proc_address(&impl_NamedFramebufferTexture,                  "glNamedFramebufferTexture");
+	set_proc_address(&impl_NamedFramebufferTextureLayer,             "glNamedFramebufferTextureLayer");
+	set_proc_address(&impl_NamedFramebufferDrawBuffer,               "glNamedFramebufferDrawBuffer");
+	set_proc_address(&impl_NamedFramebufferDrawBuffers,              "glNamedFramebufferDrawBuffers");
+	set_proc_address(&impl_NamedFramebufferReadBuffer,               "glNamedFramebufferReadBuffer");
+	set_proc_address(&impl_InvalidateNamedFramebufferData,           "glInvalidateNamedFramebufferData");
+	set_proc_address(&impl_InvalidateNamedFramebufferSubData,        "glInvalidateNamedFramebufferSubData");
+	set_proc_address(&impl_ClearNamedFramebufferiv,                  "glClearNamedFramebufferiv");
+	set_proc_address(&impl_ClearNamedFramebufferuiv,                 "glClearNamedFramebufferuiv");
+	set_proc_address(&impl_ClearNamedFramebufferfv,                  "glClearNamedFramebufferfv");
+	set_proc_address(&impl_ClearNamedFramebufferfi,                  "glClearNamedFramebufferfi");
+	set_proc_address(&impl_BlitNamedFramebuffer,                     "glBlitNamedFramebuffer");
+	set_proc_address(&impl_CheckNamedFramebufferStatus,              "glCheckNamedFramebufferStatus");
+	set_proc_address(&impl_GetNamedFramebufferParameteriv,           "glGetNamedFramebufferParameteriv");
+	set_proc_address(&impl_GetNamedFramebufferAttachmentParameteriv, "glGetNamedFramebufferAttachmentParameteriv");
+	set_proc_address(&impl_CreateRenderbuffers,                      "glCreateRenderbuffers");
+	set_proc_address(&impl_NamedRenderbufferStorage,                 "glNamedRenderbufferStorage");
+	set_proc_address(&impl_NamedRenderbufferStorageMultisample,      "glNamedRenderbufferStorageMultisample");
+	set_proc_address(&impl_GetNamedRenderbufferParameteriv,          "glGetNamedRenderbufferParameteriv");
+	set_proc_address(&impl_CreateTextures,                           "glCreateTextures");
+	set_proc_address(&impl_TextureBuffer,                            "glTextureBuffer");
+	set_proc_address(&impl_TextureBufferRange,                       "glTextureBufferRange");
+	set_proc_address(&impl_TextureStorage1D,                         "glTextureStorage1D");
+	set_proc_address(&impl_TextureStorage2D,                         "glTextureStorage2D");
+	set_proc_address(&impl_TextureStorage3D,                         "glTextureStorage3D");
+	set_proc_address(&impl_TextureStorage2DMultisample,              "glTextureStorage2DMultisample");
+	set_proc_address(&impl_TextureStorage3DMultisample,              "glTextureStorage3DMultisample");
+	set_proc_address(&impl_TextureSubImage1D,                        "glTextureSubImage1D");
+	set_proc_address(&impl_TextureSubImage2D,                        "glTextureSubImage2D");
+	set_proc_address(&impl_TextureSubImage3D,                        "glTextureSubImage3D");
+	set_proc_address(&impl_CompressedTextureSubImage1D,              "glCompressedTextureSubImage1D");
+	set_proc_address(&impl_CompressedTextureSubImage2D,              "glCompressedTextureSubImage2D");
+	set_proc_address(&impl_CompressedTextureSubImage3D,              "glCompressedTextureSubImage3D");
+	set_proc_address(&impl_CopyTextureSubImage1D,                    "glCopyTextureSubImage1D");
+	set_proc_address(&impl_CopyTextureSubImage2D,                    "glCopyTextureSubImage2D");
+	set_proc_address(&impl_CopyTextureSubImage3D,                    "glCopyTextureSubImage3D");
+	set_proc_address(&impl_TextureParameterf,                        "glTextureParameterf");
+	set_proc_address(&impl_TextureParameterfv,                       "glTextureParameterfv");
+	set_proc_address(&impl_TextureParameteri,                        "glTextureParameteri");
+	set_proc_address(&impl_TextureParameterIiv,                      "glTextureParameterIiv");
+	set_proc_address(&impl_TextureParameterIuiv,                     "glTextureParameterIuiv");
+	set_proc_address(&impl_TextureParameteriv,                       "glTextureParameteriv");
+	set_proc_address(&impl_GenerateTextureMipmap,                    "glGenerateTextureMipmap");
+	set_proc_address(&impl_BindTextureUnit,                          "glBindTextureUnit");
+	set_proc_address(&impl_GetTextureImage,                          "glGetTextureImage");
+	set_proc_address(&impl_GetCompressedTextureImage,                "glGetCompressedTextureImage");
+	set_proc_address(&impl_GetTextureLevelParameterfv,               "glGetTextureLevelParameterfv");
+	set_proc_address(&impl_GetTextureLevelParameteriv,               "glGetTextureLevelParameteriv");
+	set_proc_address(&impl_GetTextureParameterfv,                    "glGetTextureParameterfv");
+	set_proc_address(&impl_GetTextureParameterIiv,                   "glGetTextureParameterIiv");
+	set_proc_address(&impl_GetTextureParameterIuiv,                  "glGetTextureParameterIuiv");
+	set_proc_address(&impl_GetTextureParameteriv,                    "glGetTextureParameteriv");
+	set_proc_address(&impl_CreateVertexArrays,                       "glCreateVertexArrays");
+	set_proc_address(&impl_DisableVertexArrayAttrib,                 "glDisableVertexArrayAttrib");
+	set_proc_address(&impl_EnableVertexArrayAttrib,                  "glEnableVertexArrayAttrib");
+	set_proc_address(&impl_VertexArrayElementBuffer,                 "glVertexArrayElementBuffer");
+	set_proc_address(&impl_VertexArrayVertexBuffer,                  "glVertexArrayVertexBuffer");
+	set_proc_address(&impl_VertexArrayVertexBuffers,                 "glVertexArrayVertexBuffers");
+	set_proc_address(&impl_VertexArrayAttribBinding,                 "glVertexArrayAttribBinding");
+	set_proc_address(&impl_VertexArrayAttribFormat,                  "glVertexArrayAttribFormat");
+	set_proc_address(&impl_VertexArrayAttribIFormat,                 "glVertexArrayAttribIFormat");
+	set_proc_address(&impl_VertexArrayAttribLFormat,                 "glVertexArrayAttribLFormat");
+	set_proc_address(&impl_VertexArrayBindingDivisor,                "glVertexArrayBindingDivisor");
+	set_proc_address(&impl_GetVertexArrayiv,                         "glGetVertexArrayiv");
+	set_proc_address(&impl_GetVertexArrayIndexediv,                  "glGetVertexArrayIndexediv");
+	set_proc_address(&impl_GetVertexArrayIndexed64iv,                "glGetVertexArrayIndexed64iv");
+	set_proc_address(&impl_CreateSamplers,                           "glCreateSamplers");
+	set_proc_address(&impl_CreateProgramPipelines,                   "glCreateProgramPipelines");
+	set_proc_address(&impl_CreateQueries,                            "glCreateQueries");
+	set_proc_address(&impl_GetQueryBufferObjecti64v,                 "glGetQueryBufferObjecti64v");
+	set_proc_address(&impl_GetQueryBufferObjectiv,                   "glGetQueryBufferObjectiv");
+	set_proc_address(&impl_GetQueryBufferObjectui64v,                "glGetQueryBufferObjectui64v");
+	set_proc_address(&impl_GetQueryBufferObjectuiv,                  "glGetQueryBufferObjectuiv");
+	set_proc_address(&impl_MemoryBarrierByRegion,                    "glMemoryBarrierByRegion");
+	set_proc_address(&impl_GetTextureSubImage,                       "glGetTextureSubImage");
+	set_proc_address(&impl_GetCompressedTextureSubImage,             "glGetCompressedTextureSubImage");
+	set_proc_address(&impl_GetGraphicsResetStatus,                   "glGetGraphicsResetStatus");
+	set_proc_address(&impl_GetnCompressedTexImage,                   "glGetnCompressedTexImage");
+	set_proc_address(&impl_GetnTexImage,                             "glGetnTexImage");
+	set_proc_address(&impl_GetnUniformdv,                            "glGetnUniformdv");
+	set_proc_address(&impl_GetnUniformfv,                            "glGetnUniformfv");
+	set_proc_address(&impl_GetnUniformiv,                            "glGetnUniformiv");
+	set_proc_address(&impl_GetnUniformuiv,                           "glGetnUniformuiv");
+	set_proc_address(&impl_ReadnPixels,                              "glReadnPixels");
+	set_proc_address(&impl_GetnMapdv,                                "glGetnMapdv");
+	set_proc_address(&impl_GetnMapfv,                                "glGetnMapfv");
+	set_proc_address(&impl_GetnMapiv,                                "glGetnMapiv");
+	set_proc_address(&impl_GetnPixelMapfv,                           "glGetnPixelMapfv");
+	set_proc_address(&impl_GetnPixelMapuiv,                          "glGetnPixelMapuiv");
+	set_proc_address(&impl_GetnPixelMapusv,                          "glGetnPixelMapusv");
+	set_proc_address(&impl_GetnPolygonStipple,                       "glGetnPolygonStipple");
+	set_proc_address(&impl_GetnColorTable,                           "glGetnColorTable");
+	set_proc_address(&impl_GetnConvolutionFilter,                    "glGetnConvolutionFilter");
+	set_proc_address(&impl_GetnSeparableFilter,                      "glGetnSeparableFilter");
+	set_proc_address(&impl_GetnHistogram,                            "glGetnHistogram");
+	set_proc_address(&impl_GetnMinmax,                               "glGetnMinmax");
+	set_proc_address(&impl_TextureBarrier,                           "glTextureBarrier");
+	set_proc_address(&impl_glGetUnsignedBytevEXT,                    "glGetUnsignedBytevEXT");
+	set_proc_address(&impl_TexPageCommitmentARB,                    "glTexPageCommitmentARB");
+}
+
+
+// VERSION_4_6
+impl_SpecializeShader:               proc "c" (shader: u32, pEntryPoint: ^u8, numSpecializationConstants: u32, pConstantIndex: ^u32, pConstantValue: ^u32);
+impl_MultiDrawArraysIndirectCount:   proc "c" (mode: i32, indirect: rawptr, drawcount: int, maxdrawcount, stride: i32);
+impl_MultiDrawElementsIndirectCount: proc "c" (mode: i32, type: i32, indirect: rawptr, drawcount: int, maxdrawcount, stride: i32);
+impl_PolygonOffsetClamp:             proc "c" (factor, units, clamp: f32);
+
+load_4_6 :: proc(set_proc_address: Set_Proc_Address_Type) {
+	set_proc_address(&impl_SpecializeShader,               "glSpecializeShader");
+	set_proc_address(&impl_MultiDrawArraysIndirectCount,   "glMultiDrawArraysIndirectCount");
+	set_proc_address(&impl_MultiDrawElementsIndirectCount, "glMultiDrawElementsIndirectCount");
+	set_proc_address(&impl_PolygonOffsetClamp,             "glPolygonOffsetClamp");
+}
+
+init :: proc(set_proc_address: Set_Proc_Address_Type) {
+	// Placeholder for loading maximum supported version
+}
+
+

+ 1567 - 0
vendor/OpenGL/wrappers.odin

@@ -0,0 +1,1567 @@
+package odin_gl
+
+when !ODIN_DEBUG {
+	// VERSION_1_0
+	CullFace               :: #force_inline proc "c" (mode: u32)                                                                                         {        impl_CullFace(mode);                                                                         }
+	FrontFace              :: #force_inline proc "c" (mode: u32)                                                                                         {        impl_FrontFace(mode);                                                                        }
+	Hint                   :: #force_inline proc "c" (target, mode: u32)                                                                                 {        impl_Hint(target, mode);                                                                     }
+	LineWidth              :: #force_inline proc "c" (width: f32)                                                                                        {        impl_LineWidth(width);                                                                       }
+	PointSize              :: #force_inline proc "c" (size: f32)                                                                                         {        impl_PointSize(size);                                                                        }
+	PolygonMode            :: #force_inline proc "c" (face, mode: u32)                                                                                   {        impl_PolygonMode(face, mode);                                                                }
+	Scissor                :: #force_inline proc "c" (x, y, width, height: i32)                                                                          {        impl_Scissor(x, y, width, height);                                                           }
+	TexParameterf          :: #force_inline proc "c" (target, pname: u32, param: f32)                                                                    {        impl_TexParameterf(target, pname, param);                                                    }
+	TexParameterfv         :: #force_inline proc "c" (target, pname: u32, params: [^]f32)                                                                {        impl_TexParameterfv(target, pname, params);                                                  }
+	TexParameteri          :: #force_inline proc "c" (target, pname: u32, param: i32)                                                                    {        impl_TexParameteri(target, pname, param);                                                    }
+	TexParameteriv         :: #force_inline proc "c" (target, pname: u32, params: [^]i32)                                                                {        impl_TexParameteriv(target, pname, params);                                                  }
+	TexImage1D             :: #force_inline proc "c" (target: u32, level, internalformat, width, border: i32, format, type: u32, pixels: rawptr)         {        impl_TexImage1D(target, level, internalformat, width, border, format, type, pixels);         }
+	TexImage2D             :: #force_inline proc "c" (target: u32, level, internalformat, width, height, border: i32, format, type: u32, pixels: rawptr) {        impl_TexImage2D(target, level, internalformat, width, height, border, format, type, pixels); }
+	DrawBuffer             :: #force_inline proc "c" (buf: u32)                                                                                          {        impl_DrawBuffer(buf);                                                                        }
+	Clear                  :: #force_inline proc "c" (mask: u32)                                                                                         {        impl_Clear(mask);                                                                            }
+	ClearColor             :: #force_inline proc "c" (red, green, blue, alpha: f32)                                                                      {        impl_ClearColor(red, green, blue, alpha);                                                    }
+	ClearStencil           :: #force_inline proc "c" (s: i32)                                                                                            {        impl_ClearStencil(s);                                                                        }
+	ClearDepth             :: #force_inline proc "c" (depth: f64)                                                                                        {        impl_ClearDepth(depth);                                                                      }
+	StencilMask            :: #force_inline proc "c" (mask: u32)                                                                                         {        impl_StencilMask(mask);                                                                      }
+	ColorMask              :: #force_inline proc "c" (red, green, blue, alpha: u8)                                                                       {        impl_ColorMask(red, green, blue, alpha);                                                     }
+	DepthMask              :: #force_inline proc "c" (flag: u8)                                                                                          {        impl_DepthMask(flag);                                                                        }
+	Disable                :: #force_inline proc "c" (cap: u32)                                                                                          {        impl_Disable(cap);                                                                           }
+	Enable                 :: #force_inline proc "c" (cap: u32)                                                                                          {        impl_Enable(cap);                                                                            }
+	Finish                 :: #force_inline proc "c" ()                                                                                                  {        impl_Finish();                                                                               }
+	Flush                  :: #force_inline proc "c" ()                                                                                                  {        impl_Flush();                                                                                }
+	BlendFunc              :: #force_inline proc "c" (sfactor, dfactor: u32)                                                                             {        impl_BlendFunc(sfactor, dfactor);                                                            }
+	LogicOp                :: #force_inline proc "c" (opcode: u32)                                                                                       {        impl_LogicOp(opcode);                                                                        }
+	StencilFunc            :: #force_inline proc "c" (func: u32, ref: i32, mask: u32)                                                                    {        impl_StencilFunc(func, ref, mask);                                                           }
+	StencilOp              :: #force_inline proc "c" (fail, zfail, zpass: u32)                                                                           {        impl_StencilOp(fail, zfail, zpass);                                                          }
+	DepthFunc              :: #force_inline proc "c" (func: u32)                                                                                         {        impl_DepthFunc(func);                                                                        }
+	PixelStoref            :: #force_inline proc "c" (pname: u32, param: f32)                                                                            {        impl_PixelStoref(pname, param);                                                              }
+	PixelStorei            :: #force_inline proc "c" (pname: u32, param: i32)                                                                            {        impl_PixelStorei(pname, param);                                                              }
+	ReadBuffer             :: #force_inline proc "c" (src: u32)                                                                                          {        impl_ReadBuffer(src);                                                                        }
+	ReadPixels             :: #force_inline proc "c" (x, y, width, height: i32, format, type: u32, pixels: rawptr)                                       {        impl_ReadPixels(x, y, width, height, format, type, pixels);                                  }
+	GetBooleanv            :: #force_inline proc "c" (pname: u32, data: ^bool)                                                                           {        impl_GetBooleanv(pname, data);                                                               }
+	GetDoublev             :: #force_inline proc "c" (pname: u32, data: ^f64)                                                                            {        impl_GetDoublev(pname, data);                                                                }
+	GetError               :: #force_inline proc "c" () -> u32                                                                                           { return impl_GetError();                                                                             }
+	GetFloatv              :: #force_inline proc "c" (pname: u32, data: ^f32)                                                                            {        impl_GetFloatv(pname, data);                                                                 }
+	GetIntegerv            :: #force_inline proc "c" (pname: u32, data: ^i32)                                                                            {        impl_GetIntegerv(pname, data);                                                               }
+	GetString              :: #force_inline proc "c" (name: u32) -> cstring                                                                              { return impl_GetString(name);                                                                        }
+	GetTexImage            :: #force_inline proc "c" (target: u32,  level: i32, format, type: u32, pixels: rawptr)                                       {        impl_GetTexImage(target,  level, format, type, pixels);                                      }
+	GetTexParameterfv      :: #force_inline proc "c" (target, pname: u32, params: [^]f32)                                                                {        impl_GetTexParameterfv(target, pname, params);                                               }
+	GetTexParameteriv      :: #force_inline proc "c" (target, pname: u32, params: [^]i32)                                                                {        impl_GetTexParameteriv(target, pname, params);                                               }
+	GetTexLevelParameterfv :: #force_inline proc "c" (target: u32, level: i32, pname: u32, params: [^]f32)                                               {        impl_GetTexLevelParameterfv(target, level, pname, params);                                   }
+	GetTexLevelParameteriv :: #force_inline proc "c" (target: u32, level: i32, pname: u32, params: [^]i32)                                               {        impl_GetTexLevelParameteriv(target, level, pname, params);                                   }
+	IsEnabled              :: #force_inline proc "c" (cap: u32) -> bool                                                                                  { return impl_IsEnabled(cap);                                                                         }
+	DepthRange             :: #force_inline proc "c" (near, far: f64)                                                                                    {        impl_DepthRange(near, far);                                                                  }
+	Viewport               :: #force_inline proc "c" (x, y, width, height: i32)                                                                          {        impl_Viewport(x, y, width, height);                                                          }
+
+	// VERSION_1_1
+	DrawArrays        :: #force_inline proc "c" (mode: u32, first: i32, count: i32)                                                                                    {        impl_DrawArrays(mode, first, count);                                                      }
+	DrawElements      :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr)                                                                    {        impl_DrawElements(mode, count, type, indices);                                            }
+	PolygonOffset     :: #force_inline proc "c" (factor: f32, units: f32)                                                                                              {        impl_PolygonOffset(factor, units);                                                        }
+	CopyTexImage1D    :: #force_inline proc "c" (target: u32, level: i32, internalformat: u32, x: i32, y: i32, width: i32, border: i32)                                {        impl_CopyTexImage1D(target, level, internalformat, x, y, width, border);                  }
+	CopyTexImage2D    :: #force_inline proc "c" (target: u32, level: i32, internalformat: u32, x: i32, y: i32, width: i32, height: i32, border: i32)                   {        impl_CopyTexImage2D(target, level, internalformat, x, y, width, height, border);          }
+	CopyTexSubImage1D :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, x: i32, y: i32, width: i32)                                                    {        impl_CopyTexSubImage1D(target, level, xoffset, x, y, width);                              }
+	CopyTexSubImage2D :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, x: i32, y: i32, width: i32, height: i32)                         {        impl_CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);             }
+	TexSubImage1D     :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, width: i32, format: u32, type: u32, pixels: rawptr)                            {        impl_TexSubImage1D(target, level, xoffset, width, format, type, pixels);                  }
+	TexSubImage2D     :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, type: u32, pixels: rawptr) {        impl_TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); }
+	BindTexture       :: #force_inline proc "c" (target: u32, texture: u32)                                                                                            {        impl_BindTexture(target, texture);                                                        }
+	DeleteTextures    :: #force_inline proc "c" (n: i32, textures: [^]u32)                                                                                             {        impl_DeleteTextures(n, textures);                                                         }
+	GenTextures       :: #force_inline proc "c" (n: i32, textures: [^]u32)                                                                                             {        impl_GenTextures(n, textures);                                                            }
+	IsTexture         :: #force_inline proc "c" (texture: u32) -> bool                                                                                                 { return impl_IsTexture(texture);                                                                  }
+
+	// VERSION_1_2
+	DrawRangeElements :: #force_inline proc "c" (mode, start, end: u32, count: i32, type: u32, indices: rawptr)                                               { impl_DrawRangeElements(mode, start, end, count, type, indices);                                           }
+	TexImage3D        :: #force_inline proc "c" (target: u32, level, internalformat, width, height, depth, border: i32, format, type: u32, pixels: rawptr)    { impl_TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);       }
+	TexSubImage3D     :: #force_inline proc "c" (target: u32, level, xoffset, yoffset, zoffset, width, height, depth: i32, format, type: u32, pixels: rawptr) { impl_TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); }
+	CopyTexSubImage3D :: #force_inline proc "c" (target: u32, level, xoffset, yoffset, zoffset, x, y, width, height: i32)                                     { impl_CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);                    }
+
+	// VERSION_1_3
+	ActiveTexture           :: #force_inline proc "c" (texture: u32)                                                                                                                                      { impl_ActiveTexture(texture);                                                                                           }
+	SampleCoverage          :: #force_inline proc "c" (value: f32, invert: u8)                                                                                                                            { impl_SampleCoverage(value, invert);                                                                                    }
+	CompressedTexImage3D    :: #force_inline proc "c" (target: u32, level: i32, internalformat: u32, width: i32, height: i32, depth: i32, border: i32, imageSize: i32, data: rawptr)                      { impl_CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);               }
+	CompressedTexImage2D    :: #force_inline proc "c" (target: u32, level: i32, internalformat: u32, width: i32, height: i32, border: i32, imageSize: i32, data: rawptr)                                  { impl_CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);                      }
+	CompressedTexImage1D    :: #force_inline proc "c" (target: u32, level: i32, internalformat: u32, width: i32, border: i32, imageSize: i32, data: rawptr)                                               { impl_CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);                              }
+	CompressedTexSubImage3D :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, imageSize: i32, data: rawptr) { impl_CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); }
+	CompressedTexSubImage2D :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, imageSize: i32, data: rawptr)                           { impl_CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);                 }
+	CompressedTexSubImage1D :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, width: i32, format: u32, imageSize: i32, data: rawptr)                                                      { impl_CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);                                  }
+	GetCompressedTexImage   :: #force_inline proc "c" (target: u32, level: i32, img: rawptr)                                                                                                              { impl_GetCompressedTexImage(target, level, img);                                                                        }
+
+	// VERSION_1_4
+	BlendFuncSeparate :: #force_inline proc "c" (sfactorRGB: u32, dfactorRGB: u32, sfactorAlpha: u32, dfactorAlpha: u32)  { impl_BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); }
+	MultiDrawArrays   :: #force_inline proc "c" (mode: u32, first: [^]i32, count: [^]i32, drawcount: i32)                 { impl_MultiDrawArrays(mode, first, count, drawcount);                    }
+	MultiDrawElements :: #force_inline proc "c" (mode: u32, count: [^]i32, type: u32, indices: [^]rawptr, drawcount: i32) { impl_MultiDrawElements(mode, count, type, indices, drawcount);           }
+	PointParameterf   :: #force_inline proc "c" (pname: u32, param: f32)                                                  { impl_PointParameterf(pname, param);                                         }
+	PointParameterfv  :: #force_inline proc "c" (pname: u32, params: [^]f32)                                              { impl_PointParameterfv(pname, params);                                     }
+	PointParameteri   :: #force_inline proc "c" (pname: u32, param: i32)                                                  { impl_PointParameteri(pname, param);                                         }
+	PointParameteriv  :: #force_inline proc "c" (pname: u32, params: [^]i32)                                              { impl_PointParameteriv(pname, params);                                     }
+	BlendColor        :: #force_inline proc "c" (red: f32, green: f32, blue: f32, alpha: f32)                             { impl_BlendColor(red, green, blue, alpha);                                   }
+	BlendEquation     :: #force_inline proc "c" (mode: u32)                                                               { impl_BlendEquation(mode);                                                   }
+
+	// VERSION_1_5
+	GenQueries           :: #force_inline proc "c" (n: i32, ids: [^]u32)                               {        impl_GenQueries(n, ids);                                       }
+	DeleteQueries        :: #force_inline proc "c" (n: i32, ids: [^]u32)                               {        impl_DeleteQueries(n, ids);                                    }
+	IsQuery              :: #force_inline proc "c" (id: u32) -> bool                                   { ret := impl_IsQuery(id);                                  return ret; }
+	BeginQuery           :: #force_inline proc "c" (target: u32, id: u32)                              {        impl_BeginQuery(target, id);                                   }
+	EndQuery             :: #force_inline proc "c" (target: u32)                                       {        impl_EndQuery(target);                                         }
+	GetQueryiv           :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32)           {        impl_GetQueryiv(target, pname, params);                        }
+	GetQueryObjectiv     :: #force_inline proc "c" (id: u32, pname: u32, params: [^]i32)               {        impl_GetQueryObjectiv(id, pname, params);                      }
+	GetQueryObjectuiv    :: #force_inline proc "c" (id: u32, pname: u32, params: [^]u32)               {        impl_GetQueryObjectuiv(id, pname, params);                     }
+	BindBuffer           :: #force_inline proc "c" (target: u32, buffer: u32)                          {        impl_BindBuffer(target, buffer);                               }
+	DeleteBuffers        :: #force_inline proc "c" (n: i32, buffers: [^]u32)                           {        impl_DeleteBuffers(n, buffers);                                }
+	GenBuffers           :: #force_inline proc "c" (n: i32, buffers: [^]u32)                           {        impl_GenBuffers(n, buffers);                                   }
+	IsBuffer             :: #force_inline proc "c" (buffer: u32) -> bool                               { ret := impl_IsBuffer(buffer);                             return ret; }
+	BufferData           :: #force_inline proc "c" (target: u32, size: int, data: rawptr, usage: u32)  {        impl_BufferData(target, size, data, usage);                    }
+	BufferSubData        :: #force_inline proc "c" (target: u32, offset: int, size: int, data: rawptr) {        impl_BufferSubData(target, offset, size, data);                }
+	GetBufferSubData     :: #force_inline proc "c" (target: u32, offset: int, size: int, data: rawptr) {        impl_GetBufferSubData(target, offset, size, data);             }
+	MapBuffer            :: #force_inline proc "c" (target: u32, access: u32) -> rawptr                { ret := impl_MapBuffer(target, access);                    return ret; }
+	UnmapBuffer          :: #force_inline proc "c" (target: u32) -> bool                               { ret := impl_UnmapBuffer(target);                          return ret; }
+	GetBufferParameteriv :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32)           {        impl_GetBufferParameteriv(target, pname, params);              }
+	GetBufferPointerv    :: #force_inline proc "c" (target: u32, pname: u32, params: [^]rawptr)        {        impl_GetBufferPointerv(target, pname, params);                 }
+
+	// VERSION_2_0
+	BlendEquationSeparate    :: #force_inline proc "c" (modeRGB: u32, modeAlpha: u32)                                                               {        impl_BlendEquationSeparate(modeRGB, modeAlpha);                                        }
+	DrawBuffers              :: #force_inline proc "c" (n: i32, bufs: [^]u32)                                                                       {        impl_DrawBuffers(n, bufs);                                                             }
+	StencilOpSeparate        :: #force_inline proc "c" (face: u32, sfail: u32, dpfail: u32, dppass: u32)                                            {        impl_StencilOpSeparate(face, sfail, dpfail, dppass);                                   }
+	StencilFuncSeparate      :: #force_inline proc "c" (face: u32, func: u32, ref: i32, mask: u32)                                                  {        impl_StencilFuncSeparate(face, func, ref, mask);                                       }
+	StencilMaskSeparate      :: #force_inline proc "c" (face: u32, mask: u32)                                                                       {        impl_StencilMaskSeparate(face, mask);                                                  }
+	AttachShader             :: #force_inline proc "c" (program: u32, shader: u32)                                                                  {        impl_AttachShader(program, shader);                                                    }
+	BindAttribLocation       :: #force_inline proc "c" (program: u32, index: u32, name: cstring)                                                    {        impl_BindAttribLocation(program, index, name);                                         }
+	CompileShader            :: #force_inline proc "c" (shader: u32)                                                                                {        impl_CompileShader(shader);                                                            }
+	CreateProgram            :: #force_inline proc "c" () -> u32                                                                                    { ret := impl_CreateProgram();                                                      return ret; }
+	CreateShader             :: #force_inline proc "c" (type: u32) -> u32                                                                           { ret := impl_CreateShader(type);                                                  return ret; }
+	DeleteProgram            :: #force_inline proc "c" (program: u32)                                                                               {        impl_DeleteProgram(program);                                                           }
+	DeleteShader             :: #force_inline proc "c" (shader: u32)                                                                                {        impl_DeleteShader(shader);                                                             }
+	DetachShader             :: #force_inline proc "c" (program: u32, shader: u32)                                                                  {        impl_DetachShader(program, shader);                                                    }
+	DisableVertexAttribArray :: #force_inline proc "c" (index: u32)                                                                                 {        impl_DisableVertexAttribArray(index);                                                  }
+	EnableVertexAttribArray  :: #force_inline proc "c" (index: u32)                                                                                 {        impl_EnableVertexAttribArray(index);                                                   }
+	GetActiveAttrib          :: #force_inline proc "c" (program: u32, index: u32, bufSize: i32, length: ^i32, size: ^i32, type: ^u32, name: [^]u8)  {        impl_GetActiveAttrib(program, index, bufSize, length, size, type, name);              }
+	GetActiveUniform         :: #force_inline proc "c" (program: u32, index: u32, bufSize: i32, length: ^i32, size: ^i32, type: ^u32, name: [^]u8)  {        impl_GetActiveUniform(program, index, bufSize, length, size, type, name);             }
+	GetAttachedShaders       :: #force_inline proc "c" (program: u32, maxCount: i32, count: [^]i32, shaders: [^]u32)                                {        impl_GetAttachedShaders(program, maxCount, count, shaders);                            }
+	GetAttribLocation        :: #force_inline proc "c" (program: u32, name: cstring) -> i32                                                         { ret := impl_GetAttribLocation(program, name);                                     return ret; }
+	GetProgramiv             :: #force_inline proc "c" (program: u32, pname: u32, params: [^]i32)                                                   {        impl_GetProgramiv(program, pname, params);                                             }
+	GetProgramInfoLog        :: #force_inline proc "c" (program: u32, bufSize: i32, length: ^i32, infoLog: [^]u8)                                   {        impl_GetProgramInfoLog(program, bufSize, length, infoLog);                             }
+	GetShaderiv              :: #force_inline proc "c" (shader: u32, pname: u32, params: [^]i32)                                                    {        impl_GetShaderiv(shader, pname, params);                                               }
+	GetShaderInfoLog         :: #force_inline proc "c" (shader: u32, bufSize: i32, length: ^i32, infoLog: [^]u8)                                    {        impl_GetShaderInfoLog(shader, bufSize, length, infoLog);                               }
+	GetShaderSource          :: #force_inline proc "c" (shader: u32, bufSize: i32, length: ^i32, source: [^]u8)                                     {        impl_GetShaderSource(shader, bufSize, length, source);                                 }
+	GetUniformLocation       :: #force_inline proc "c" (program: u32, name: cstring) -> i32                                                         { ret := impl_GetUniformLocation(program, name);                                    return ret; }
+	GetUniformfv             :: #force_inline proc "c" (program: u32, location: i32, params: [^]f32)                                                {        impl_GetUniformfv(program, location, params);                                          }
+	GetUniformiv             :: #force_inline proc "c" (program: u32, location: i32, params: [^]i32)                                                {        impl_GetUniformiv(program, location, params);                                          }
+	GetVertexAttribdv        :: #force_inline proc "c" (index: u32, pname: u32, params: [^]f64)                                                     {        impl_GetVertexAttribdv(index, pname, params);                                          }
+	GetVertexAttribfv        :: #force_inline proc "c" (index: u32, pname: u32, params: [^]f32)                                                     {        impl_GetVertexAttribfv(index, pname, params);                                          }
+	GetVertexAttribiv        :: #force_inline proc "c" (index: u32, pname: u32, params: [^]i32)                                                     {        impl_GetVertexAttribiv(index, pname, params);                                          }
+	GetVertexAttribPointerv  :: #force_inline proc "c" (index: u32, pname: u32, pointer: ^rawptr)                                                   {        impl_GetVertexAttribPointerv(index, pname, pointer);                                   }
+	IsProgram                :: #force_inline proc "c" (program: u32) -> bool                                                                       { ret := impl_IsProgram(program);                                                   return ret; }
+	IsShader                 :: #force_inline proc "c" (shader: u32) -> bool                                                                        { ret := impl_IsShader(shader);                                                     return ret; }
+	LinkProgram              :: #force_inline proc "c" (program: u32)                                                                               {        impl_LinkProgram(program);                                                             }
+	ShaderSource             :: #force_inline proc "c" (shader: u32, count: i32, string: [^]cstring, length: [^]i32)                                {        impl_ShaderSource(shader, count, string, length);                                      }
+	UseProgram               :: #force_inline proc "c" (program: u32)                                                                               {        impl_UseProgram(program);                                                              }
+	Uniform1f                :: #force_inline proc "c" (location: i32, v0: f32)                                                                     {        impl_Uniform1f(location, v0);                                                          }
+	Uniform2f                :: #force_inline proc "c" (location: i32, v0: f32, v1: f32)                                                            {        impl_Uniform2f(location, v0, v1);                                                      }
+	Uniform3f                :: #force_inline proc "c" (location: i32, v0: f32, v1: f32, v2: f32)                                                   {        impl_Uniform3f(location, v0, v1, v2);                                                  }
+	Uniform4f                :: #force_inline proc "c" (location: i32, v0: f32, v1: f32, v2: f32, v3: f32)                                          {        impl_Uniform4f(location, v0, v1, v2, v3);                                              }
+	Uniform1i                :: #force_inline proc "c" (location: i32, v0: i32)                                                                     {        impl_Uniform1i(location, v0);                                                          }
+	Uniform2i                :: #force_inline proc "c" (location: i32, v0: i32, v1: i32)                                                            {        impl_Uniform2i(location, v0, v1);                                                      }
+	Uniform3i                :: #force_inline proc "c" (location: i32, v0: i32, v1: i32, v2: i32)                                                   {        impl_Uniform3i(location, v0, v1, v2);                                                  }
+	Uniform4i                :: #force_inline proc "c" (location: i32, v0: i32, v1: i32, v2: i32, v3: i32)                                          {        impl_Uniform4i(location, v0, v1, v2, v3);                                              }
+	Uniform1fv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]f32)                                                   {        impl_Uniform1fv(location, count, value);                                               }
+	Uniform2fv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]f32)                                                   {        impl_Uniform2fv(location, count, value);                                               }
+	Uniform3fv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]f32)                                                   {        impl_Uniform3fv(location, count, value);                                               }
+	Uniform4fv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]f32)                                                   {        impl_Uniform4fv(location, count, value);                                               }
+	Uniform1iv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]i32)                                                   {        impl_Uniform1iv(location, count, value);                                               }
+	Uniform2iv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]i32)                                                   {        impl_Uniform2iv(location, count, value);                                               }
+	Uniform3iv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]i32)                                                   {        impl_Uniform3iv(location, count, value);                                               }
+	Uniform4iv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]i32)                                                   {        impl_Uniform4iv(location, count, value);                                               }
+	UniformMatrix2fv         :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32)                                  {        impl_UniformMatrix2fv(location, count, transpose, value);                              }
+	UniformMatrix3fv         :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32)                                  {        impl_UniformMatrix3fv(location, count, transpose, value);                              }
+	UniformMatrix4fv         :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32)                                  {        impl_UniformMatrix4fv(location, count, transpose, value);                              }
+	ValidateProgram          :: #force_inline proc "c" (program: u32)                                                                               {        impl_ValidateProgram(program);                                                         }
+	VertexAttrib1d           :: #force_inline proc "c" (index: u32, x: f64)                                                                         {        impl_VertexAttrib1d(index, x);                                                         }
+	VertexAttrib1dv          :: #force_inline proc "c" (index: u32, v: ^f64)                                                                        {        impl_VertexAttrib1dv(index, v);                                                        }
+	VertexAttrib1f           :: #force_inline proc "c" (index: u32, x: f32)                                                                         {        impl_VertexAttrib1f(index, x);                                                         }
+	VertexAttrib1fv          :: #force_inline proc "c" (index: u32, v: ^f32)                                                                        {        impl_VertexAttrib1fv(index, v);                                                        }
+	VertexAttrib1s           :: #force_inline proc "c" (index: u32, x: i16)                                                                         {        impl_VertexAttrib1s(index, x);                                                         }
+	VertexAttrib1sv          :: #force_inline proc "c" (index: u32, v: ^i16)                                                                        {        impl_VertexAttrib1sv(index, v);                                                        }
+	VertexAttrib2d           :: #force_inline proc "c" (index: u32, x: f64, y: f64)                                                                 {        impl_VertexAttrib2d(index, x, y);                                                      }
+	VertexAttrib2dv          :: #force_inline proc "c" (index: u32, v: ^f64)                                                                        {        impl_VertexAttrib2dv(index, v);                                                        }
+	VertexAttrib2f           :: #force_inline proc "c" (index: u32, x: f32, y: f32)                                                                 {        impl_VertexAttrib2f(index, x, y);                                                      }
+	VertexAttrib2fv          :: #force_inline proc "c" (index: u32, v: ^f32)                                                                        {        impl_VertexAttrib2fv(index, v);                                                        }
+	VertexAttrib2s           :: #force_inline proc "c" (index: u32, x: i16, y: i16)                                                                 {        impl_VertexAttrib2s(index, x, y);                                                      }
+	VertexAttrib2sv          :: #force_inline proc "c" (index: u32, v: ^i16)                                                                        {        impl_VertexAttrib2sv(index, v);                                                        }
+	VertexAttrib3d           :: #force_inline proc "c" (index: u32, x: f64, y: f64, z: f64)                                                         {        impl_VertexAttrib3d(index, x, y, z);                                                   }
+	VertexAttrib3dv          :: #force_inline proc "c" (index: u32, v: ^f64)                                                                        {        impl_VertexAttrib3dv(index, v);                                                        }
+	VertexAttrib3f           :: #force_inline proc "c" (index: u32, x: f32, y: f32, z: f32)                                                         {        impl_VertexAttrib3f(index, x, y, z);                                                   }
+	VertexAttrib3fv          :: #force_inline proc "c" (index: u32, v: ^f32)                                                                        {        impl_VertexAttrib3fv(index, v);                                                        }
+	VertexAttrib3s           :: #force_inline proc "c" (index: u32, x: i16, y: i16, z: i16)                                                         {        impl_VertexAttrib3s(index, x, y, z);                                                   }
+	VertexAttrib3sv          :: #force_inline proc "c" (index: u32, v: ^i16)                                                                        {        impl_VertexAttrib3sv(index, v);                                                        }
+	VertexAttrib4Nbv         :: #force_inline proc "c" (index: u32, v: ^i8)                                                                         {        impl_VertexAttrib4Nbv(index, v);                                                       }
+	VertexAttrib4Niv         :: #force_inline proc "c" (index: u32, v: ^i32)                                                                        {        impl_VertexAttrib4Niv(index, v);                                                       }
+	VertexAttrib4Nsv         :: #force_inline proc "c" (index: u32, v: ^i16)                                                                        {        impl_VertexAttrib4Nsv(index, v);                                                       }
+	VertexAttrib4Nub         :: #force_inline proc "c" (index: u32, x: u8, y: u8, z: u8, w: u8)                                                     {        impl_VertexAttrib4Nub(index, x, y, z, w);                                              }
+	VertexAttrib4Nubv        :: #force_inline proc "c" (index: u32, v: ^u8)                                                                         {        impl_VertexAttrib4Nubv(index, v);                                                      }
+	VertexAttrib4Nuiv        :: #force_inline proc "c" (index: u32, v: ^u32)                                                                        {        impl_VertexAttrib4Nuiv(index, v);                                                      }
+	VertexAttrib4Nusv        :: #force_inline proc "c" (index: u32, v: ^u16)                                                                        {        impl_VertexAttrib4Nusv(index, v);                                                      }
+	VertexAttrib4bv          :: #force_inline proc "c" (index: u32, v: ^i8)                                                                         {        impl_VertexAttrib4bv(index, v);                                                        }
+	VertexAttrib4d           :: #force_inline proc "c" (index: u32, x: f64, y: f64, z: f64, w: f64)                                                 {        impl_VertexAttrib4d(index, x, y, z, w);                                                }
+	VertexAttrib4dv          :: #force_inline proc "c" (index: u32, v: ^f64)                                                                        {        impl_VertexAttrib4dv(index, v);                                                        }
+	VertexAttrib4f           :: #force_inline proc "c" (index: u32, x: f32, y: f32, z: f32, w: f32)                                                 {        impl_VertexAttrib4f(index, x, y, z, w);                                                }
+	VertexAttrib4fv          :: #force_inline proc "c" (index: u32, v: ^f32)                                                                        {        impl_VertexAttrib4fv(index, v);                                                        }
+	VertexAttrib4iv          :: #force_inline proc "c" (index: u32, v: ^i32)                                                                        {        impl_VertexAttrib4iv(index, v);                                                        }
+	VertexAttrib4s           :: #force_inline proc "c" (index: u32, x: i16, y: i16, z: i16, w: i16)                                                 {        impl_VertexAttrib4s(index, x, y, z, w);                                                }
+	VertexAttrib4sv          :: #force_inline proc "c" (index: u32, v: ^i16)                                                                        {        impl_VertexAttrib4sv(index, v);                                                        }
+	VertexAttrib4ubv         :: #force_inline proc "c" (index: u32, v: ^u8)                                                                         {        impl_VertexAttrib4ubv(index, v);                                                       }
+	VertexAttrib4uiv         :: #force_inline proc "c" (index: u32, v: ^u32)                                                                        {        impl_VertexAttrib4uiv(index, v);                                                       }
+	VertexAttrib4usv         :: #force_inline proc "c" (index: u32, v: ^u16)                                                                        {        impl_VertexAttrib4usv(index, v);                                                       }
+	VertexAttribPointer      :: #force_inline proc "c" (index: u32, size: i32, type: u32, normalized: bool, stride: i32, pointer: rawptr)           {        impl_VertexAttribPointer(index, size, type, normalized, stride, pointer);             }
+
+	// VERSION_2_1
+	UniformMatrix2x3fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32) { impl_UniformMatrix2x3fv(location, count, transpose, value); }
+	UniformMatrix3x2fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32) { impl_UniformMatrix3x2fv(location, count, transpose, value); }
+	UniformMatrix2x4fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32) { impl_UniformMatrix2x4fv(location, count, transpose, value); }
+	UniformMatrix4x2fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32) { impl_UniformMatrix4x2fv(location, count, transpose, value); }
+	UniformMatrix3x4fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32) { impl_UniformMatrix3x4fv(location, count, transpose, value); }
+	UniformMatrix4x3fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32) { impl_UniformMatrix4x3fv(location, count, transpose, value); }
+
+
+	// VERSION_3_0
+	ColorMaski                          :: #force_inline proc "c" (index: u32, r: u8, g: u8, b: u8, a: u8)                                                                                 {        impl_ColorMaski(index, r, g, b, a);                                                                     }
+	GetBooleani_v                       :: #force_inline proc "c" (target: u32, index: u32, data: ^bool)                                                                                   {        impl_GetBooleani_v(target, index, data);                                                                }
+	GetIntegeri_v                       :: #force_inline proc "c" (target: u32, index: u32, data: ^i32)                                                                                    {        impl_GetIntegeri_v(target, index, data);                                                                }
+	Enablei                             :: #force_inline proc "c" (target: u32, index: u32)                                                                                                {        impl_Enablei(target, index);                                                                            }
+	Disablei                            :: #force_inline proc "c" (target: u32, index: u32)                                                                                                {        impl_Disablei(target, index);                                                                           }
+	IsEnabledi                          :: #force_inline proc "c" (target: u32, index: u32) -> bool                                                                                        { ret := impl_IsEnabledi(target, index);                                                             return ret; }
+	BeginTransformFeedback              :: #force_inline proc "c" (primitiveMode: u32)                                                                                                     {        impl_BeginTransformFeedback(primitiveMode);                                                             }
+	EndTransformFeedback                :: #force_inline proc "c" ()                                                                                                                       {        impl_EndTransformFeedback();                                                                            }
+	BindBufferRange                     :: #force_inline proc "c" (target: u32, index: u32, buffer: u32, offset: int, size: int)                                                           {        impl_BindBufferRange(target, index, buffer, offset, size);                                              }
+	BindBufferBase                      :: #force_inline proc "c" (target: u32, index: u32, buffer: u32)                                                                                   {        impl_BindBufferBase(target, index, buffer);                                                             }
+	TransformFeedbackVaryings           :: #force_inline proc "c" (program: u32, count: i32, varyings: [^]cstring, bufferMode: u32)                                                        {        impl_TransformFeedbackVaryings(program, count, varyings, bufferMode);                                   }
+	GetTransformFeedbackVarying         :: #force_inline proc "c" (program: u32, index: u32, bufSize: i32, length: ^i32, size: ^i32, type: ^u32, name: [^]u8)                              {        impl_GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);                   }
+	ClampColor                          :: #force_inline proc "c" (target: u32, clamp: u32)                                                                                                {        impl_ClampColor(target, clamp);                                                                         }
+	BeginConditionalRender              :: #force_inline proc "c" (id: u32, mode: u32)                                                                                                     {        impl_BeginConditionalRender(id, mode);                                                                  }
+	EndConditionalRender                :: #force_inline proc "c" ()                                                                                                                       {        impl_EndConditionalRender();                                                                            }
+	VertexAttribIPointer                :: #force_inline proc "c" (index: u32, size: i32, type: u32, stride: i32, pointer: rawptr)                                                         {        impl_VertexAttribIPointer(index, size, type, stride, pointer);                                         }
+	GetVertexAttribIiv                  :: #force_inline proc "c" (index: u32, pname: u32, params: [^]i32)                                                                                 {        impl_GetVertexAttribIiv(index, pname, params);                                                          }
+	GetVertexAttribIuiv                 :: #force_inline proc "c" (index: u32, pname: u32, params: [^]u32)                                                                                 {        impl_GetVertexAttribIuiv(index, pname, params);                                                         }
+	VertexAttribI1i                     :: #force_inline proc "c" (index: u32, x: i32)                                                                                                     {        impl_VertexAttribI1i(index, x);                                                                         }
+	VertexAttribI2i                     :: #force_inline proc "c" (index: u32, x: i32, y: i32)                                                                                             {        impl_VertexAttribI2i(index, x, y);                                                                      }
+	VertexAttribI3i                     :: #force_inline proc "c" (index: u32, x: i32, y: i32, z: i32)                                                                                     {        impl_VertexAttribI3i(index, x, y, z);                                                                   }
+	VertexAttribI4i                     :: #force_inline proc "c" (index: u32, x: i32, y: i32, z: i32, w: i32)                                                                             {        impl_VertexAttribI4i(index, x, y, z, w);                                                                }
+	VertexAttribI1ui                    :: #force_inline proc "c" (index: u32, x: u32)                                                                                                     {        impl_VertexAttribI1ui(index, x);                                                                        }
+	VertexAttribI2ui                    :: #force_inline proc "c" (index: u32, x: u32, y: u32)                                                                                             {        impl_VertexAttribI2ui(index, x, y);                                                                     }
+	VertexAttribI3ui                    :: #force_inline proc "c" (index: u32, x: u32, y: u32, z: u32)                                                                                     {        impl_VertexAttribI3ui(index, x, y, z);                                                                  }
+	VertexAttribI4ui                    :: #force_inline proc "c" (index: u32, x: u32, y: u32, z: u32, w: u32)                                                                             {        impl_VertexAttribI4ui(index, x, y, z, w);                                                               }
+	VertexAttribI1iv                    :: #force_inline proc "c" (index: u32, v: ^i32)                                                                                                    {        impl_VertexAttribI1iv(index, v);                                                                        }
+	VertexAttribI2iv                    :: #force_inline proc "c" (index: u32, v: ^i32)                                                                                                    {        impl_VertexAttribI2iv(index, v);                                                                        }
+	VertexAttribI3iv                    :: #force_inline proc "c" (index: u32, v: ^i32)                                                                                                    {        impl_VertexAttribI3iv(index, v);                                                                        }
+	VertexAttribI4iv                    :: #force_inline proc "c" (index: u32, v: ^i32)                                                                                                    {        impl_VertexAttribI4iv(index, v);                                                                        }
+	VertexAttribI1uiv                   :: #force_inline proc "c" (index: u32, v: ^u32)                                                                                                    {        impl_VertexAttribI1uiv(index, v);                                                                       }
+	VertexAttribI2uiv                   :: #force_inline proc "c" (index: u32, v: ^u32)                                                                                                    {        impl_VertexAttribI2uiv(index, v);                                                                       }
+	VertexAttribI3uiv                   :: #force_inline proc "c" (index: u32, v: ^u32)                                                                                                    {        impl_VertexAttribI3uiv(index, v);                                                                       }
+	VertexAttribI4uiv                   :: #force_inline proc "c" (index: u32, v: ^u32)                                                                                                    {        impl_VertexAttribI4uiv(index, v);                                                                       }
+	VertexAttribI4bv                    :: #force_inline proc "c" (index: u32, v: ^i8)                                                                                                     {        impl_VertexAttribI4bv(index, v);                                                                        }
+	VertexAttribI4sv                    :: #force_inline proc "c" (index: u32, v: ^i16)                                                                                                    {        impl_VertexAttribI4sv(index, v);                                                                        }
+	VertexAttribI4ubv                   :: #force_inline proc "c" (index: u32, v: ^u8)                                                                                                     {        impl_VertexAttribI4ubv(index, v);                                                                       }
+	VertexAttribI4usv                   :: #force_inline proc "c" (index: u32, v: ^u16)                                                                                                    {        impl_VertexAttribI4usv(index, v);                                                                       }
+	GetUniformuiv                       :: #force_inline proc "c" (program: u32, location: i32, params: [^]u32)                                                                            {        impl_GetUniformuiv(program, location, params);                                                          }
+	BindFragDataLocation                :: #force_inline proc "c" (program: u32, color: u32, name: cstring)                                                                                {        impl_BindFragDataLocation(program, color, name);                                                        }
+	GetFragDataLocation                 :: #force_inline proc "c" (program: u32, name: cstring) -> i32                                                                                     { ret := impl_GetFragDataLocation(program, name);                                                    return ret; }
+	Uniform1ui                          :: #force_inline proc "c" (location: i32, v0: u32)                                                                                                 {        impl_Uniform1ui(location, v0);                                                                          }
+	Uniform2ui                          :: #force_inline proc "c" (location: i32, v0: u32, v1: u32)                                                                                        {        impl_Uniform2ui(location, v0, v1);                                                                      }
+	Uniform3ui                          :: #force_inline proc "c" (location: i32, v0: u32, v1: u32, v2: u32)                                                                               {        impl_Uniform3ui(location, v0, v1, v2);                                                                  }
+	Uniform4ui                          :: #force_inline proc "c" (location: i32, v0: u32, v1: u32, v2: u32, v3: u32)                                                                      {        impl_Uniform4ui(location, v0, v1, v2, v3);                                                              }
+	Uniform1uiv                         :: #force_inline proc "c" (location: i32, count: i32, value: [^]u32)                                                                               {        impl_Uniform1uiv(location, count, value);                                                               }
+	Uniform2uiv                         :: #force_inline proc "c" (location: i32, count: i32, value: [^]u32)                                                                               {        impl_Uniform2uiv(location, count, value);                                                               }
+	Uniform3uiv                         :: #force_inline proc "c" (location: i32, count: i32, value: [^]u32)                                                                               {        impl_Uniform3uiv(location, count, value);                                                               }
+	Uniform4uiv                         :: #force_inline proc "c" (location: i32, count: i32, value: [^]u32)                                                                               {        impl_Uniform4uiv(location, count, value);                                                               }
+	TexParameterIiv                     :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32)                                                                                {        impl_TexParameterIiv(target, pname, params);                                                            }
+	TexParameterIuiv                    :: #force_inline proc "c" (target: u32, pname: u32, params: [^]u32)                                                                                {        impl_TexParameterIuiv(target, pname, params);                                                           }
+	GetTexParameterIiv                  :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32)                                                                                {        impl_GetTexParameterIiv(target, pname, params);                                                         }
+	GetTexParameterIuiv                 :: #force_inline proc "c" (target: u32, pname: u32, params: [^]u32)                                                                                {        impl_GetTexParameterIuiv(target, pname, params);                                                        }
+	ClearBufferiv                       :: #force_inline proc "c" (buffer: u32, drawbuffer: i32, value: ^i32)                                                                              {        impl_ClearBufferiv(buffer, drawbuffer, value);                                                          }
+	ClearBufferuiv                      :: #force_inline proc "c" (buffer: u32, drawbuffer: i32, value: ^u32)                                                                              {        impl_ClearBufferuiv(buffer, drawbuffer, value);                                                         }
+	ClearBufferfv                       :: #force_inline proc "c" (buffer: u32, drawbuffer: i32, value: ^f32)                                                                              {        impl_ClearBufferfv(buffer, drawbuffer, value);                                                          }
+	ClearBufferfi                       :: #force_inline proc "c" (buffer: u32, drawbuffer: i32, depth: f32, stencil: i32) -> rawptr                                                       { ret := impl_ClearBufferfi(buffer, drawbuffer, depth, stencil);                                     return ret; }
+	GetStringi                          :: #force_inline proc "c" (name: u32, index: u32) -> cstring                                                                                       { ret := impl_GetStringi(name, index);                                                               return ret; }
+	IsRenderbuffer                      :: #force_inline proc "c" (renderbuffer: u32) -> bool                                                                                              { ret := impl_IsRenderbuffer(renderbuffer);                                                          return ret; }
+	BindRenderbuffer                    :: #force_inline proc "c" (target: u32, renderbuffer: u32)                                                                                         {        impl_BindRenderbuffer(target, renderbuffer);                                                            }
+	DeleteRenderbuffers                 :: #force_inline proc "c" (n: i32, renderbuffers: [^]u32)                                                                                          {        impl_DeleteRenderbuffers(n, renderbuffers);                                                             }
+	GenRenderbuffers                    :: #force_inline proc "c" (n: i32, renderbuffers: [^]u32)                                                                                          {        impl_GenRenderbuffers(n, renderbuffers);                                                                }
+	RenderbufferStorage                 :: #force_inline proc "c" (target: u32, internalformat: u32, width: i32, height: i32)                                                              {        impl_RenderbufferStorage(target, internalformat, width, height);                                        }
+	GetRenderbufferParameteriv          :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32)                                                                                {        impl_GetRenderbufferParameteriv(target, pname, params);                                                 }
+	IsFramebuffer                       :: #force_inline proc "c" (framebuffer: u32) -> bool                                                                                               { ret := impl_IsFramebuffer(framebuffer);                                                            return ret; }
+	BindFramebuffer                     :: #force_inline proc "c" (target: u32, framebuffer: u32)                                                                                          {        impl_BindFramebuffer(target, framebuffer);                                                              }
+	DeleteFramebuffers                  :: #force_inline proc "c" (n: i32, framebuffers: [^]u32)                                                                                           {        impl_DeleteFramebuffers(n, framebuffers);                                                               }
+	GenFramebuffers                     :: #force_inline proc "c" (n: i32, framebuffers: [^]u32)                                                                                           {        impl_GenFramebuffers(n, framebuffers);                                                                  }
+	CheckFramebufferStatus              :: #force_inline proc "c" (target: u32) -> u32                                                                                                     { ret := impl_CheckFramebufferStatus(target);                                                        return ret; }
+	FramebufferTexture1D                :: #force_inline proc "c" (target: u32, attachment: u32, textarget: u32, texture: u32, level: i32)                                                 {        impl_FramebufferTexture1D(target, attachment, textarget, texture, level);                               }
+	FramebufferTexture2D                :: #force_inline proc "c" (target: u32, attachment: u32, textarget: u32, texture: u32, level: i32)                                                 {        impl_FramebufferTexture2D(target, attachment, textarget, texture, level);                               }
+	FramebufferTexture3D                :: #force_inline proc "c" (target: u32, attachment: u32, textarget: u32, texture: u32, level: i32, zoffset: i32)                                   {        impl_FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);                      }
+	FramebufferRenderbuffer             :: #force_inline proc "c" (target: u32, attachment: u32, renderbuffertarget: u32, renderbuffer: u32)                                               {        impl_FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);                     }
+	GetFramebufferAttachmentParameteriv :: #force_inline proc "c" (target: u32, attachment: u32, pname: u32, params: [^]i32)                                                               {        impl_GetFramebufferAttachmentParameteriv(target, attachment, pname, params);                            }
+	GenerateMipmap                      :: #force_inline proc "c" (target: u32)                                                                                                            {        impl_GenerateMipmap(target);                                                                            }
+	BlitFramebuffer                     :: #force_inline proc "c" (srcX0: i32, srcY0: i32, srcX1: i32, srcY1: i32, dstX0: i32, dstY0: i32, dstX1: i32, dstY1: i32, mask: u32, filter: u32) {        impl_BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);             }
+	RenderbufferStorageMultisample      :: #force_inline proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32)                                                {        impl_RenderbufferStorageMultisample(target, samples, internalformat, width, height);                    }
+	FramebufferTextureLayer             :: #force_inline proc "c" (target: u32, attachment: u32, texture: u32, level: i32, layer: i32)                                                     {        impl_FramebufferTextureLayer(target, attachment, texture, level, layer);                                }
+	MapBufferRange                      :: #force_inline proc "c" (target: u32, offset: int, length: int, access: u32) -> rawptr                                                           { ret := impl_MapBufferRange(target, offset, length, access);                                        return ret; }
+	FlushMappedBufferRange              :: #force_inline proc "c" (target: u32, offset: int, length: int)                                                                                  {        impl_FlushMappedBufferRange(target, offset, length);                                                    }
+	BindVertexArray                     :: #force_inline proc "c" (array: u32)                                                                                                             {        impl_BindVertexArray(array);                                                                            }
+	DeleteVertexArrays                  :: #force_inline proc "c" (n: i32, arrays: [^]u32)                                                                                                 {        impl_DeleteVertexArrays(n, arrays);                                                                     }
+	GenVertexArrays                     :: #force_inline proc "c" (n: i32, arrays: [^]u32)                                                                                                 {        impl_GenVertexArrays(n, arrays);                                                                        }
+	IsVertexArray                       :: #force_inline proc "c" (array: u32) -> bool                                                                                                     { ret := impl_IsVertexArray(array);                                                                  return ret; }
+
+	// VERSION_3_1
+	DrawArraysInstanced       :: #force_inline proc "c" (mode: u32, first: i32, count: i32, instancecount: i32)                                     {        impl_DrawArraysInstanced(mode, first, count, instancecount);                                               }
+	DrawElementsInstanced     :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32)                     {        impl_DrawElementsInstanced(mode, count, type, indices, instancecount);                                    }
+	TexBuffer                 :: #force_inline proc "c" (target: u32, internalformat: u32, buffer: u32)                                             {        impl_TexBuffer(target, internalformat, buffer);                                                            }
+	PrimitiveRestartIndex     :: #force_inline proc "c" (index: u32)                                                                                {        impl_PrimitiveRestartIndex(index);                                                                         }
+	CopyBufferSubData         :: #force_inline proc "c" (readTarget: u32, writeTarget: u32, readOffset: int, writeOffset: int, size: int)           {        impl_CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);                            }
+	GetUniformIndices         :: #force_inline proc "c" (program: u32, uniformCount: i32, uniformNames: [^]cstring, uniformIndices: [^]u32)         {        impl_GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);                               }
+	GetActiveUniformsiv       :: #force_inline proc "c" (program: u32, uniformCount: i32, uniformIndices: [^]u32, pname: u32, params: [^]i32)       {        impl_GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);                            }
+	GetActiveUniformName      :: #force_inline proc "c" (program: u32, uniformIndex: u32, bufSize: i32, length: ^i32, uniformName: [^]u8)           {        impl_GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);                            }
+	GetUniformBlockIndex      :: #force_inline proc "c" (program: u32, uniformBlockName: cstring) -> u32                                            { ret := impl_GetUniformBlockIndex(program, uniformBlockName);                                          return ret; }
+	GetActiveUniformBlockiv   :: #force_inline proc "c" (program: u32, uniformBlockIndex: u32, pname: u32, params: [^]i32)                          {        impl_GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);                                   }
+	GetActiveUniformBlockName :: #force_inline proc "c" (program: u32, uniformBlockIndex: u32, bufSize: i32, length: ^i32, uniformBlockName: [^]u8) {        impl_GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName);             }
+	UniformBlockBinding       :: #force_inline proc "c" (program: u32, uniformBlockIndex: u32, uniformBlockBinding: u32)                            {        impl_UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);                                 }
+
+	// VERSION_3_2
+	DrawElementsBaseVertex          :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, basevertex: i32)                                            {        impl_DrawElementsBaseVertex(mode, count, type, indices, basevertex);                                                }
+	DrawRangeElementsBaseVertex     :: #force_inline proc "c" (mode: u32, start: u32, end: u32, count: i32, type: u32, indices: rawptr, basevertex: i32)                      {        impl_DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);                               }
+	DrawElementsInstancedBaseVertex :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32, basevertex: i32)                        {        impl_DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);                        }
+	MultiDrawElementsBaseVertex     :: #force_inline proc "c" (mode: u32, count: [^]i32, type: u32, indices: [^]rawptr, drawcount: i32, basevertex: [^]i32)                   {        impl_MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);                                }
+	ProvokingVertex                 :: #force_inline proc "c" (mode: u32)                                                                                                     {        impl_ProvokingVertex(mode);                                                                                          }
+	FenceSync                       :: #force_inline proc "c" (condition: u32, flags: u32) -> sync_t                                                                          { ret := impl_FenceSync(condition, flags);                                                                        return ret; }
+	IsSync                          :: #force_inline proc "c" (sync: sync_t) -> bool                                                                                          { ret := impl_IsSync(sync);                                                                                       return ret; }
+	DeleteSync                      :: #force_inline proc "c" (sync: sync_t)                                                                                                  {        impl_DeleteSync(sync);                                                                                               }
+	ClientWaitSync                  :: #force_inline proc "c" (sync: sync_t, flags: u32, timeout: u64) -> u32                                                                 { ret := impl_ClientWaitSync(sync, flags, timeout);                                                               return ret; }
+	WaitSync                        :: #force_inline proc "c" (sync: sync_t, flags: u32, timeout: u64)                                                                        {        impl_WaitSync(sync, flags, timeout);                                                                                 }
+	GetInteger64v                   :: #force_inline proc "c" (pname: u32, data: ^i64)                                                                                        {        impl_GetInteger64v(pname, data);                                                                                     }
+	GetSynciv                       :: #force_inline proc "c" (sync: sync_t, pname: u32, bufSize: i32, length: ^i32, values: [^]i32)                                          {        impl_GetSynciv(sync, pname, bufSize, length, values);                                                                }
+	GetInteger64i_v                 :: #force_inline proc "c" (target: u32, index: u32, data: ^i64)                                                                           {        impl_GetInteger64i_v(target, index, data);                                                                           }
+	GetBufferParameteri64v          :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i64)                                                                       {        impl_GetBufferParameteri64v(target, pname, params);                                                                  }
+	FramebufferTexture              :: #force_inline proc "c" (target: u32, attachment: u32, texture: u32, level: i32)                                                        {        impl_FramebufferTexture(target, attachment, texture, level);                                                         }
+	TexImage2DMultisample           :: #force_inline proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: u8)             {        impl_TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);                    }
+	TexImage3DMultisample           :: #force_inline proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: u8) {        impl_TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);             }
+	GetMultisamplefv                :: #force_inline proc "c" (pname: u32, index: u32, val: ^f32)                                                                             {        impl_GetMultisamplefv(pname, index, val);                                                                            }
+	SampleMaski                     :: #force_inline proc "c" (maskNumber: u32, mask: u32)                                                                                    {        impl_SampleMaski(maskNumber, mask);                                                                                  }
+
+	// VERSION_3_3
+	BindFragDataLocationIndexed :: #force_inline proc "c" (program: u32, colorNumber: u32, index: u32, name: cstring) {        impl_BindFragDataLocationIndexed(program, colorNumber, index, name);             }
+	GetFragDataIndex            :: #force_inline proc "c" (program: u32, name: cstring) -> i32                        { ret := impl_GetFragDataIndex(program, name);                                return ret; }
+	GenSamplers                 :: #force_inline proc "c" (count: i32, samplers: [^]u32)                              {        impl_GenSamplers(count, samplers);                                               }
+	DeleteSamplers              :: #force_inline proc "c" (count: i32, samplers: [^]u32)                              {        impl_DeleteSamplers(count, samplers);                                            }
+	IsSampler                   :: #force_inline proc "c" (sampler: u32) -> bool                                      { ret := impl_IsSampler(sampler);                                             return ret; }
+	BindSampler                 :: #force_inline proc "c" (unit: u32, sampler: u32)                                   {        impl_BindSampler(unit, sampler);                                                 }
+	SamplerParameteri           :: #force_inline proc "c" (sampler: u32, pname: u32, param: i32)                      {        impl_SamplerParameteri(sampler, pname, param);                                   }
+	SamplerParameteriv          :: #force_inline proc "c" (sampler: u32, pname: u32, param: ^i32)                     {        impl_SamplerParameteriv(sampler, pname, param);                                  }
+	SamplerParameterf           :: #force_inline proc "c" (sampler: u32, pname: u32, param: f32)                      {        impl_SamplerParameterf(sampler, pname, param);                                   }
+	SamplerParameterfv          :: #force_inline proc "c" (sampler: u32, pname: u32, param: ^f32)                     {        impl_SamplerParameterfv(sampler, pname, param);                                  }
+	SamplerParameterIiv         :: #force_inline proc "c" (sampler: u32, pname: u32, param: ^i32)                     {        impl_SamplerParameterIiv(sampler, pname, param);                                 }
+	SamplerParameterIuiv        :: #force_inline proc "c" (sampler: u32, pname: u32, param: ^u32)                     {        impl_SamplerParameterIuiv(sampler, pname, param);                                }
+	GetSamplerParameteriv       :: #force_inline proc "c" (sampler: u32, pname: u32, params: [^]i32)                  {        impl_GetSamplerParameteriv(sampler, pname, params);                              }
+	GetSamplerParameterIiv      :: #force_inline proc "c" (sampler: u32, pname: u32, params: [^]i32)                  {        impl_GetSamplerParameterIiv(sampler, pname, params);                             }
+	GetSamplerParameterfv       :: #force_inline proc "c" (sampler: u32, pname: u32, params: [^]f32)                  {        impl_GetSamplerParameterfv(sampler, pname, params);                              }
+	GetSamplerParameterIuiv     :: #force_inline proc "c" (sampler: u32, pname: u32, params: [^]u32)                  {        impl_GetSamplerParameterIuiv(sampler, pname, params);                            }
+	QueryCounter                :: #force_inline proc "c" (id: u32, target: u32)                                      {        impl_QueryCounter(id, target);                                                   }
+	GetQueryObjecti64v          :: #force_inline proc "c" (id: u32, pname: u32, params: [^]i64)                       {        impl_GetQueryObjecti64v(id, pname, params);                                      }
+	GetQueryObjectui64v         :: #force_inline proc "c" (id: u32, pname: u32, params: [^]u64)                       {        impl_GetQueryObjectui64v(id, pname, params);                                     }
+	VertexAttribDivisor         :: #force_inline proc "c" (index: u32, divisor: u32)                                  {        impl_VertexAttribDivisor(index, divisor);                                        }
+	VertexAttribP1ui            :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: u32)       {        impl_VertexAttribP1ui(index, type, normalized, value);                          }
+	VertexAttribP1uiv           :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: ^u32)      {        impl_VertexAttribP1uiv(index, type, normalized, value);                         }
+	VertexAttribP2ui            :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: u32)       {        impl_VertexAttribP2ui(index, type, normalized, value);                          }
+	VertexAttribP2uiv           :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: ^u32)      {        impl_VertexAttribP2uiv(index, type, normalized, value);                         }
+	VertexAttribP3ui            :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: u32)       {        impl_VertexAttribP3ui(index, type, normalized, value);                          }
+	VertexAttribP3uiv           :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: ^u32)      {        impl_VertexAttribP3uiv(index, type, normalized, value);                         }
+	VertexAttribP4ui            :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: u32)       {        impl_VertexAttribP4ui(index, type, normalized, value);                          }
+	VertexAttribP4uiv           :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: ^u32)      {        impl_VertexAttribP4uiv(index, type, normalized, value);                         }
+	VertexP2ui                  :: #force_inline proc "c" (type: u32, value: u32)                                     {        impl_VertexP2ui(type, value);                                                   }
+	VertexP2uiv                 :: #force_inline proc "c" (type: u32, value: ^u32)                                    {        impl_VertexP2uiv(type, value);                                                  }
+	VertexP3ui                  :: #force_inline proc "c" (type: u32, value: u32)                                     {        impl_VertexP3ui(type, value);                                                   }
+	VertexP3uiv                 :: #force_inline proc "c" (type: u32, value: ^u32)                                    {        impl_VertexP3uiv(type, value);                                                  }
+	VertexP4ui                  :: #force_inline proc "c" (type: u32, value: u32)                                     {        impl_VertexP4ui(type, value);                                                   }
+	VertexP4uiv                 :: #force_inline proc "c" (type: u32, value: ^u32)                                    {        impl_VertexP4uiv(type, value);                                                  }
+	TexCoordP1ui                :: #force_inline proc "c" (type: u32, coords: u32)                                    {        impl_TexCoordP1ui(type, coords);                                                }
+	TexCoordP1uiv               :: #force_inline proc "c" (type: u32, coords: [^]u32)                                 {        impl_TexCoordP1uiv(type, coords);                                               }
+	TexCoordP2ui                :: #force_inline proc "c" (type: u32, coords: u32)                                    {        impl_TexCoordP2ui(type, coords);                                                }
+	TexCoordP2uiv               :: #force_inline proc "c" (type: u32, coords: [^]u32)                                 {        impl_TexCoordP2uiv(type, coords);                                               }
+	TexCoordP3ui                :: #force_inline proc "c" (type: u32, coords: u32)                                    {        impl_TexCoordP3ui(type, coords);                                                }
+	TexCoordP3uiv               :: #force_inline proc "c" (type: u32, coords: [^]u32)                                 {        impl_TexCoordP3uiv(type, coords);                                               }
+	TexCoordP4ui                :: #force_inline proc "c" (type: u32, coords: u32)                                    {        impl_TexCoordP4ui(type, coords);                                                }
+	TexCoordP4uiv               :: #force_inline proc "c" (type: u32, coords: [^]u32)                                 {        impl_TexCoordP4uiv(type, coords);                                               }
+	MultiTexCoordP1ui           :: #force_inline proc "c" (texture: u32, type: u32, coords: u32)                      {        impl_MultiTexCoordP1ui(texture, type, coords);                                  }
+	MultiTexCoordP1uiv          :: #force_inline proc "c" (texture: u32, type: u32, coords: [^]u32)                   {        impl_MultiTexCoordP1uiv(texture, type, coords);                                 }
+	MultiTexCoordP2ui           :: #force_inline proc "c" (texture: u32, type: u32, coords: u32)                      {        impl_MultiTexCoordP2ui(texture, type, coords);                                  }
+	MultiTexCoordP2uiv          :: #force_inline proc "c" (texture: u32, type: u32, coords: [^]u32)                   {        impl_MultiTexCoordP2uiv(texture, type, coords);                                 }
+	MultiTexCoordP3ui           :: #force_inline proc "c" (texture: u32, type: u32, coords: u32)                      {        impl_MultiTexCoordP3ui(texture, type, coords);                                  }
+	MultiTexCoordP3uiv          :: #force_inline proc "c" (texture: u32, type: u32, coords: [^]u32)                   {        impl_MultiTexCoordP3uiv(texture, type, coords);                                 }
+	MultiTexCoordP4ui           :: #force_inline proc "c" (texture: u32, type: u32, coords: u32)                      {        impl_MultiTexCoordP4ui(texture, type, coords);                                  }
+	MultiTexCoordP4uiv          :: #force_inline proc "c" (texture: u32, type: u32, coords: [^]u32)                   {        impl_MultiTexCoordP4uiv(texture, type, coords);                                 }
+	NormalP3ui                  :: #force_inline proc "c" (type: u32, coords: u32)                                    {        impl_NormalP3ui(type, coords);                                                  }
+	NormalP3uiv                 :: #force_inline proc "c" (type: u32, coords: [^]u32)                                 {        impl_NormalP3uiv(type, coords);                                                 }
+	ColorP3ui                   :: #force_inline proc "c" (type: u32, color: u32)                                     {        impl_ColorP3ui(type, color);                                                    }
+	ColorP3uiv                  :: #force_inline proc "c" (type: u32, color: ^u32)                                    {        impl_ColorP3uiv(type, color);                                                   }
+	ColorP4ui                   :: #force_inline proc "c" (type: u32, color: u32)                                     {        impl_ColorP4ui(type, color);                                                    }
+	ColorP4uiv                  :: #force_inline proc "c" (type: u32, color: ^u32)                                    {        impl_ColorP4uiv(type, color);                                                   }
+	SecondaryColorP3ui          :: #force_inline proc "c" (type: u32, color: u32)                                     {        impl_SecondaryColorP3ui(type, color);                                           }
+	SecondaryColorP3uiv         :: #force_inline proc "c" (type: u32, color: ^u32)                                    {        impl_SecondaryColorP3uiv(type, color);                                          }
+
+	// VERSION_4_0
+	MinSampleShading               :: #force_inline proc "c" (value: f32)                                                                         {        impl_MinSampleShading(value);                                                                        }
+	BlendEquationi                 :: #force_inline proc "c" (buf: u32, mode: u32)                                                                {        impl_BlendEquationi(buf, mode);                                                                      }
+	BlendEquationSeparatei         :: #force_inline proc "c" (buf: u32, modeRGB: u32, modeAlpha: u32)                                             {        impl_BlendEquationSeparatei(buf, modeRGB, modeAlpha);                                                }
+	BlendFunci                     :: #force_inline proc "c" (buf: u32, src: u32, dst: u32)                                                       {        impl_BlendFunci(buf, src, dst);                                                                      }
+	BlendFuncSeparatei             :: #force_inline proc "c" (buf: u32, srcRGB: u32, dstRGB: u32, srcAlpha: u32, dstAlpha: u32)                   {        impl_BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);                                    }
+	DrawArraysIndirect             :: #force_inline proc "c" (mode: u32, indirect: rawptr)                                                        {        impl_DrawArraysIndirect(mode, indirect);                                                             }
+	DrawElementsIndirect           :: #force_inline proc "c" (mode: u32, type: u32, indirect: rawptr)                                             {        impl_DrawElementsIndirect(mode, type, indirect);                                                    }
+	Uniform1d                      :: #force_inline proc "c" (location: i32, x: f64)                                                              {        impl_Uniform1d(location, x);                                                                         }
+	Uniform2d                      :: #force_inline proc "c" (location: i32, x: f64, y: f64)                                                      {        impl_Uniform2d(location, x, y);                                                                      }
+	Uniform3d                      :: #force_inline proc "c" (location: i32, x: f64, y: f64, z: f64)                                              {        impl_Uniform3d(location, x, y, z);                                                                   }
+	Uniform4d                      :: #force_inline proc "c" (location: i32, x: f64, y: f64, z: f64, w: f64)                                      {        impl_Uniform4d(location, x, y, z, w);                                                                }
+	Uniform1dv                     :: #force_inline proc "c" (location: i32, count: i32, value: [^]f64)                                           {        impl_Uniform1dv(location, count, value);                                                             }
+	Uniform2dv                     :: #force_inline proc "c" (location: i32, count: i32, value: [^]f64)                                           {        impl_Uniform2dv(location, count, value);                                                             }
+	Uniform3dv                     :: #force_inline proc "c" (location: i32, count: i32, value: [^]f64)                                           {        impl_Uniform3dv(location, count, value);                                                             }
+	Uniform4dv                     :: #force_inline proc "c" (location: i32, count: i32, value: [^]f64)                                           {        impl_Uniform4dv(location, count, value);                                                             }
+	UniformMatrix2dv               :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64)                          {        impl_UniformMatrix2dv(location, count, transpose, value);                                            }
+	UniformMatrix3dv               :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64)                          {        impl_UniformMatrix3dv(location, count, transpose, value);                                            }
+	UniformMatrix4dv               :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64)                          {        impl_UniformMatrix4dv(location, count, transpose, value);                                            }
+	UniformMatrix2x3dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64)                          {        impl_UniformMatrix2x3dv(location, count, transpose, value);                                          }
+	UniformMatrix2x4dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64)                          {        impl_UniformMatrix2x4dv(location, count, transpose, value);                                          }
+	UniformMatrix3x2dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64)                          {        impl_UniformMatrix3x2dv(location, count, transpose, value);                                          }
+	UniformMatrix3x4dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64)                          {        impl_UniformMatrix3x4dv(location, count, transpose, value);                                          }
+	UniformMatrix4x2dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64)                          {        impl_UniformMatrix4x2dv(location, count, transpose, value);                                          }
+	UniformMatrix4x3dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64)                          {        impl_UniformMatrix4x3dv(location, count, transpose, value);                                          }
+	GetUniformdv                   :: #force_inline proc "c" (program: u32, location: i32, params: [^]f64)                                        {        impl_GetUniformdv(program, location, params);                                                        }
+	GetSubroutineUniformLocation   :: #force_inline proc "c" (program: u32, shadertype: u32, name: cstring) -> i32                                { ret := impl_GetSubroutineUniformLocation(program, shadertype, name);                           return ret; }
+	GetSubroutineIndex             :: #force_inline proc "c" (program: u32, shadertype: u32, name: cstring) -> u32                                { ret := impl_GetSubroutineIndex(program, shadertype, name);                                     return ret; }
+	GetActiveSubroutineUniformiv   :: #force_inline proc "c" (program: u32, shadertype: u32, index: u32, pname: u32, values: [^]i32)              {        impl_GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);                       }
+	GetActiveSubroutineUniformName :: #force_inline proc "c" (program: u32, shadertype: u32, index: u32, bufsize: i32, length: ^i32, name: [^]u8) {        impl_GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name);             }
+	GetActiveSubroutineName        :: #force_inline proc "c" (program: u32, shadertype: u32, index: u32, bufsize: i32, length: ^i32, name: [^]u8) {        impl_GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);                    }
+	UniformSubroutinesuiv          :: #force_inline proc "c" (shadertype: u32, count: i32, indices: ^u32)                                         {        impl_UniformSubroutinesuiv(shadertype, count, indices);                                             }
+	GetUniformSubroutineuiv        :: #force_inline proc "c" (shadertype: u32, location: i32, params: [^]u32)                                     {        impl_GetUniformSubroutineuiv(shadertype, location, params);                                         }
+	GetProgramStageiv              :: #force_inline proc "c" (program: u32, shadertype: u32, pname: u32, values: [^]i32)                          {        impl_GetProgramStageiv(program, shadertype, pname, values);                                         }
+	PatchParameteri                :: #force_inline proc "c" (pname: u32, value: i32)                                                             {        impl_PatchParameteri(pname, value);                                                                  }
+	PatchParameterfv               :: #force_inline proc "c" (pname: u32, values: [^]f32)                                                         {        impl_PatchParameterfv(pname, values);                                                                }
+	BindTransformFeedback          :: #force_inline proc "c" (target: u32, id: u32)                                                               {        impl_BindTransformFeedback(target, id);                                                              }
+	DeleteTransformFeedbacks       :: #force_inline proc "c" (n: i32, ids: [^]u32)                                                                {        impl_DeleteTransformFeedbacks(n, ids);                                                               }
+	GenTransformFeedbacks          :: #force_inline proc "c" (n: i32, ids: [^]u32)                                                                {        impl_GenTransformFeedbacks(n, ids);                                                                  }
+	IsTransformFeedback            :: #force_inline proc "c" (id: u32) -> bool                                                                    { ret := impl_IsTransformFeedback(id);                                                            return ret; }
+	PauseTransformFeedback         :: #force_inline proc "c" ()                                                                                   {        impl_PauseTransformFeedback();                                                                       }
+	ResumeTransformFeedback        :: #force_inline proc "c" ()                                                                                   {        impl_ResumeTransformFeedback();                                                                      }
+	DrawTransformFeedback          :: #force_inline proc "c" (mode: u32, id: u32)                                                                 {        impl_DrawTransformFeedback(mode, id);                                                                }
+	DrawTransformFeedbackStream    :: #force_inline proc "c" (mode: u32, id: u32, stream: u32)                                                    {        impl_DrawTransformFeedbackStream(mode, id, stream);                                                  }
+	BeginQueryIndexed              :: #force_inline proc "c" (target: u32, index: u32, id: u32)                                                   {        impl_BeginQueryIndexed(target, index, id);                                                           }
+	EndQueryIndexed                :: #force_inline proc "c" (target: u32, index: u32)                                                            {        impl_EndQueryIndexed(target, index);                                                                 }
+	GetQueryIndexediv              :: #force_inline proc "c" (target: u32, index: u32, pname: u32, params: [^]i32)                                {        impl_GetQueryIndexediv(target, index, pname, params);                                                }
+
+	// VERSION_4_1
+	ReleaseShaderCompiler     :: #force_inline proc "c" ()                                                                             {        impl_ReleaseShaderCompiler();                                                             }
+	ShaderBinary              :: #force_inline proc "c" (count: i32, shaders: ^u32, binaryformat: u32, binary: rawptr, length: i32)    {        impl_ShaderBinary(count, shaders, binaryformat, binary, length);                          }
+	GetShaderPrecisionFormat  :: #force_inline proc "c" (shadertype: u32, precisiontype: u32, range: ^i32, precision: ^i32)            {        impl_GetShaderPrecisionFormat(shadertype, precisiontype, range, precision);             }
+	DepthRangef               :: #force_inline proc "c" (n: f32, f: f32)                                                               {        impl_DepthRangef(n, f);                                                                   }
+	ClearDepthf               :: #force_inline proc "c" (d: f32)                                                                       {        impl_ClearDepthf(d);                                                                      }
+	GetProgramBinary          :: #force_inline proc "c" (program: u32, bufSize: i32, length: ^i32, binaryFormat: ^u32, binary: rawptr) {        impl_GetProgramBinary(program, bufSize, length, binaryFormat, binary);                    }
+	ProgramBinary             :: #force_inline proc "c" (program: u32, binaryFormat: u32, binary: rawptr, length: i32)                 {        impl_ProgramBinary(program, binaryFormat, binary, length);                                }
+	ProgramParameteri         :: #force_inline proc "c" (program: u32, pname: u32, value: i32)                                         {        impl_ProgramParameteri(program, pname, value);                                            }
+	UseProgramStages          :: #force_inline proc "c" (pipeline: u32, stages: u32, program: u32)                                     {        impl_UseProgramStages(pipeline, stages, program);                                         }
+	ActiveShaderProgram       :: #force_inline proc "c" (pipeline: u32, program: u32)                                                  {        impl_ActiveShaderProgram(pipeline, program);                                              }
+	CreateShaderProgramv      :: #force_inline proc "c" (type: u32, count: i32, strings: [^]cstring) -> u32                            { ret := impl_CreateShaderProgramv(type, count, strings);                             return ret; }
+	BindProgramPipeline       :: #force_inline proc "c" (pipeline: u32)                                                                {        impl_BindProgramPipeline(pipeline);                                                       }
+	DeleteProgramPipelines    :: #force_inline proc "c" (n: i32, pipelines: [^]u32)                                                    {        impl_DeleteProgramPipelines(n, pipelines);                                                }
+	GenProgramPipelines       :: #force_inline proc "c" (n: i32, pipelines: [^]u32)                                                    {        impl_GenProgramPipelines(n, pipelines);                                                   }
+	IsProgramPipeline         :: #force_inline proc "c" (pipeline: u32) -> bool                                                        { ret := impl_IsProgramPipeline(pipeline);                                             return ret; }
+	GetProgramPipelineiv      :: #force_inline proc "c" (pipeline: u32, pname: u32, params: [^]i32)                                    {        impl_GetProgramPipelineiv(pipeline, pname, params);                                       }
+	ProgramUniform1i          :: #force_inline proc "c" (program: u32, location: i32, v0: i32)                                         {        impl_ProgramUniform1i(program, location, v0);                                             }
+	ProgramUniform1iv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]i32)                       {        impl_ProgramUniform1iv(program, location, count, value);                                  }
+	ProgramUniform1f          :: #force_inline proc "c" (program: u32, location: i32, v0: f32)                                         {        impl_ProgramUniform1f(program, location, v0);                                             }
+	ProgramUniform1fv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f32)                       {        impl_ProgramUniform1fv(program, location, count, value);                                  }
+	ProgramUniform1d          :: #force_inline proc "c" (program: u32, location: i32, v0: f64)                                         {        impl_ProgramUniform1d(program, location, v0);                                             }
+	ProgramUniform1dv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f64)                       {        impl_ProgramUniform1dv(program, location, count, value);                                  }
+	ProgramUniform1ui         :: #force_inline proc "c" (program: u32, location: i32, v0: u32)                                         {        impl_ProgramUniform1ui(program, location, v0);                                            }
+	ProgramUniform1uiv        :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]u32)                       {        impl_ProgramUniform1uiv(program, location, count, value);                                 }
+	ProgramUniform2i          :: #force_inline proc "c" (program: u32, location: i32, v0: i32, v1: i32)                                {        impl_ProgramUniform2i(program, location, v0, v1);                                         }
+	ProgramUniform2iv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]i32)                       {        impl_ProgramUniform2iv(program, location, count, value);                                  }
+	ProgramUniform2f          :: #force_inline proc "c" (program: u32, location: i32, v0: f32, v1: f32)                                {        impl_ProgramUniform2f(program, location, v0, v1);                                         }
+	ProgramUniform2fv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f32)                       {        impl_ProgramUniform2fv(program, location, count, value);                                  }
+	ProgramUniform2d          :: #force_inline proc "c" (program: u32, location: i32, v0: f64, v1: f64)                                {        impl_ProgramUniform2d(program, location, v0, v1);                                         }
+	ProgramUniform2dv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f64)                       {        impl_ProgramUniform2dv(program, location, count, value);                                  }
+	ProgramUniform2ui         :: #force_inline proc "c" (program: u32, location: i32, v0: u32, v1: u32)                                {        impl_ProgramUniform2ui(program, location, v0, v1);                                        }
+	ProgramUniform2uiv        :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]u32)                       {        impl_ProgramUniform2uiv(program, location, count, value);                                 }
+	ProgramUniform3i          :: #force_inline proc "c" (program: u32, location: i32, v0: i32, v1: i32, v2: i32)                       {        impl_ProgramUniform3i(program, location, v0, v1, v2);                                     }
+	ProgramUniform3iv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]i32)                       {        impl_ProgramUniform3iv(program, location, count, value);                                  }
+	ProgramUniform3f          :: #force_inline proc "c" (program: u32, location: i32, v0: f32, v1: f32, v2: f32)                       {        impl_ProgramUniform3f(program, location, v0, v1, v2);                                     }
+	ProgramUniform3fv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f32)                       {        impl_ProgramUniform3fv(program, location, count, value);                                  }
+	ProgramUniform3d          :: #force_inline proc "c" (program: u32, location: i32, v0: f64, v1: f64, v2: f64)                       {        impl_ProgramUniform3d(program, location, v0, v1, v2);                                     }
+	ProgramUniform3dv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f64)                       {        impl_ProgramUniform3dv(program, location, count, value);                                  }
+	ProgramUniform3ui         :: #force_inline proc "c" (program: u32, location: i32, v0: u32, v1: u32, v2: u32)                       {        impl_ProgramUniform3ui(program, location, v0, v1, v2);                                    }
+	ProgramUniform3uiv        :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]u32)                       {        impl_ProgramUniform3uiv(program, location, count, value);                                 }
+	ProgramUniform4i          :: #force_inline proc "c" (program: u32, location: i32, v0: i32, v1: i32, v2: i32, v3: i32)              {        impl_ProgramUniform4i(program, location, v0, v1, v2, v3);                                 }
+	ProgramUniform4iv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]i32)                       {        impl_ProgramUniform4iv(program, location, count, value);                                  }
+	ProgramUniform4f          :: #force_inline proc "c" (program: u32, location: i32, v0: f32, v1: f32, v2: f32, v3: f32)              {        impl_ProgramUniform4f(program, location, v0, v1, v2, v3);                                 }
+	ProgramUniform4fv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f32)                       {        impl_ProgramUniform4fv(program, location, count, value);                                  }
+	ProgramUniform4d          :: #force_inline proc "c" (program: u32, location: i32, v0: f64, v1: f64, v2: f64, v3: f64)              {        impl_ProgramUniform4d(program, location, v0, v1, v2, v3);                                 }
+	ProgramUniform4dv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f64)                       {        impl_ProgramUniform4dv(program, location, count, value);                                  }
+	ProgramUniform4ui         :: #force_inline proc "c" (program: u32, location: i32, v0: u32, v1: u32, v2: u32, v3: u32)              {        impl_ProgramUniform4ui(program, location, v0, v1, v2, v3);                                }
+	ProgramUniform4uiv        :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]u32)                       {        impl_ProgramUniform4uiv(program, location, count, value);                                 }
+	ProgramUniformMatrix2fv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32)      {        impl_ProgramUniformMatrix2fv(program, location, count, transpose, value);                 }
+	ProgramUniformMatrix3fv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32)      {        impl_ProgramUniformMatrix3fv(program, location, count, transpose, value);                 }
+	ProgramUniformMatrix4fv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32)      {        impl_ProgramUniformMatrix4fv(program, location, count, transpose, value);                 }
+	ProgramUniformMatrix2dv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64)      {        impl_ProgramUniformMatrix2dv(program, location, count, transpose, value);                 }
+	ProgramUniformMatrix3dv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64)      {        impl_ProgramUniformMatrix3dv(program, location, count, transpose, value);                 }
+	ProgramUniformMatrix4dv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64)      {        impl_ProgramUniformMatrix4dv(program, location, count, transpose, value);                 }
+	ProgramUniformMatrix2x3fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32)      {        impl_ProgramUniformMatrix2x3fv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix3x2fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32)      {        impl_ProgramUniformMatrix3x2fv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix2x4fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32)      {        impl_ProgramUniformMatrix2x4fv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix4x2fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32)      {        impl_ProgramUniformMatrix4x2fv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix3x4fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32)      {        impl_ProgramUniformMatrix3x4fv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix4x3fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32)      {        impl_ProgramUniformMatrix4x3fv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix2x3dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64)      {        impl_ProgramUniformMatrix2x3dv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix3x2dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64)      {        impl_ProgramUniformMatrix3x2dv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix2x4dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64)      {        impl_ProgramUniformMatrix2x4dv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix4x2dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64)      {        impl_ProgramUniformMatrix4x2dv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix3x4dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64)      {        impl_ProgramUniformMatrix3x4dv(program, location, count, transpose, value);               }
+	ProgramUniformMatrix4x3dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64)      {        impl_ProgramUniformMatrix4x3dv(program, location, count, transpose, value);               }
+	ValidateProgramPipeline   :: #force_inline proc "c" (pipeline: u32)                                                                {        impl_ValidateProgramPipeline(pipeline);                                                   }
+	GetProgramPipelineInfoLog :: #force_inline proc "c" (pipeline: u32, bufSize: i32, length: ^i32, infoLog: [^]u8)                    {        impl_GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);                       }
+	VertexAttribL1d           :: #force_inline proc "c" (index: u32, x: f64)                                                           {        impl_VertexAttribL1d(index, x);                                                           }
+	VertexAttribL2d           :: #force_inline proc "c" (index: u32, x: f64, y: f64)                                                   {        impl_VertexAttribL2d(index, x, y);                                                        }
+	VertexAttribL3d           :: #force_inline proc "c" (index: u32, x: f64, y: f64, z: f64)                                           {        impl_VertexAttribL3d(index, x, y, z);                                                     }
+	VertexAttribL4d           :: #force_inline proc "c" (index: u32, x: f64, y: f64, z: f64, w: f64)                                   {        impl_VertexAttribL4d(index, x, y, z, w);                                                  }
+	VertexAttribL1dv          :: #force_inline proc "c" (index: u32, v: ^f64)                                                          {        impl_VertexAttribL1dv(index, v);                                                          }
+	VertexAttribL2dv          :: #force_inline proc "c" (index: u32, v: ^f64)                                                          {        impl_VertexAttribL2dv(index, v);                                                          }
+	VertexAttribL3dv          :: #force_inline proc "c" (index: u32, v: ^f64)                                                          {        impl_VertexAttribL3dv(index, v);                                                          }
+	VertexAttribL4dv          :: #force_inline proc "c" (index: u32, v: ^f64)                                                          {        impl_VertexAttribL4dv(index, v);                                                          }
+	VertexAttribLPointer      :: #force_inline proc "c" (index: u32, size: i32, type: u32, stride: i32, pointer: rawptr)               {        impl_VertexAttribLPointer(index, size, type, stride, pointer);                           }
+	GetVertexAttribLdv        :: #force_inline proc "c" (index: u32, pname: u32, params: [^]f64)                                       {        impl_GetVertexAttribLdv(index, pname, params);                                            }
+	ViewportArrayv            :: #force_inline proc "c" (first: u32, count: i32, v: [^]f32)                                            {        impl_ViewportArrayv(first, count, v);                                                     }
+	ViewportIndexedf          :: #force_inline proc "c" (index: u32, x: f32, y: f32, w: f32, h: f32)                                   {        impl_ViewportIndexedf(index, x, y, w, h);                                                 }
+	ViewportIndexedfv         :: #force_inline proc "c" (index: u32, v: ^f32)                                                          {        impl_ViewportIndexedfv(index, v);                                                         }
+	ScissorArrayv             :: #force_inline proc "c" (first: u32, count: i32, v: [^]i32)                                            {        impl_ScissorArrayv(first, count, v);                                                      }
+	ScissorIndexed            :: #force_inline proc "c" (index: u32, left: i32, bottom: i32, width: i32, height: i32)                  {        impl_ScissorIndexed(index, left, bottom, width, height);                                  }
+	ScissorIndexedv           :: #force_inline proc "c" (index: u32, v: ^i32)                                                          {        impl_ScissorIndexedv(index, v);                                                           }
+	DepthRangeArrayv          :: #force_inline proc "c" (first: u32, count: i32, v: [^]f64)                                            {        impl_DepthRangeArrayv(first, count, v);                                                   }
+	DepthRangeIndexed         :: #force_inline proc "c" (index: u32, n: f64, f: f64)                                                   {        impl_DepthRangeIndexed(index, n, f);                                                      }
+	GetFloati_v               :: #force_inline proc "c" (target: u32, index: u32, data: ^f32)                                          {        impl_GetFloati_v(target, index, data);                                                    }
+	GetDoublei_v              :: #force_inline proc "c" (target: u32, index: u32, data: ^f64)                                          {        impl_GetDoublei_v(target, index, data);                                                   }
+
+	// VERSION_4_2
+	DrawArraysInstancedBaseInstance             :: #force_inline proc "c" (mode: u32, first: i32, count: i32, instancecount: i32, baseinstance: u32)                                   { impl_DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);                                  }
+	DrawElementsInstancedBaseInstance           :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32, baseinstance: u32)                   { impl_DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);                       }
+	DrawElementsInstancedBaseVertexBaseInstance :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32, basevertex: i32, baseinstance: u32)  { impl_DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance); }
+	GetInternalformativ                         :: #force_inline proc "c" (target: u32, internalformat: u32, pname: u32, bufSize: i32, params: [^]i32)                                 { impl_GetInternalformativ(target, internalformat, pname, bufSize, params);                                               }
+	GetActiveAtomicCounterBufferiv              :: #force_inline proc "c" (program: u32, bufferIndex: u32, pname: u32, params: [^]i32)                                                 { impl_GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);                                               }
+	BindImageTexture                            :: #force_inline proc "c" (unit: u32, texture: u32, level: i32, layered: u8, layer: i32, access: u32, format: u32)                     { impl_BindImageTexture(unit, texture, level, layered, layer, access, format);                                            }
+	MemoryBarrier                               :: #force_inline proc "c" (barriers: u32)                                                                                              { impl_MemoryBarrier(barriers);                                                                                           }
+	TexStorage1D                                :: #force_inline proc "c" (target: u32, levels: i32, internalformat: u32, width: i32)                                                  { impl_TexStorage1D(target, levels, internalformat, width);                                                               }
+	TexStorage2D                                :: #force_inline proc "c" (target: u32, levels: i32, internalformat: u32, width: i32, height: i32)                                     { impl_TexStorage2D(target, levels, internalformat, width, height);                                                       }
+	TexStorage3D                                :: #force_inline proc "c" (target: u32, levels: i32, internalformat: u32, width: i32, height: i32, depth: i32)                         { impl_TexStorage3D(target, levels, internalformat, width, height, depth);                                                }
+	DrawTransformFeedbackInstanced              :: #force_inline proc "c" (mode: u32, id: u32, instancecount: i32)                                                                     { impl_DrawTransformFeedbackInstanced(mode, id, instancecount);                                                           }
+	DrawTransformFeedbackStreamInstanced        :: #force_inline proc "c" (mode: u32, id: u32, stream: u32, instancecount: i32)                                                        { impl_DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);                                             }
+
+	// VERSION_4_3
+	ClearBufferData                 :: #force_inline proc "c" (target: u32, internalformat: u32, format: u32, type: u32, data: rawptr)                                                                                                                                   {        impl_ClearBufferData(target, internalformat, format, type, data);                                                                                                }
+	ClearBufferSubData              :: #force_inline proc "c" (target: u32, internalformat: u32, offset: int, size: int, format: u32, type: u32, data: rawptr)                                                                                                           {        impl_ClearBufferSubData(target, internalformat, offset, size, format, type, data);                                                                               }
+	DispatchCompute                 :: #force_inline proc "c" (num_groups_x: u32, num_groups_y: u32, num_groups_z: u32)                                                                                                                                                  {        impl_DispatchCompute(num_groups_x, num_groups_y, num_groups_z);                                                                                                   }
+	DispatchComputeIndirect         :: #force_inline proc "c" (indirect: int)                                                                                                                                                                                            {        impl_DispatchComputeIndirect(indirect);                                                                                                                           }
+	CopyImageSubData                :: #force_inline proc "c" (srcName: u32, srcTarget: u32, srcLevel: i32, srcX: i32, srcY: i32, srcZ: i32, dstName: u32, dstTarget: u32, dstLevel: i32, dstX: i32, dstY: i32, dstZ: i32, srcWidth: i32, srcHeight: i32, srcDepth: i32) {        impl_CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);             }
+	FramebufferParameteri           :: #force_inline proc "c" (target: u32, pname: u32, param: i32)                                                                                                                                                                      {        impl_FramebufferParameteri(target, pname, param);                                                                                                                 }
+	GetFramebufferParameteriv       :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32)                                                                                                                                                                  {        impl_GetFramebufferParameteriv(target, pname, params);                                                                                                            }
+	GetInternalformati64v           :: #force_inline proc "c" (target: u32, internalformat: u32, pname: u32, bufSize: i32, params: [^]i64)                                                                                                                               {        impl_GetInternalformati64v(target, internalformat, pname, bufSize, params);                                                                                       }
+	InvalidateTexSubImage           :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32)                                                                                                  {        impl_InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);                                                                      }
+	InvalidateTexImage              :: #force_inline proc "c" (texture: u32, level: i32)                                                                                                                                                                                 {        impl_InvalidateTexImage(texture, level);                                                                                                                          }
+	InvalidateBufferSubData         :: #force_inline proc "c" (buffer: u32, offset: int, length: int)                                                                                                                                                                    {        impl_InvalidateBufferSubData(buffer, offset, length);                                                                                                             }
+	InvalidateBufferData            :: #force_inline proc "c" (buffer: u32)                                                                                                                                                                                              {        impl_InvalidateBufferData(buffer);                                                                                                                                }
+	InvalidateFramebuffer           :: #force_inline proc "c" (target: u32, numAttachments: i32, attachments: ^u32)                                                                                                                                                      {        impl_InvalidateFramebuffer(target, numAttachments, attachments);                                                                                                  }
+	InvalidateSubFramebuffer        :: #force_inline proc "c" (target: u32, numAttachments: i32, attachments: ^u32, x: i32, y: i32, width: i32, height: i32)                                                                                                             {        impl_InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);                                                                          }
+	MultiDrawArraysIndirect         :: #force_inline proc "c" (mode: u32, indirect: rawptr, drawcount: i32, stride: i32)                                                                                                                                                 {        impl_MultiDrawArraysIndirect(mode, indirect, drawcount, stride);                                                                                                  }
+	MultiDrawElementsIndirect       :: #force_inline proc "c" (mode: u32, type: u32, indirect: rawptr, drawcount: i32, stride: i32)                                                                                                                                      {        impl_MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);                                                                                         }
+	GetProgramInterfaceiv           :: #force_inline proc "c" (program: u32, programInterface: u32, pname: u32, params: [^]i32)                                                                                                                                          {        impl_GetProgramInterfaceiv(program, programInterface, pname, params);                                                                                             }
+	GetProgramResourceIndex         :: #force_inline proc "c" (program: u32, programInterface: u32, name: cstring) -> u32                                                                                                                                                { ret := impl_GetProgramResourceIndex(program, programInterface, name) ;                                                                                       return ret; }
+	GetProgramResourceName          :: #force_inline proc "c" (program: u32, programInterface: u32, index: u32, bufSize: i32, length: ^i32, name: [^]u8)                                                                                                                 {        impl_GetProgramResourceName(program, programInterface, index, bufSize, length, name);                                                                             }
+	GetProgramResourceiv            :: #force_inline proc "c" (program: u32, programInterface: u32, index: u32, propCount: i32, props: [^]u32, bufSize: i32, length: ^i32, params: [^]i32)                                                                               {        impl_GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);                                                           }
+	GetProgramResourceLocation      :: #force_inline proc "c" (program: u32, programInterface: u32, name: cstring) -> i32                                                                                                                                                { ret := impl_GetProgramResourceLocation(program, programInterface, name);                                                                                     return ret; }
+	GetProgramResourceLocationIndex :: #force_inline proc "c" (program: u32, programInterface: u32, name: cstring) -> i32                                                                                                                                                { ret := impl_GetProgramResourceLocationIndex(program, programInterface, name);                                                                                return ret; }
+	ShaderStorageBlockBinding       :: #force_inline proc "c" (program: u32, storageBlockIndex: u32, storageBlockBinding: u32)                                                                                                                                           {        impl_ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);                                                                                  }
+	TexBufferRange                  :: #force_inline proc "c" (target: u32, internalformat: u32, buffer: u32, offset: int, size: int)                                                                                                                                    {        impl_TexBufferRange(target, internalformat, buffer, offset, size);                                                                                                }
+	TexStorage2DMultisample         :: #force_inline proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: u8)                                                                                                        {        impl_TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);                                                               }
+	TexStorage3DMultisample         :: #force_inline proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: u8)                                                                                            {        impl_TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);                                                        }
+	TextureView                     :: #force_inline proc "c" (texture: u32, target: u32, origtexture: u32, internalformat: u32, minlevel: u32, numlevels: u32, minlayer: u32, numlayers: u32)                                                                           {        impl_TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);                                                         }
+	BindVertexBuffer                :: #force_inline proc "c" (bindingindex: u32, buffer: u32, offset: int, stride: i32)                                                                                                                                                 {        impl_BindVertexBuffer(bindingindex, buffer, offset, stride);                                                                                                      }
+	VertexAttribFormat              :: #force_inline proc "c" (attribindex: u32, size: i32, type: u32, normalized: bool, relativeoffset: u32)                                                                                                                            {        impl_VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);                                                                                    }
+	VertexAttribIFormat             :: #force_inline proc "c" (attribindex: u32, size: i32, type: u32, relativeoffset: u32)                                                                                                                                              {        impl_VertexAttribIFormat(attribindex, size, type, relativeoffset);                                                                                               }
+	VertexAttribLFormat             :: #force_inline proc "c" (attribindex: u32, size: i32, type: u32, relativeoffset: u32)                                                                                                                                              {        impl_VertexAttribLFormat(attribindex, size, type, relativeoffset);                                                                                               }
+	VertexAttribBinding             :: #force_inline proc "c" (attribindex: u32, bindingindex: u32)                                                                                                                                                                      {        impl_VertexAttribBinding(attribindex, bindingindex);                                                                                                              }
+	VertexBindingDivisor            :: #force_inline proc "c" (bindingindex: u32, divisor: u32)                                                                                                                                                                          {        impl_VertexBindingDivisor(bindingindex, divisor);                                                                                                                 }
+	DebugMessageControl             :: #force_inline proc "c" (source: u32, type: u32, severity: u32, count: i32, ids: [^]u32, enabled: u8)                                                                                                                              {        impl_DebugMessageControl(source, type, severity, count, ids, enabled);                                                                                           }
+	DebugMessageInsert              :: #force_inline proc "c" (source: u32, type: u32, id: u32, severity: u32, length: i32, buf: ^u8)                                                                                                                                    {        impl_DebugMessageInsert(source, type, id, severity, length, buf);                                                                                                }
+	DebugMessageCallback            :: #force_inline proc "c" (callback: debug_proc_t, userParam: rawptr)                                                                                                                                                                {        impl_DebugMessageCallback(callback, userParam);                                                                                                                   }
+	GetDebugMessageLog              :: #force_inline proc "c" (count: u32, bufSize: i32, sources: [^]u32, types: [^]u32, ids: [^]u32, severities: [^]u32, lengths: [^]i32, messageLog: [^]u8) -> u32                                                                     { ret := impl_GetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);                                                        return ret; }
+	PushDebugGroup                  :: #force_inline proc "c" (source: u32, id: u32, length: i32, message: cstring)                                                                                                                                                      {        impl_PushDebugGroup(source, id, length, message);                                                                                                                 }
+	PopDebugGroup                   :: #force_inline proc "c" ()                                                                                                                                                                                                         {        impl_PopDebugGroup();                                                                                                                                             }
+	ObjectLabel                     :: #force_inline proc "c" (identifier: u32, name: u32, length: i32, label: [^]u8)                                                                                                                                                    {        impl_ObjectLabel(identifier, name, length, label);                                                                                                                }
+	GetObjectLabel                  :: #force_inline proc "c" (identifier: u32, name: u32, bufSize: i32, length: ^i32, label: [^]u8)                                                                                                                                     {        impl_GetObjectLabel(identifier, name, bufSize, length, label);                                                                                                    }
+	ObjectPtrLabel                  :: #force_inline proc "c" (ptr: rawptr, length: i32, label: [^]u8)                                                                                                                                                                   {        impl_ObjectPtrLabel(ptr, length, label);                                                                                                                          }
+	GetObjectPtrLabel               :: #force_inline proc "c" (ptr: rawptr, bufSize: i32, length: ^i32, label: [^]u8)                                                                                                                                                    {        impl_GetObjectPtrLabel(ptr, bufSize, length, label);                                                                                                              }
+
+	// VERSION_4_4
+	BufferStorage     :: #force_inline proc "c" (target: u32, size: int, data: rawptr, flags: u32)                                                                                              { impl_BufferStorage(target, size, data, flags);                                                               }
+	ClearTexImage     :: #force_inline proc "c" (texture: u32, level: i32, format: u32, type: u32, data: rawptr)                                                                                { impl_ClearTexImage(texture, level, format, type, data);                                                     }
+	ClearTexSubImage  :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, data: rawptr) { impl_ClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); }
+	BindBuffersBase   :: #force_inline proc "c" (target: u32, first: u32, count: i32, buffers: [^]u32)                                                                                          { impl_BindBuffersBase(target, first, count, buffers);                                                         }
+	BindBuffersRange  :: #force_inline proc "c" (target: u32, first: u32, count: i32, buffers: [^]u32, offsets: [^]uintptr, sizes: [^]int)                                                      { impl_BindBuffersRange(target, first, count, buffers, offsets, sizes);                                        }
+	BindTextures      :: #force_inline proc "c" (first: u32, count: i32, textures: [^]u32)                                                                                                      { impl_BindTextures(first, count, textures);                                                                   }
+	BindSamplers      :: #force_inline proc "c" (first: u32, count: i32, samplers: [^]u32)                                                                                                      { impl_BindSamplers(first, count, samplers);                                                                   }
+	BindImageTextures :: #force_inline proc "c" (first: u32, count: i32, textures: [^]u32)                                                                                                      { impl_BindImageTextures(first, count, textures);                                                              }
+	BindVertexBuffers :: #force_inline proc "c" (first: u32, count: i32, buffers: [^]u32, offsets: [^]uintptr, strides: [^]i32)                                                                 { impl_BindVertexBuffers(first, count, buffers, offsets, strides);                                             }
+
+	// VERSION_4_5
+	ClipControl                              :: #force_inline proc "c" (origin: u32, depth: u32)                                                                                                                                            {        impl_ClipControl(origin, depth);                                                                                                               }
+	CreateTransformFeedbacks                 :: #force_inline proc "c" (n: i32, ids: [^]u32)                                                                                                                                                {        impl_CreateTransformFeedbacks(n, ids);                                                                                                         }
+	TransformFeedbackBufferBase              :: #force_inline proc "c" (xfb: u32, index: u32, buffer: u32)                                                                                                                                  {        impl_TransformFeedbackBufferBase(xfb, index, buffer);                                                                                          }
+	TransformFeedbackBufferRange             :: #force_inline proc "c" (xfb: u32, index: u32, buffer: u32, offset: int, size: int)                                                                                                          {        impl_TransformFeedbackBufferRange(xfb, index, buffer, offset, size);                                                                           }
+	GetTransformFeedbackiv                   :: #force_inline proc "c" (xfb: u32, pname: u32, param: ^i32)                                                                                                                                  {        impl_GetTransformFeedbackiv(xfb, pname, param);                                                                                                }
+	GetTransformFeedbacki_v                  :: #force_inline proc "c" (xfb: u32, pname: u32, index: u32, param: ^i32)                                                                                                                      {        impl_GetTransformFeedbacki_v(xfb, pname, index, param);                                                                                        }
+	GetTransformFeedbacki64_v                :: #force_inline proc "c" (xfb: u32, pname: u32, index: u32, param: ^i64)                                                                                                                      {        impl_GetTransformFeedbacki64_v(xfb, pname, index, param);                                                                                      }
+	CreateBuffers                            :: #force_inline proc "c" (n: i32, buffers: [^]u32)                                                                                                                                            {        impl_CreateBuffers(n, buffers);                                                                                                                }
+	NamedBufferStorage                       :: #force_inline proc "c" (buffer: u32, size: int, data: rawptr, flags: u32)                                                                                                                   {        impl_NamedBufferStorage(buffer, size, data, flags);                                                                                            }
+	NamedBufferData                          :: #force_inline proc "c" (buffer: u32, size: int, data: rawptr, usage: u32)                                                                                                                   {        impl_NamedBufferData(buffer, size, data, usage);                                                                                               }
+	NamedBufferSubData                       :: #force_inline proc "c" (buffer: u32, offset: int, size: int, data: rawptr)                                                                                                                  {        impl_NamedBufferSubData(buffer, offset, size, data);                                                                                           }
+	CopyNamedBufferSubData                   :: #force_inline proc "c" (readBuffer: u32, writeBuffer: u32, readOffset: int, writeOffset: int, size: int)                                                                                    {        impl_CopyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size);                                                           }
+	ClearNamedBufferData                     :: #force_inline proc "c" (buffer: u32, internalformat: u32, format: u32, type: u32, data: rawptr)                                                                                             {        impl_ClearNamedBufferData(buffer, internalformat, format, type, data);                                                                        }
+	ClearNamedBufferSubData                  :: #force_inline proc "c" (buffer: u32, internalformat: u32, offset: int, size: int, format: u32, type: u32, data: rawptr)                                                                     {        impl_ClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data);                                                       }
+	MapNamedBuffer                           :: #force_inline proc "c" (buffer: u32, access: u32) -> rawptr                                                                                                                                 { ret := impl_MapNamedBuffer(buffer, access);                                                                                               return ret; }
+	MapNamedBufferRange                      :: #force_inline proc "c" (buffer: u32, offset: int, length: int, access: u32) -> rawptr                                                                                                       { ret := impl_MapNamedBufferRange(buffer, offset, length, access);                                                                          return ret; }
+	UnmapNamedBuffer                         :: #force_inline proc "c" (buffer: u32) -> bool                                                                                                                                                { ret := impl_UnmapNamedBuffer(buffer);                                                                                                     return ret; }
+	FlushMappedNamedBufferRange              :: #force_inline proc "c" (buffer: u32, offset: int, length: int)                                                                                                                              {        impl_FlushMappedNamedBufferRange(buffer, offset, length);                                                                                      }
+	GetNamedBufferParameteriv                :: #force_inline proc "c" (buffer: u32, pname: u32, params: [^]i32)                                                                                                                            {        impl_GetNamedBufferParameteriv(buffer, pname, params);                                                                                         }
+	GetNamedBufferParameteri64v              :: #force_inline proc "c" (buffer: u32, pname: u32, params: [^]i64)                                                                                                                            {        impl_GetNamedBufferParameteri64v(buffer, pname, params);                                                                                       }
+	GetNamedBufferPointerv                   :: #force_inline proc "c" (buffer: u32, pname: u32, params: [^]rawptr)                                                                                                                         {        impl_GetNamedBufferPointerv(buffer, pname, params);                                                                                            }
+	GetNamedBufferSubData                    :: #force_inline proc "c" (buffer: u32, offset: int, size: int, data: rawptr)                                                                                                                  {        impl_GetNamedBufferSubData(buffer, offset, size, data);                                                                                        }
+	CreateFramebuffers                       :: #force_inline proc "c" (n: i32, framebuffers: [^]u32)                                                                                                                                       {        impl_CreateFramebuffers(n, framebuffers);                                                                                                      }
+	NamedFramebufferRenderbuffer             :: #force_inline proc "c" (framebuffer: u32, attachment: u32, renderbuffertarget: u32, renderbuffer: u32)                                                                                      {        impl_NamedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer);                                                  }
+	NamedFramebufferParameteri               :: #force_inline proc "c" (framebuffer: u32, pname: u32, param: i32)                                                                                                                           {        impl_NamedFramebufferParameteri(framebuffer, pname, param);                                                                                    }
+	NamedFramebufferTexture                  :: #force_inline proc "c" (framebuffer: u32, attachment: u32, texture: u32, level: i32)                                                                                                        {        impl_NamedFramebufferTexture(framebuffer, attachment, texture, level);                                                                         }
+	NamedFramebufferTextureLayer             :: #force_inline proc "c" (framebuffer: u32, attachment: u32, texture: u32, level: i32, layer: i32)                                                                                            {        impl_NamedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer);                                                             }
+	NamedFramebufferDrawBuffer               :: #force_inline proc "c" (framebuffer: u32, buf: u32)                                                                                                                                         {        impl_NamedFramebufferDrawBuffer(framebuffer, buf);                                                                                             }
+	NamedFramebufferDrawBuffers              :: #force_inline proc "c" (framebuffer: u32, n: i32, bufs: [^]u32)                                                                                                                             {        impl_NamedFramebufferDrawBuffers(framebuffer, n, bufs);                                                                                        }
+	NamedFramebufferReadBuffer               :: #force_inline proc "c" (framebuffer: u32, src: u32)                                                                                                                                         {        impl_NamedFramebufferReadBuffer(framebuffer, src);                                                                                             }
+	InvalidateNamedFramebufferData           :: #force_inline proc "c" (framebuffer: u32, numAttachments: i32, attachments: ^u32)                                                                                                           {        impl_InvalidateNamedFramebufferData(framebuffer, numAttachments, attachments);                                                                 }
+	InvalidateNamedFramebufferSubData        :: #force_inline proc "c" (framebuffer: u32, numAttachments: i32, attachments: ^u32, x: i32, y: i32, width: i32, height: i32)                                                                  {        impl_InvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height);                                         }
+	ClearNamedFramebufferiv                  :: #force_inline proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, value: ^i32)                                                                                                        {        impl_ClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value);                                                                          }
+	ClearNamedFramebufferuiv                 :: #force_inline proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, value: ^u32)                                                                                                        {        impl_ClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value);                                                                         }
+	ClearNamedFramebufferfv                  :: #force_inline proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, value: ^f32)                                                                                                        {        impl_ClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value);                                                                          }
+	ClearNamedFramebufferfi                  :: #force_inline proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, depth: f32, stencil: i32)                                                                                           {        impl_ClearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, stencil);                                                                 }
+	BlitNamedFramebuffer                     :: #force_inline proc "c" (readFramebuffer: u32, drawFramebuffer: u32, srcX0: i32, srcY0: i32, srcX1: i32, srcY1: i32, dstX0: i32, dstY0: i32, dstX1: i32, dstY1: i32, mask: u32, filter: u32) {        impl_BlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);             }
+	CheckNamedFramebufferStatus              :: #force_inline proc "c" (framebuffer: u32, target: u32) -> u32                                                                                                                               { ret := impl_CheckNamedFramebufferStatus(framebuffer, target);                                                                             return ret; }
+	GetNamedFramebufferParameteriv           :: #force_inline proc "c" (framebuffer: u32, pname: u32, param: ^i32)                                                                                                                          {        impl_GetNamedFramebufferParameteriv(framebuffer, pname, param);                                                                                }
+	GetNamedFramebufferAttachmentParameteriv :: #force_inline proc "c" (framebuffer: u32, attachment: u32, pname: u32, params: [^]i32)                                                                                                      {        impl_GetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);                                                         }
+	CreateRenderbuffers                      :: #force_inline proc "c" (n: i32, renderbuffers: [^]u32)                                                                                                                                      {        impl_CreateRenderbuffers(n, renderbuffers);                                                                                                    }
+	NamedRenderbufferStorage                 :: #force_inline proc "c" (renderbuffer: u32, internalformat: u32, width: i32, height: i32)                                                                                                    {        impl_NamedRenderbufferStorage(renderbuffer, internalformat, width, height);                                                                    }
+	NamedRenderbufferStorageMultisample      :: #force_inline proc "c" (renderbuffer: u32, samples: i32, internalformat: u32, width: i32, height: i32)                                                                                      {        impl_NamedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height);                                                }
+	GetNamedRenderbufferParameteriv          :: #force_inline proc "c" (renderbuffer: u32, pname: u32, params: [^]i32)                                                                                                                      {        impl_GetNamedRenderbufferParameteriv(renderbuffer, pname, params);                                                                             }
+	CreateTextures                           :: #force_inline proc "c" (target: u32, n: i32, textures: [^]u32)                                                                                                                              {        impl_CreateTextures(target, n, textures);                                                                                                      }
+	TextureBuffer                            :: #force_inline proc "c" (texture: u32, internalformat: u32, buffer: u32)                                                                                                                     {        impl_TextureBuffer(texture, internalformat, buffer);                                                                                           }
+	TextureBufferRange                       :: #force_inline proc "c" (texture: u32, internalformat: u32, buffer: u32, offset: int, size: int)                                                                                             {        impl_TextureBufferRange(texture, internalformat, buffer, offset, size);                                                                        }
+	TextureStorage1D                         :: #force_inline proc "c" (texture: u32, levels: i32, internalformat: u32, width: i32)                                                                                                         {        impl_TextureStorage1D(texture, levels, internalformat, width);                                                                                 }
+	TextureStorage2D                         :: #force_inline proc "c" (texture: u32, levels: i32, internalformat: u32, width: i32, height: i32)                                                                                            {        impl_TextureStorage2D(texture, levels, internalformat, width, height);                                                                         }
+	TextureStorage3D                         :: #force_inline proc "c" (texture: u32, levels: i32, internalformat: u32, width: i32, height: i32, depth: i32)                                                                                {        impl_TextureStorage3D(texture, levels, internalformat, width, height, depth);                                                                  }
+	TextureStorage2DMultisample              :: #force_inline proc "c" (texture: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: u8)                                                                 {        impl_TextureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations);                                       }
+	TextureStorage3DMultisample              :: #force_inline proc "c" (texture: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: u8)                                                     {        impl_TextureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations);                                }
+	TextureSubImage1D                        :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, width: i32, format: u32, type: u32, pixels: rawptr)                                                                         {        impl_TextureSubImage1D(texture, level, xoffset, width, format, type, pixels);                                                                 }
+	TextureSubImage2D                        :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, type: u32, pixels: rawptr)                                              {        impl_TextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels);                                                }
+	TextureSubImage3D                        :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, pixels: rawptr)                    {        impl_TextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);                                }
+	CompressedTextureSubImage1D              :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, width: i32, format: u32, imageSize: i32, data: rawptr)                                                                      {        impl_CompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data);                                                     }
+	CompressedTextureSubImage2D              :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, imageSize: i32, data: rawptr)                                           {        impl_CompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data);                                    }
+	CompressedTextureSubImage3D              :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, imageSize: i32, data: rawptr)                 {        impl_CompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);                    }
+	CopyTextureSubImage1D                    :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, x: i32, y: i32, width: i32)                                                                                                 {        impl_CopyTextureSubImage1D(texture, level, xoffset, x, y, width);                                                                              }
+	CopyTextureSubImage2D                    :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, x: i32, y: i32, width: i32, height: i32)                                                                      {        impl_CopyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height);                                                             }
+	CopyTextureSubImage3D                    :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, x: i32, y: i32, width: i32, height: i32)                                                        {        impl_CopyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height);                                                    }
+	TextureParameterf                        :: #force_inline proc "c" (texture: u32, pname: u32, param: f32)                                                                                                                               {        impl_TextureParameterf(texture, pname, param);                                                                                                 }
+	TextureParameterfv                       :: #force_inline proc "c" (texture: u32, pname: u32, param: ^f32)                                                                                                                              {        impl_TextureParameterfv(texture, pname, param);                                                                                                }
+	TextureParameteri                        :: #force_inline proc "c" (texture: u32, pname: u32, param: i32)                                                                                                                               {        impl_TextureParameteri(texture, pname, param);                                                                                                 }
+	TextureParameterIiv                      :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]i32)                                                                                                                           {        impl_TextureParameterIiv(texture, pname, params);                                                                                              }
+	TextureParameterIuiv                     :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]u32)                                                                                                                           {        impl_TextureParameterIuiv(texture, pname, params);                                                                                             }
+	TextureParameteriv                       :: #force_inline proc "c" (texture: u32, pname: u32, param: ^i32)                                                                                                                              {        impl_TextureParameteriv(texture, pname, param);                                                                                                }
+	GenerateTextureMipmap                    :: #force_inline proc "c" (texture: u32)                                                                                                                                                       {        impl_GenerateTextureMipmap(texture);                                                                                                           }
+	BindTextureUnit                          :: #force_inline proc "c" (unit: u32, texture: u32)                                                                                                                                            {        impl_BindTextureUnit(unit, texture);                                                                                                           }
+	GetTextureImage                          :: #force_inline proc "c" (texture: u32, level: i32, format: u32, type: u32, bufSize: i32, pixels: rawptr)                                                                                     {        impl_GetTextureImage(texture, level, format, type, bufSize, pixels);                                                                          }
+	GetCompressedTextureImage                :: #force_inline proc "c" (texture: u32, level: i32, bufSize: i32, pixels: rawptr)                                                                                                             {        impl_GetCompressedTextureImage(texture, level, bufSize, pixels);                                                                               }
+	GetTextureLevelParameterfv               :: #force_inline proc "c" (texture: u32, level: i32, pname: u32, params: [^]f32)                                                                                                               {        impl_GetTextureLevelParameterfv(texture, level, pname, params);                                                                                }
+	GetTextureLevelParameteriv               :: #force_inline proc "c" (texture: u32, level: i32, pname: u32, params: [^]i32)                                                                                                               {        impl_GetTextureLevelParameteriv(texture, level, pname, params);                                                                                }
+	GetTextureParameterfv                    :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]f32)                                                                                                                           {        impl_GetTextureParameterfv(texture, pname, params);                                                                                            }
+	GetTextureParameterIiv                   :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]i32)                                                                                                                           {        impl_GetTextureParameterIiv(texture, pname, params);                                                                                           }
+	GetTextureParameterIuiv                  :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]u32)                                                                                                                           {        impl_GetTextureParameterIuiv(texture, pname, params);                                                                                          }
+	GetTextureParameteriv                    :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]i32)                                                                                                                           {        impl_GetTextureParameteriv(texture, pname, params);                                                                                            }
+	CreateVertexArrays                       :: #force_inline proc "c" (n: i32, arrays: [^]u32)                                                                                                                                             {        impl_CreateVertexArrays(n, arrays);                                                                                                            }
+	DisableVertexArrayAttrib                 :: #force_inline proc "c" (vaobj: u32, index: u32)                                                                                                                                             {        impl_DisableVertexArrayAttrib(vaobj, index);                                                                                                   }
+	EnableVertexArrayAttrib                  :: #force_inline proc "c" (vaobj: u32, index: u32)                                                                                                                                             {        impl_EnableVertexArrayAttrib(vaobj, index);                                                                                                    }
+	VertexArrayElementBuffer                 :: #force_inline proc "c" (vaobj: u32, buffer: u32)                                                                                                                                            {        impl_VertexArrayElementBuffer(vaobj, buffer);                                                                                                  }
+	VertexArrayVertexBuffer                  :: #force_inline proc "c" (vaobj: u32, bindingindex: u32, buffer: u32, offset: int, stride: i32)                                                                                               {        impl_VertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride);                                                                     }
+	VertexArrayVertexBuffers                 :: #force_inline proc "c" (vaobj: u32, first: u32, count: i32, buffers: [^]u32, offsets: [^]uintptr, strides: [^]i32)                                                                          {        impl_VertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides);                                                                 }
+	VertexArrayAttribBinding                 :: #force_inline proc "c" (vaobj: u32, attribindex: u32, bindingindex: u32)                                                                                                                    {        impl_VertexArrayAttribBinding(vaobj, attribindex, bindingindex);                                                                               }
+	VertexArrayAttribFormat                  :: #force_inline proc "c" (vaobj: u32, attribindex: u32, size: i32, type: u32, normalized: bool, relativeoffset: u32)                                                                          {        impl_VertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset);                                                     }
+	VertexArrayAttribIFormat                 :: #force_inline proc "c" (vaobj: u32, attribindex: u32, size: i32, type: u32, relativeoffset: u32)                                                                                            {        impl_VertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset);                                                                }
+	VertexArrayAttribLFormat                 :: #force_inline proc "c" (vaobj: u32, attribindex: u32, size: i32, type: u32, relativeoffset: u32)                                                                                            {        impl_VertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset);                                                                }
+	VertexArrayBindingDivisor                :: #force_inline proc "c" (vaobj: u32, bindingindex: u32, divisor: u32)                                                                                                                        {        impl_VertexArrayBindingDivisor(vaobj, bindingindex, divisor);                                                                                  }
+	GetVertexArrayiv                         :: #force_inline proc "c" (vaobj: u32, pname: u32, param: ^i32)                                                                                                                                {        impl_GetVertexArrayiv(vaobj, pname, param);                                                                                                    }
+	GetVertexArrayIndexediv                  :: #force_inline proc "c" (vaobj: u32, index: u32, pname: u32, param: ^i32)                                                                                                                    {        impl_GetVertexArrayIndexediv(vaobj, index, pname, param);                                                                                      }
+	GetVertexArrayIndexed64iv                :: #force_inline proc "c" (vaobj: u32, index: u32, pname: u32, param: ^i64)                                                                                                                    {        impl_GetVertexArrayIndexed64iv(vaobj, index, pname, param);                                                                                    }
+	CreateSamplers                           :: #force_inline proc "c" (n: i32, samplers: [^]u32)                                                                                                                                           {        impl_CreateSamplers(n, samplers);                                                                                                              }
+	CreateProgramPipelines                   :: #force_inline proc "c" (n: i32, pipelines: [^]u32)                                                                                                                                          {        impl_CreateProgramPipelines(n, pipelines);                                                                                                     }
+	CreateQueries                            :: #force_inline proc "c" (target: u32, n: i32, ids: [^]u32)                                                                                                                                   {        impl_CreateQueries(target, n, ids);                                                                                                            }
+	GetQueryBufferObjecti64v                 :: #force_inline proc "c" (id: u32, buffer: u32, pname: u32, offset: int)                                                                                                                      {        impl_GetQueryBufferObjecti64v(id, buffer, pname, offset);                                                                                      }
+	GetQueryBufferObjectiv                   :: #force_inline proc "c" (id: u32, buffer: u32, pname: u32, offset: int)                                                                                                                      {        impl_GetQueryBufferObjectiv(id, buffer, pname, offset);                                                                                        }
+	GetQueryBufferObjectui64v                :: #force_inline proc "c" (id: u32, buffer: u32, pname: u32, offset: int)                                                                                                                      {        impl_GetQueryBufferObjectui64v(id, buffer, pname, offset);                                                                                     }
+	GetQueryBufferObjectuiv                  :: #force_inline proc "c" (id: u32, buffer: u32, pname: u32, offset: int)                                                                                                                      {        impl_GetQueryBufferObjectuiv(id, buffer, pname, offset);                                                                                       }
+	MemoryBarrierByRegion                    :: #force_inline proc "c" (barriers: u32)                                                                                                                                                      {        impl_MemoryBarrierByRegion(barriers);                                                                                                          }
+	GetTextureSubImage                       :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, bufSize: i32, pixels: rawptr)      {        impl_GetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);                      }
+	GetCompressedTextureSubImage             :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, bufSize: i32, pixels: rawptr)                              {        impl_GetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);                           }
+	GetGraphicsResetStatus                   :: #force_inline proc "c" () -> u32                                                                                                                                                            { ret := impl_GetGraphicsResetStatus();                                                                                                     return ret; }
+	GetnCompressedTexImage                   :: #force_inline proc "c" (target: u32, lod: i32, bufSize: i32, pixels: rawptr)                                                                                                                {        impl_GetnCompressedTexImage(target, lod, bufSize, pixels);                                                                                     }
+	GetnTexImage                             :: #force_inline proc "c" (target: u32, level: i32, format: u32, type: u32, bufSize: i32, pixels: rawptr)                                                                                      {        impl_GetnTexImage(target, level, format, type, bufSize, pixels);                                                                              }
+	GetnUniformdv                            :: #force_inline proc "c" (program: u32, location: i32, bufSize: i32, params: [^]f64)                                                                                                          {        impl_GetnUniformdv(program, location, bufSize, params);                                                                                        }
+	GetnUniformfv                            :: #force_inline proc "c" (program: u32, location: i32, bufSize: i32, params: [^]f32)                                                                                                          {        impl_GetnUniformfv(program, location, bufSize, params);                                                                                        }
+	GetnUniformiv                            :: #force_inline proc "c" (program: u32, location: i32, bufSize: i32, params: [^]i32)                                                                                                          {        impl_GetnUniformiv(program, location, bufSize, params);                                                                                        }
+	GetnUniformuiv                           :: #force_inline proc "c" (program: u32, location: i32, bufSize: i32, params: [^]u32)                                                                                                          {        impl_GetnUniformuiv(program, location, bufSize, params);                                                                                       }
+	ReadnPixels                              :: #force_inline proc "c" (x: i32, y: i32, width: i32, height: i32, format: u32, type: u32, bufSize: i32, data: rawptr)                                                                        {        impl_ReadnPixels(x, y, width, height, format, type, bufSize, data);                                                                           }
+	GetnMapdv                                :: #force_inline proc "c" (target: u32, query: u32, bufSize: i32, v: ^f64)                                                                                                                     {        impl_GetnMapdv(target, query, bufSize, v);                                                                                                     }
+	GetnMapfv                                :: #force_inline proc "c" (target: u32, query: u32, bufSize: i32, v: ^f32)                                                                                                                     {        impl_GetnMapfv(target, query, bufSize, v);                                                                                                     }
+	GetnMapiv                                :: #force_inline proc "c" (target: u32, query: u32, bufSize: i32, v: ^i32)                                                                                                                     {        impl_GetnMapiv(target, query, bufSize, v);                                                                                                     }
+	GetnPixelMapusv                          :: #force_inline proc "c" (map_: u32, bufSize: i32, values: [^]u16)                                                                                                                            {        impl_GetnPixelMapusv(map_, bufSize, values);                                                                                                   }
+	GetnPixelMapfv                           :: #force_inline proc "c" (map_: u32, bufSize: i32, values: [^]f32)                                                                                                                            {        impl_GetnPixelMapfv(map_, bufSize, values);                                                                                                    }
+	GetnPixelMapuiv                          :: #force_inline proc "c" (map_: u32, bufSize: i32, values: [^]u32)                                                                                                                            {        impl_GetnPixelMapuiv(map_, bufSize, values);                                                                                                   }
+	GetnPolygonStipple                       :: #force_inline proc "c" (bufSize: i32, pattern: ^u8)                                                                                                                                         {        impl_GetnPolygonStipple(bufSize, pattern);                                                                                                     }
+	GetnColorTable                           :: #force_inline proc "c" (target: u32, format: u32, type: u32, bufSize: i32, table: rawptr)                                                                                                   {        impl_GetnColorTable(target, format, type, bufSize, table);                                                                                    }
+	GetnConvolutionFilter                    :: #force_inline proc "c" (target: u32, format: u32, type: u32, bufSize: i32, image: rawptr)                                                                                                   {        impl_GetnConvolutionFilter(target, format, type, bufSize, image);                                                                             }
+	GetnSeparableFilter                      :: #force_inline proc "c" (target: u32, format: u32, type: u32, rowBufSize: i32, row: rawptr, columnBufSize: i32, column: rawptr, span: rawptr)                                                {        impl_GetnSeparableFilter(target, format, type, rowBufSize, row, columnBufSize, column, span);                                                 }
+	GetnHistogram                            :: #force_inline proc "c" (target: u32, reset: u8, format: u32, type: u32, bufSize: i32, values: rawptr)                                                                                       {        impl_GetnHistogram(target, reset, format, type, bufSize, values);                                                                             }
+	GetnMinmax                               :: #force_inline proc "c" (target: u32, reset: u8, format: u32, type: u32, bufSize: i32, values: rawptr)                                                                                       {        impl_GetnMinmax(target, reset, format, type, bufSize, values);                                                                                }
+	TextureBarrier                           :: #force_inline proc "c" ()                                                                                                                                                                   {        impl_TextureBarrier();                                                                                                                         }
+	GetUnsignedBytevEXT                      :: #force_inline proc "c" (pname: u32, data: ^byte)                                                                                                                                            {        impl_glGetUnsignedBytevEXT(pname, data);                                                                                                       }
+	TexPageCommitmentARB                     :: #force_inline proc "c"(
+		target: u32,
+		level: i32,
+		xoffset: i32,
+		yoffset: i32,
+		zoffset: i32,
+		width: i32,
+		height: i32,
+		depth: i32,
+		commit: bool,
+	) {
+		impl_TexPageCommitmentARB(target, level, xoffset, yoffset, zoffset, width, height, depth, commit);
+	}
+
+	// VERSION_4_6
+	SpecializeShader               :: #force_inline proc "c" (shader: u32, pEntryPoint: ^u8, numSpecializationConstants: u32, pConstantIndex: ^u32, pConstantValue: ^u32) { impl_SpecializeShader(shader, pEntryPoint, numSpecializationConstants, pConstantIndex, pConstantValue); }
+	MultiDrawArraysIndirectCount   :: #force_inline proc "c" (mode: i32, indirect: rawptr, drawcount: int, maxdrawcount, stride: i32)                                     { impl_MultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride);                     }
+	MultiDrawElementsIndirectCount :: #force_inline proc "c" (mode: i32, type: i32, indirect: rawptr, drawcount: int, maxdrawcount, stride: i32)                          { impl_MultiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride);            }
+	PolygonOffsetClamp             :: #force_inline proc "c" (factor, units, clamp: f32)                                                                                  { impl_PolygonOffsetClamp(factor, units, clamp);                                                          }
+} else {
+	import "core:runtime"
+	import "core:fmt"
+
+	debug_helper :: #force_inline proc"c"(from_loc: runtime.Source_Code_Location, num_ret: int, args: ..any, loc := #caller_location) {
+		context = runtime.default_context();
+
+		Error_Enum :: enum {
+			NO_ERROR = NO_ERROR,
+			INVALID_VALUE = INVALID_VALUE,
+			INVALID_ENUM = INVALID_ENUM,
+			INVALID_OPERATION = INVALID_OPERATION,
+			INVALID_FRAMEBUFFER_OPERATION = INVALID_FRAMEBUFFER_OPERATION,
+			OUT_OF_MEMORY = OUT_OF_MEMORY,
+			STACK_UNDERFLOW = STACK_UNDERFLOW,
+			STACK_OVERFLOW = STACK_OVERFLOW,
+			// TODO: What if the return enum is invalid?
+		};
+
+		// There can be multiple errors, so we're required to continuously call glGetError until there are no more errors
+		for i := 0; /**/; i += 1 {
+			err := cast(Error_Enum)impl_GetError();
+			if err == .NO_ERROR do break;
+
+			fmt.printf("%d: glGetError() returned GL_%v\n", i, err);
+
+			// add function call
+			fmt.printf("   call: gl%s(", loc.procedure);
+			{
+				// add input arguments
+				for arg, i in args[num_ret:] {
+				if i > 0 do fmt.printf(", ");
+
+				if v, ok := arg.(u32); ok { // TODO: Assumes all u32 are GLenum (they're not, GLbitfield and GLuint are also mapped to u32), fix later by better typing
+					if err == .INVALID_ENUM {
+						fmt.printf("INVALID_ENUM=%d", v);
+					} else {
+						fmt.printf("GL_%v=%d", GL_Enum(v), v);
+					}
+				} else {
+					fmt.printf("%v", arg);
+				}
+				}
+
+				// add return arguments
+				if num_ret == 1 {
+					fmt.printf(") -> %v \n", args[0]);
+				} else if num_ret > 1 {
+					fmt.printf(") -> (");
+					for arg, i in args[1:num_ret] {
+						if i > 0 do fmt.printf(", ");
+						fmt.printf("%v", arg);
+					}
+					fmt.printf(")\n");
+				} else {
+					fmt.printf(")\n");
+				}
+			}
+
+			// add location
+		    fmt.printf("   in:   %s(%d:%d)\n", from_loc.file_path, from_loc.line, from_loc.column);
+		}
+	}
+
+	CullFace               :: #force_inline proc "c" (mode: u32, loc := #caller_location)                                                                                         {        impl_CullFace(mode);                                                                         debug_helper(loc, 0, mode);                                                                                   }
+	FrontFace              :: #force_inline proc "c" (mode: u32, loc := #caller_location)                                                                                         {        impl_FrontFace(mode);                                                                        debug_helper(loc, 0, mode);                                                                                   }
+	Hint                   :: #force_inline proc "c" (target, mode: u32, loc := #caller_location)                                                                                 {        impl_Hint(target, mode);                                                                     debug_helper(loc, 0, target, mode);                                                                           }
+	LineWidth              :: #force_inline proc "c" (width: f32, loc := #caller_location)                                                                                        {        impl_LineWidth(width);                                                                       debug_helper(loc, 0, width);                                                                                  }
+	PointSize              :: #force_inline proc "c" (size: f32, loc := #caller_location)                                                                                         {        impl_PointSize(size);                                                                        debug_helper(loc, 0, size);                                                                                   }
+	PolygonMode            :: #force_inline proc "c" (face, mode: u32, loc := #caller_location)                                                                                   {        impl_PolygonMode(face, mode);                                                                debug_helper(loc, 0, face, mode);                                                                             }
+	Scissor                :: #force_inline proc "c" (x, y, width, height: i32, loc := #caller_location)                                                                          {        impl_Scissor(x, y, width, height);                                                           debug_helper(loc, 0, x, y, width, height);                                                                    }
+	TexParameterf          :: #force_inline proc "c" (target, pname: u32, param: f32, loc := #caller_location)                                                                    {        impl_TexParameterf(target, pname, param);                                                    debug_helper(loc, 0, target, pname, param);                                                                   }
+	TexParameterfv         :: #force_inline proc "c" (target, pname: u32, params: [^]f32, loc := #caller_location)                                                                {        impl_TexParameterfv(target, pname, params);                                                  debug_helper(loc, 0, target, pname, params);                                                                  }
+	TexParameteri          :: #force_inline proc "c" (target, pname: u32, param: i32, loc := #caller_location)                                                                    {        impl_TexParameteri(target, pname, param);                                                    debug_helper(loc, 0, target, pname, param);                                                                   }
+	TexParameteriv         :: #force_inline proc "c" (target, pname: u32, params: [^]i32, loc := #caller_location)                                                                {        impl_TexParameteriv(target, pname, params);                                                  debug_helper(loc, 0, target, pname, params);                                                                  }
+	TexImage1D             :: #force_inline proc "c" (target: u32, level, internalformat, width, border: i32, format, type: u32, pixels: rawptr, loc := #caller_location)         {        impl_TexImage1D(target, level, internalformat, width, border, format, type, pixels);         debug_helper(loc, 0, target, level, internalformat, width, border, format, type, pixels);                     }
+	TexImage2D             :: #force_inline proc "c" (target: u32, level, internalformat, width, height, border: i32, format, type: u32, pixels: rawptr, loc := #caller_location) {        impl_TexImage2D(target, level, internalformat, width, height, border, format, type, pixels); debug_helper(loc, 0, target, level, internalformat, width, height, border, format, type, pixels);             }
+	DrawBuffer             :: #force_inline proc "c" (buf: u32, loc := #caller_location)                                                                                          {        impl_DrawBuffer(buf);                                                                        debug_helper(loc, 0, buf);                                                                                    }
+	Clear                  :: #force_inline proc "c" (mask: u32, loc := #caller_location)                                                                                         {        impl_Clear(mask);                                                                            debug_helper(loc, 0, mask);                                                                                   }
+	ClearColor             :: #force_inline proc "c" (red, green, blue, alpha: f32, loc := #caller_location)                                                                      {        impl_ClearColor(red, green, blue, alpha);                                                    debug_helper(loc, 0, red, green, blue, alpha);                                                                }
+	ClearStencil           :: #force_inline proc "c" (s: i32, loc := #caller_location)                                                                                            {        impl_ClearStencil(s);                                                                        debug_helper(loc, 0, s);                                                                                      }
+	ClearDepth             :: #force_inline proc "c" (depth: f64, loc := #caller_location)                                                                                        {        impl_ClearDepth(depth);                                                                      debug_helper(loc, 0, depth);                                                                                  }
+	StencilMask            :: #force_inline proc "c" (mask: u32, loc := #caller_location)                                                                                         {        impl_StencilMask(mask);                                                                      debug_helper(loc, 0, mask);                                                                                   }
+	ColorMask              :: #force_inline proc "c" (red, green, blue, alpha: u8, loc := #caller_location)                                                                       {        impl_ColorMask(red, green, blue, alpha);                                                     debug_helper(loc, 0, red, green, blue, alpha);                                                                }
+	DepthMask              :: #force_inline proc "c" (flag: u8, loc := #caller_location)                                                                                          {        impl_DepthMask(flag);                                                                        debug_helper(loc, 0, flag);                                                                                   }
+	Disable                :: #force_inline proc "c" (cap: u32, loc := #caller_location)                                                                                          {        impl_Disable(cap);                                                                           debug_helper(loc, 0, cap);                                                                                    }
+	Enable                 :: #force_inline proc "c" (cap: u32, loc := #caller_location)                                                                                          {        impl_Enable(cap);                                                                            debug_helper(loc, 0, cap);                                                                                    }
+	Finish                 :: #force_inline proc "c" (loc := #caller_location)                                                                                                    {        impl_Finish();                                                                               debug_helper(loc, 0);                                                                                         }
+	Flush                  :: #force_inline proc "c" (loc := #caller_location)                                                                                                    {        impl_Flush();                                                                                debug_helper(loc, 0);                                                                                         }
+	BlendFunc              :: #force_inline proc "c" (sfactor, dfactor: u32, loc := #caller_location)                                                                             {        impl_BlendFunc(sfactor, dfactor);                                                            debug_helper(loc, 0, sfactor, dfactor);                                                                       }
+	LogicOp                :: #force_inline proc "c" (opcode: u32, loc := #caller_location)                                                                                       {        impl_LogicOp(opcode);                                                                        debug_helper(loc, 0, opcode);                                                                                 }
+	StencilFunc            :: #force_inline proc "c" (func: u32, ref: i32, mask: u32, loc := #caller_location)                                                                    {        impl_StencilFunc(func, ref, mask);                                                           debug_helper(loc, 0, func, ref, mask);                                                                        }
+	StencilOp              :: #force_inline proc "c" (fail, zfail, zpass: u32, loc := #caller_location)                                                                           {        impl_StencilOp(fail, zfail, zpass);                                                          debug_helper(loc, 0, fail, zfail, zpass);                                                                     }
+	DepthFunc              :: #force_inline proc "c" (func: u32, loc := #caller_location)                                                                                         {        impl_DepthFunc(func);                                                                        debug_helper(loc, 0, func);                                                                                   }
+	PixelStoref            :: #force_inline proc "c" (pname: u32, param: f32, loc := #caller_location)                                                                            {        impl_PixelStoref(pname, param);                                                              debug_helper(loc, 0, pname, param);                                                                           }
+	PixelStorei            :: #force_inline proc "c" (pname: u32, param: i32, loc := #caller_location)                                                                            {        impl_PixelStorei(pname, param);                                                              debug_helper(loc, 0, pname, param);                                                                           }
+	ReadBuffer             :: #force_inline proc "c" (src: u32, loc := #caller_location)                                                                                          {        impl_ReadBuffer(src);                                                                        debug_helper(loc, 0, src);                                                                                    }
+	ReadPixels             :: #force_inline proc "c" (x, y, width, height: i32, format, type: u32, pixels: rawptr, loc := #caller_location)                                       {        impl_ReadPixels(x, y, width, height, format, type, pixels);                                  debug_helper(loc, 0, x, y, width, height, format, type, pixels);                                              }
+	GetBooleanv            :: #force_inline proc "c" (pname: u32, data: ^bool, loc := #caller_location)                                                                           {        impl_GetBooleanv(pname, data);                                                               debug_helper(loc, 0, pname, data);                                                                            }
+	GetDoublev             :: #force_inline proc "c" (pname: u32, data: ^f64, loc := #caller_location)                                                                            {        impl_GetDoublev(pname, data);                                                                debug_helper(loc, 0, pname, data);                                                                            }
+	GetError               :: #force_inline proc "c" (loc := #caller_location) -> u32                                                                                             { ret := impl_GetError();                                                                             debug_helper(loc, 1, ret);                                                                        return ret; }
+	GetFloatv              :: #force_inline proc "c" (pname: u32, data: ^f32, loc := #caller_location)                                                                            {        impl_GetFloatv(pname, data);                                                                 debug_helper(loc, 0, pname, data);                                                                            }
+	GetIntegerv            :: #force_inline proc "c" (pname: u32, data: ^i32, loc := #caller_location)                                                                            {        impl_GetIntegerv(pname, data);                                                               debug_helper(loc, 0, pname, data);                                                                            }
+	GetString              :: #force_inline proc "c" (name: u32, loc := #caller_location) -> cstring                                                                              { ret := impl_GetString(name);                                                                        debug_helper(loc, 1, ret, name);                                                                  return ret; }
+	GetTexImage            :: #force_inline proc "c" (target: u32,  level: i32, format, type: u32, pixels: rawptr, loc := #caller_location)                                       {        impl_GetTexImage(target,  level, format, type, pixels);                                      debug_helper(loc, 0, target,  level, format, type, pixels);                                                   }
+	GetTexParameterfv      :: #force_inline proc "c" (target, pname: u32, params: [^]f32, loc := #caller_location)                                                                {        impl_GetTexParameterfv(target, pname, params);                                               debug_helper(loc, 0, target, pname, params);                                                                  }
+	GetTexParameteriv      :: #force_inline proc "c" (target, pname: u32, params: [^]i32, loc := #caller_location)                                                                {        impl_GetTexParameteriv(target, pname, params);                                               debug_helper(loc, 0, target, pname, params);                                                                  }
+	GetTexLevelParameterfv :: #force_inline proc "c" (target: u32, level: i32, pname: u32, params: [^]f32, loc := #caller_location)                                               {        impl_GetTexLevelParameterfv(target, level, pname, params);                                   debug_helper(loc, 0, target, level, pname, params);                                                           }
+	GetTexLevelParameteriv :: #force_inline proc "c" (target: u32, level: i32, pname: u32, params: [^]i32, loc := #caller_location)                                               {        impl_GetTexLevelParameteriv(target, level, pname, params);                                   debug_helper(loc, 0, target, level, pname, params);                                                           }
+	IsEnabled              :: #force_inline proc "c" (cap: u32, loc := #caller_location) -> bool                                                                                  { ret := impl_IsEnabled(cap);                                                                         debug_helper(loc, 1, ret, cap);                                                                   return ret; }
+	DepthRange             :: #force_inline proc "c" (near, far: f64, loc := #caller_location)                                                                                    {        impl_DepthRange(near, far);                                                                  debug_helper(loc, 0, near, far);                                                                              }
+	Viewport               :: #force_inline proc "c" (x, y, width, height: i32, loc := #caller_location)                                                                          {        impl_Viewport(x, y, width, height);                                                          debug_helper(loc, 0, x, y, width, height);                                                                    }
+
+	// VERSION_1_1
+	DrawArrays        :: #force_inline proc "c" (mode: u32, first: i32, count: i32, loc := #caller_location)                                                                                    {        impl_DrawArrays(mode, first, count);                                                      debug_helper(loc, 0, mode, first, count);                                                               }
+	DrawElements      :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, loc := #caller_location)                                                                    {        impl_DrawElements(mode, count, type, indices);                                            debug_helper(loc, 0, mode, count, type, indices);                                                       }
+	PolygonOffset     :: #force_inline proc "c" (factor: f32, units: f32, loc := #caller_location)                                                                                              {        impl_PolygonOffset(factor, units);                                                        debug_helper(loc, 0, factor, units);                                                                    }
+	CopyTexImage1D    :: #force_inline proc "c" (target: u32, level: i32, internalformat: u32, x: i32, y: i32, width: i32, border: i32, loc := #caller_location)                                {        impl_CopyTexImage1D(target, level, internalformat, x, y, width, border);                  debug_helper(loc, 0, target, level, internalformat, x, y, width, border);                               }
+	CopyTexImage2D    :: #force_inline proc "c" (target: u32, level: i32, internalformat: u32, x: i32, y: i32, width: i32, height: i32, border: i32, loc := #caller_location)                   {        impl_CopyTexImage2D(target, level, internalformat, x, y, width, height, border);          debug_helper(loc, 0, target, level, internalformat, x, y, width, height, border);                       }
+	CopyTexSubImage1D :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, x: i32, y: i32, width: i32, loc := #caller_location)                                                    {        impl_CopyTexSubImage1D(target, level, xoffset, x, y, width);                              debug_helper(loc, 0, target, level, xoffset, x, y, width);                                              }
+	CopyTexSubImage2D :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, x: i32, y: i32, width: i32, height: i32, loc := #caller_location)                         {        impl_CopyTexSubImage2D(target, level, xoffset, yoffset, x, y, width, height);             debug_helper(loc, 0, target, level, xoffset, yoffset, x, y, width, height);                             }
+	TexSubImage1D     :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, width: i32, format: u32, type: u32, pixels: rawptr, loc := #caller_location)                            {        impl_TexSubImage1D(target, level, xoffset, width, format, type, pixels);                  debug_helper(loc, 0, target, level, xoffset, width, format, type, pixels);                              }
+	TexSubImage2D     :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, type: u32, pixels: rawptr, loc := #caller_location) {        impl_TexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); debug_helper(loc, 0, target, level, xoffset, yoffset, width, height, format, type, pixels);             }
+	BindTexture       :: #force_inline proc "c" (target: u32, texture: u32, loc := #caller_location)                                                                                            {        impl_BindTexture(target, texture);                                                        debug_helper(loc, 0, target, texture);                                                                  }
+	DeleteTextures    :: #force_inline proc "c" (n: i32, textures: [^]u32, loc := #caller_location)                                                                                             {        impl_DeleteTextures(n, textures);                                                         debug_helper(loc, 0, n, textures);                                                                      }
+	GenTextures       :: #force_inline proc "c" (n: i32, textures: [^]u32, loc := #caller_location)                                                                                             {        impl_GenTextures(n, textures);                                                            debug_helper(loc, 0, n, textures);                                                                      }
+	IsTexture         :: #force_inline proc "c" (texture: u32, loc := #caller_location) -> bool                                                                                                 { ret := impl_IsTexture(texture);                                                                  debug_helper(loc, 1, ret, texture);                                                         return ret; }
+
+	// VERSION_1_2
+	DrawRangeElements :: #force_inline proc "c" (mode, start, end: u32, count: i32, type: u32, indices: rawptr, loc := #caller_location)                                               { impl_DrawRangeElements(mode, start, end, count, type, indices);                                           debug_helper(loc, 0, mode, start, end, count, type, indices);                                               }
+	TexImage3D        :: #force_inline proc "c" (target: u32, level, internalformat, width, height, depth, border: i32, format, type: u32, pixels: rawptr, loc := #caller_location)    { impl_TexImage3D(target, level, internalformat, width, height, depth, border, format, type, pixels);       debug_helper(loc, 0, target, level, internalformat, width, height, depth, border, format, type, pixels);    }
+	TexSubImage3D     :: #force_inline proc "c" (target: u32, level, xoffset, yoffset, zoffset, width, height, depth: i32, format, type: u32, pixels: rawptr, loc := #caller_location) { impl_TexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); debug_helper(loc, 0, target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); }
+	CopyTexSubImage3D :: #force_inline proc "c" (target: u32, level, xoffset, yoffset, zoffset, x, y, width, height: i32, loc := #caller_location)                                     { impl_CopyTexSubImage3D(target, level, xoffset, yoffset, zoffset, x, y, width, height);                    debug_helper(loc, 0, target, level, xoffset, yoffset, zoffset, x, y, width, height);                        }
+
+	// VERSION_1_3
+	ActiveTexture           :: #force_inline proc "c" (texture: u32, loc := #caller_location)                                                                                                                                      { impl_ActiveTexture(texture);                                                                                           debug_helper(loc, 0, texture);                                                                                 }
+	SampleCoverage          :: #force_inline proc "c" (value: f32, invert: u8, loc := #caller_location)                                                                                                                            { impl_SampleCoverage(value, invert);                                                                                    debug_helper(loc, 0, value, invert);                                                                           }
+	CompressedTexImage3D    :: #force_inline proc "c" (target: u32, level: i32, internalformat: u32, width: i32, height: i32, depth: i32, border: i32, imageSize: i32, data: rawptr, loc := #caller_location)                      { impl_CompressedTexImage3D(target, level, internalformat, width, height, depth, border, imageSize, data);               debug_helper(loc, 0, target, level, internalformat, width, height, depth, border, imageSize, data);            }
+	CompressedTexImage2D    :: #force_inline proc "c" (target: u32, level: i32, internalformat: u32, width: i32, height: i32, border: i32, imageSize: i32, data: rawptr, loc := #caller_location)                                  { impl_CompressedTexImage2D(target, level, internalformat, width, height, border, imageSize, data);                      debug_helper(loc, 0, target, level, internalformat, width, height, border, imageSize, data);                   }
+	CompressedTexImage1D    :: #force_inline proc "c" (target: u32, level: i32, internalformat: u32, width: i32, border: i32, imageSize: i32, data: rawptr, loc := #caller_location)                                               { impl_CompressedTexImage1D(target, level, internalformat, width, border, imageSize, data);                              debug_helper(loc, 0, target, level, internalformat, width, border, imageSize, data);                           }
+	CompressedTexSubImage3D :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, imageSize: i32, data: rawptr, loc := #caller_location) { impl_CompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); debug_helper(loc, 0, target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); }
+	CompressedTexSubImage2D :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, imageSize: i32, data: rawptr, loc := #caller_location)                           { impl_CompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);                 debug_helper(loc, 0, target, level, xoffset, yoffset, width, height, format, imageSize, data);                 }
+	CompressedTexSubImage1D :: #force_inline proc "c" (target: u32, level: i32, xoffset: i32, width: i32, format: u32, imageSize: i32, data: rawptr, loc := #caller_location)                                                      { impl_CompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);                                  debug_helper(loc, 0, target, level, xoffset, width, format, imageSize, data);                                  }
+	GetCompressedTexImage   :: #force_inline proc "c" (target: u32, level: i32, img: rawptr, loc := #caller_location)                                                                                                              { impl_GetCompressedTexImage(target, level, img);                                                                        debug_helper(loc, 0, target, level, img);                                                                      }
+
+	// VERSION_1_4
+    BlendFuncSeparate :: #force_inline proc "c" (sfactorRGB: u32, dfactorRGB: u32, sfactorAlpha: u32, dfactorAlpha: u32, loc := #caller_location)  { impl_BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); debug_helper(loc, 0, sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha); }
+    MultiDrawArrays   :: #force_inline proc "c" (mode: u32, first: [^]i32, count: [^]i32, drawcount: i32, loc := #caller_location)                 { impl_MultiDrawArrays(mode, first, count, drawcount);                        debug_helper(loc, 0, mode, first, count, drawcount);                      }
+    MultiDrawElements :: #force_inline proc "c" (mode: u32, count: [^]i32, type: u32, indices: [^]rawptr, drawcount: i32, loc := #caller_location) { impl_MultiDrawElements(mode, count, type, indices, drawcount);             debug_helper(loc, 0, mode, count, type, indices, drawcount);             }
+    PointParameterf   :: #force_inline proc "c" (pname: u32, param: f32, loc := #caller_location)                                                  { impl_PointParameterf(pname, param);                                         debug_helper(loc, 0, pname, param);                                       }
+    PointParameterfv  :: #force_inline proc "c" (pname: u32, params: [^]f32, loc := #caller_location)                                              { impl_PointParameterfv(pname, params);                                       debug_helper(loc, 0, pname, params);                                      }
+    PointParameteri   :: #force_inline proc "c" (pname: u32, param: i32, loc := #caller_location)                                                  { impl_PointParameteri(pname, param);                                         debug_helper(loc, 0, pname, param);                                       }
+    PointParameteriv  :: #force_inline proc "c" (pname: u32, params: [^]i32, loc := #caller_location)                                              { impl_PointParameteriv(pname, params);                                       debug_helper(loc, 0, pname, params);                                      }
+    BlendColor        :: #force_inline proc "c" (red: f32, green: f32, blue: f32, alpha: f32, loc := #caller_location)                             { impl_BlendColor(red, green, blue, alpha);                                   debug_helper(loc, 0, red, green, blue, alpha);                            }
+    BlendEquation     :: #force_inline proc "c" (mode: u32, loc := #caller_location)                                                               { impl_BlendEquation(mode);                                                   debug_helper(loc, 0, mode);                                               }
+
+    // VERSION_1_5
+	GenQueries           :: #force_inline proc "c" (n: i32, ids: [^]u32, loc := #caller_location)                               {        impl_GenQueries(n, ids);                           debug_helper(loc, 0, n, ids);                                 }
+	DeleteQueries        :: #force_inline proc "c" (n: i32, ids: [^]u32, loc := #caller_location)                               {        impl_DeleteQueries(n, ids);                        debug_helper(loc, 0, n, ids);                                 }
+	IsQuery              :: #force_inline proc "c" (id: u32, loc := #caller_location) -> bool                                   { ret := impl_IsQuery(id);                                  debug_helper(loc, 1, ret, id);                    return ret; }
+	BeginQuery           :: #force_inline proc "c" (target: u32, id: u32, loc := #caller_location)                              {        impl_BeginQuery(target, id);                       debug_helper(loc, 0, target, id);                             }
+	EndQuery             :: #force_inline proc "c" (target: u32, loc := #caller_location)                                       {        impl_EndQuery(target);                             debug_helper(loc, 0, target);                                 }
+	GetQueryiv           :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32, loc := #caller_location)           {        impl_GetQueryiv(target, pname, params);            debug_helper(loc, 0, target, pname, params);                  }
+	GetQueryObjectiv     :: #force_inline proc "c" (id: u32, pname: u32, params: [^]i32, loc := #caller_location)               {        impl_GetQueryObjectiv(id, pname, params);          debug_helper(loc, 0, id, pname, params);                      }
+	GetQueryObjectuiv    :: #force_inline proc "c" (id: u32, pname: u32, params: [^]u32, loc := #caller_location)               {        impl_GetQueryObjectuiv(id, pname, params);         debug_helper(loc, 0, id, pname, params);                      }
+	BindBuffer           :: #force_inline proc "c" (target: u32, buffer: u32, loc := #caller_location)                          {        impl_BindBuffer(target, buffer);                   debug_helper(loc, 0, target, buffer);                         }
+	DeleteBuffers        :: #force_inline proc "c" (n: i32, buffers: [^]u32, loc := #caller_location)                           {        impl_DeleteBuffers(n, buffers);                    debug_helper(loc, 0, n, buffers);                             }
+	GenBuffers           :: #force_inline proc "c" (n: i32, buffers: [^]u32, loc := #caller_location)                           {        impl_GenBuffers(n, buffers);                       debug_helper(loc, 0, n, buffers);                             }
+	IsBuffer             :: #force_inline proc "c" (buffer: u32, loc := #caller_location) -> bool                               { ret := impl_IsBuffer(buffer);                             debug_helper(loc, 1, ret, buffer);                return ret; }
+	BufferData           :: #force_inline proc "c" (target: u32, size: int, data: rawptr, usage: u32, loc := #caller_location)  {        impl_BufferData(target, size, data, usage);        debug_helper(loc, 0, target, size, data, usage);              }
+	BufferSubData        :: #force_inline proc "c" (target: u32, offset: int, size: int, data: rawptr, loc := #caller_location) {        impl_BufferSubData(target, offset, size, data);    debug_helper(loc, 0, target, offset, size, data);             }
+	GetBufferSubData     :: #force_inline proc "c" (target: u32, offset: int, size: int, data: rawptr, loc := #caller_location) {        impl_GetBufferSubData(target, offset, size, data); debug_helper(loc, 0, target, offset, size, data);             }
+	MapBuffer            :: #force_inline proc "c" (target: u32, access: u32, loc := #caller_location) -> rawptr                { ret := impl_MapBuffer(target, access);                    debug_helper(loc, 1, ret, target, access);        return ret; }
+	UnmapBuffer          :: #force_inline proc "c" (target: u32, loc := #caller_location) -> bool                               { ret := impl_UnmapBuffer(target);                          debug_helper(loc, 1, ret, target);                return ret; }
+	GetBufferParameteriv :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32, loc := #caller_location)           {        impl_GetBufferParameteriv(target, pname, params);  debug_helper(loc, 0, target, pname, params);                  }
+	GetBufferPointerv    :: #force_inline proc "c" (target: u32, pname: u32, params: [^]rawptr, loc := #caller_location)        {        impl_GetBufferPointerv(target, pname, params);     debug_helper(loc, 0, target, pname, params);                  }
+
+	// VERSION_2_0
+	BlendEquationSeparate    :: #force_inline proc "c" (modeRGB: u32, modeAlpha: u32, loc := #caller_location)                                                              {        impl_BlendEquationSeparate(modeRGB, modeAlpha);                            debug_helper(loc, 0, modeRGB, modeAlpha);                                             }
+	DrawBuffers              :: #force_inline proc "c" (n: i32, bufs: [^]u32, loc := #caller_location)                                                                      {        impl_DrawBuffers(n, bufs);                                                 debug_helper(loc, 0, n, bufs);                                                        }
+	StencilOpSeparate        :: #force_inline proc "c" (face: u32, sfail: u32, dpfail: u32, dppass: u32, loc := #caller_location)                                           {        impl_StencilOpSeparate(face, sfail, dpfail, dppass);                       debug_helper(loc, 0, face, sfail, dpfail, dppass);                                    }
+	StencilFuncSeparate      :: #force_inline proc "c" (face: u32, func: u32, ref: i32, mask: u32, loc := #caller_location)                                                 {        impl_StencilFuncSeparate(face, func, ref, mask);                           debug_helper(loc, 0, face, func, ref, mask);                                          }
+	StencilMaskSeparate      :: #force_inline proc "c" (face: u32, mask: u32, loc := #caller_location)                                                                      {        impl_StencilMaskSeparate(face, mask);                                      debug_helper(loc, 0, face, mask);                                                     }
+	AttachShader             :: #force_inline proc "c" (program: u32, shader: u32, loc := #caller_location)                                                                 {        impl_AttachShader(program, shader);                                        debug_helper(loc, 0, program, shader);                                                }
+	BindAttribLocation       :: #force_inline proc "c" (program: u32, index: u32, name: cstring, loc := #caller_location)                                                   {        impl_BindAttribLocation(program, index, name);                             debug_helper(loc, 0, program, index, name);                                           }
+	CompileShader            :: #force_inline proc "c" (shader: u32, loc := #caller_location)                                                                               {        impl_CompileShader(shader);                                                debug_helper(loc, 0, shader);                                                         }
+	CreateProgram            :: #force_inline proc "c" (loc := #caller_location) -> u32                                                                                     { ret := impl_CreateProgram();                                                      debug_helper(loc, 1, ret);                                                return ret; }
+	CreateShader             :: #force_inline proc "c" (type: u32, loc := #caller_location) -> u32                                                                          { ret := impl_CreateShader(type);                                                  debug_helper(loc, 1, ret, type);                                         return ret; }
+	DeleteProgram            :: #force_inline proc "c" (program: u32, loc := #caller_location)                                                                              {        impl_DeleteProgram(program);                                               debug_helper(loc, 0, program);                                                        }
+	DeleteShader             :: #force_inline proc "c" (shader: u32, loc := #caller_location)                                                                               {        impl_DeleteShader(shader);                                                 debug_helper(loc, 0, shader);                                                         }
+	DetachShader             :: #force_inline proc "c" (program: u32, shader: u32, loc := #caller_location)                                                                 {        impl_DetachShader(program, shader);                                        debug_helper(loc, 0, program, shader);                                                }
+	DisableVertexAttribArray :: #force_inline proc "c" (index: u32, loc := #caller_location)                                                                                {        impl_DisableVertexAttribArray(index);                                      debug_helper(loc, 0, index);                                                          }
+	EnableVertexAttribArray  :: #force_inline proc "c" (index: u32, loc := #caller_location)                                                                                {        impl_EnableVertexAttribArray(index);                                       debug_helper(loc, 0, index);                                                          }
+	GetActiveAttrib          :: #force_inline proc "c" (program: u32, index: u32, bufSize: i32, length: ^i32, size: ^i32, type: ^u32, name: [^]u8, loc := #caller_location) {        impl_GetActiveAttrib(program, index, bufSize, length, size, type, name);  debug_helper(loc, 0, program, index, bufSize, length, size, type, name);             }
+	GetActiveUniform         :: #force_inline proc "c" (program: u32, index: u32, bufSize: i32, length: ^i32, size: ^i32, type: ^u32, name: [^]u8, loc := #caller_location) {        impl_GetActiveUniform(program, index, bufSize, length, size, type, name); debug_helper(loc, 0, program, index, bufSize, length, size, type, name);             }
+	GetAttachedShaders       :: #force_inline proc "c" (program: u32, maxCount: i32, count: [^]i32, shaders: [^]u32, loc := #caller_location)                               {        impl_GetAttachedShaders(program, maxCount, count, shaders);                debug_helper(loc, 0, program, maxCount, count, shaders);                              }
+	GetAttribLocation        :: #force_inline proc "c" (program: u32, name: cstring, loc := #caller_location) -> i32                                                        { ret := impl_GetAttribLocation(program, name);                                     debug_helper(loc, 1, ret, program, name);                                 return ret; }
+	GetProgramiv             :: #force_inline proc "c" (program: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                  {        impl_GetProgramiv(program, pname, params);                                 debug_helper(loc, 0, program, pname, params);                                         }
+	GetProgramInfoLog        :: #force_inline proc "c" (program: u32, bufSize: i32, length: ^i32, infoLog: [^]u8, loc := #caller_location)                                  {        impl_GetProgramInfoLog(program, bufSize, length, infoLog);                 debug_helper(loc, 0, program, bufSize, length, infoLog);                              }
+	GetShaderiv              :: #force_inline proc "c" (shader: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                   {        impl_GetShaderiv(shader, pname, params);                                   debug_helper(loc, 0, shader, pname, params);                                          }
+	GetShaderInfoLog         :: #force_inline proc "c" (shader: u32, bufSize: i32, length: ^i32, infoLog: [^]u8, loc := #caller_location)                                   {        impl_GetShaderInfoLog(shader, bufSize, length, infoLog);                   debug_helper(loc, 0, shader, bufSize, length, infoLog);                               }
+	GetShaderSource          :: #force_inline proc "c" (shader: u32, bufSize: i32, length: ^i32, source: [^]u8, loc := #caller_location)                                    {        impl_GetShaderSource(shader, bufSize, length, source);                     debug_helper(loc, 0, shader, bufSize, length, source);                                }
+	GetUniformLocation       :: #force_inline proc "c" (program: u32, name: cstring, loc := #caller_location) -> i32                                                        { ret := impl_GetUniformLocation(program, name);                                    debug_helper(loc, 1, ret, program, name);                                 return ret; }
+	GetUniformfv             :: #force_inline proc "c" (program: u32, location: i32, params: [^]f32, loc := #caller_location)                                               {        impl_GetUniformfv(program, location, params);                              debug_helper(loc, 0, program, location, params);                                      }
+	GetUniformiv             :: #force_inline proc "c" (program: u32, location: i32, params: [^]i32, loc := #caller_location)                                               {        impl_GetUniformiv(program, location, params);                              debug_helper(loc, 0, program, location, params);                                      }
+	GetVertexAttribdv        :: #force_inline proc "c" (index: u32, pname: u32, params: [^]f64, loc := #caller_location)                                                    {        impl_GetVertexAttribdv(index, pname, params);                              debug_helper(loc, 0, index, pname, params);                                           }
+	GetVertexAttribfv        :: #force_inline proc "c" (index: u32, pname: u32, params: [^]f32, loc := #caller_location)                                                    {        impl_GetVertexAttribfv(index, pname, params);                              debug_helper(loc, 0, index, pname, params);                                           }
+	GetVertexAttribiv        :: #force_inline proc "c" (index: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                    {        impl_GetVertexAttribiv(index, pname, params);                              debug_helper(loc, 0, index, pname, params);                                           }
+	GetVertexAttribPointerv  :: #force_inline proc "c" (index: u32, pname: u32, pointer: ^rawptr, loc := #caller_location)                                                  {        impl_GetVertexAttribPointerv(index, pname, pointer);                       debug_helper(loc, 0, index, pname, pointer);                                          }
+	IsProgram                :: #force_inline proc "c" (program: u32, loc := #caller_location) -> bool                                                                      { ret := impl_IsProgram(program);                                                   debug_helper(loc, 1, ret, program);                                       return ret; }
+	IsShader                 :: #force_inline proc "c" (shader: u32, loc := #caller_location) -> bool                                                                       { ret := impl_IsShader(shader);                                                     debug_helper(loc, 1, ret, shader);                                        return ret; }
+	LinkProgram              :: #force_inline proc "c" (program: u32, loc := #caller_location)                                                                              {        impl_LinkProgram(program);                                                 debug_helper(loc, 0, program);                                                        }
+	ShaderSource             :: #force_inline proc "c" (shader: u32, count: i32, string: [^]cstring, length: [^]i32, loc := #caller_location)                               {        impl_ShaderSource(shader, count, string, length);                          debug_helper(loc, 0, shader, count, string, length);                                  }
+	UseProgram               :: #force_inline proc "c" (program: u32, loc := #caller_location)                                                                              {        impl_UseProgram(program);                                                  debug_helper(loc, 0, program);                                                        }
+	Uniform1f                :: #force_inline proc "c" (location: i32, v0: f32, loc := #caller_location)                                                                    {        impl_Uniform1f(location, v0);                                              debug_helper(loc, 0, location, v0);                                                   }
+	Uniform2f                :: #force_inline proc "c" (location: i32, v0: f32, v1: f32, loc := #caller_location)                                                           {        impl_Uniform2f(location, v0, v1);                                          debug_helper(loc, 0, location, v0, v1);                                               }
+	Uniform3f                :: #force_inline proc "c" (location: i32, v0: f32, v1: f32, v2: f32, loc := #caller_location)                                                  {        impl_Uniform3f(location, v0, v1, v2);                                      debug_helper(loc, 0, location, v0, v1, v2);                                           }
+	Uniform4f                :: #force_inline proc "c" (location: i32, v0: f32, v1: f32, v2: f32, v3: f32, loc := #caller_location)                                         {        impl_Uniform4f(location, v0, v1, v2, v3);                                  debug_helper(loc, 0, location, v0, v1, v2, v3);                                       }
+	Uniform1i                :: #force_inline proc "c" (location: i32, v0: i32, loc := #caller_location)                                                                    {        impl_Uniform1i(location, v0);                                              debug_helper(loc, 0, location, v0);                                                   }
+	Uniform2i                :: #force_inline proc "c" (location: i32, v0: i32, v1: i32, loc := #caller_location)                                                           {        impl_Uniform2i(location, v0, v1);                                          debug_helper(loc, 0, location, v0, v1);                                               }
+	Uniform3i                :: #force_inline proc "c" (location: i32, v0: i32, v1: i32, v2: i32, loc := #caller_location)                                                  {        impl_Uniform3i(location, v0, v1, v2);                                      debug_helper(loc, 0, location, v0, v1, v2);                                           }
+	Uniform4i                :: #force_inline proc "c" (location: i32, v0: i32, v1: i32, v2: i32, v3: i32, loc := #caller_location)                                         {        impl_Uniform4i(location, v0, v1, v2, v3);                                  debug_helper(loc, 0, location, v0, v1, v2, v3);                                       }
+	Uniform1fv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]f32, loc := #caller_location)                                                  {        impl_Uniform1fv(location, count, value);                                   debug_helper(loc, 0, location, count, value);                                         }
+	Uniform2fv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]f32, loc := #caller_location)                                                  {        impl_Uniform2fv(location, count, value);                                   debug_helper(loc, 0, location, count, value);                                         }
+	Uniform3fv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]f32, loc := #caller_location)                                                  {        impl_Uniform3fv(location, count, value);                                   debug_helper(loc, 0, location, count, value);                                         }
+	Uniform4fv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]f32, loc := #caller_location)                                                  {        impl_Uniform4fv(location, count, value);                                   debug_helper(loc, 0, location, count, value);                                         }
+	Uniform1iv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]i32, loc := #caller_location)                                                  {        impl_Uniform1iv(location, count, value);                                   debug_helper(loc, 0, location, count, value);                                         }
+	Uniform2iv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]i32, loc := #caller_location)                                                  {        impl_Uniform2iv(location, count, value);                                   debug_helper(loc, 0, location, count, value);                                         }
+	Uniform3iv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]i32, loc := #caller_location)                                                  {        impl_Uniform3iv(location, count, value);                                   debug_helper(loc, 0, location, count, value);                                         }
+	Uniform4iv               :: #force_inline proc "c" (location: i32, count: i32, value: [^]i32, loc := #caller_location)                                                  {        impl_Uniform4iv(location, count, value);                                   debug_helper(loc, 0, location, count, value);                                         }
+	UniformMatrix2fv         :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)                                 {        impl_UniformMatrix2fv(location, count, transpose, value);                  debug_helper(loc, 0, location, count, transpose, value);                              }
+	UniformMatrix3fv         :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)                                 {        impl_UniformMatrix3fv(location, count, transpose, value);                  debug_helper(loc, 0, location, count, transpose, value);                              }
+	UniformMatrix4fv         :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)                                 {        impl_UniformMatrix4fv(location, count, transpose, value);                  debug_helper(loc, 0, location, count, transpose, value);                              }
+	ValidateProgram          :: #force_inline proc "c" (program: u32, loc := #caller_location)                                                                              {        impl_ValidateProgram(program);                                             debug_helper(loc, 0, program);                                                        }
+	VertexAttrib1d           :: #force_inline proc "c" (index: u32, x: f64, loc := #caller_location)                                                                        {        impl_VertexAttrib1d(index, x);                                             debug_helper(loc, 0, index, x);                                                       }
+	VertexAttrib1dv          :: #force_inline proc "c" (index: u32, v: ^f64, loc := #caller_location)                                                                       {        impl_VertexAttrib1dv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib1f           :: #force_inline proc "c" (index: u32, x: f32, loc := #caller_location)                                                                        {        impl_VertexAttrib1f(index, x);                                             debug_helper(loc, 0, index, x);                                                       }
+	VertexAttrib1fv          :: #force_inline proc "c" (index: u32, v: ^f32, loc := #caller_location)                                                                       {        impl_VertexAttrib1fv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib1s           :: #force_inline proc "c" (index: u32, x: i16, loc := #caller_location)                                                                        {        impl_VertexAttrib1s(index, x);                                             debug_helper(loc, 0, index, x);                                                       }
+	VertexAttrib1sv          :: #force_inline proc "c" (index: u32, v: ^i16, loc := #caller_location)                                                                       {        impl_VertexAttrib1sv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib2d           :: #force_inline proc "c" (index: u32, x: f64, y: f64, loc := #caller_location)                                                                {        impl_VertexAttrib2d(index, x, y);                                          debug_helper(loc, 0, index, x, y);                                                    }
+	VertexAttrib2dv          :: #force_inline proc "c" (index: u32, v: ^f64, loc := #caller_location)                                                                       {        impl_VertexAttrib2dv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib2f           :: #force_inline proc "c" (index: u32, x: f32, y: f32, loc := #caller_location)                                                                {        impl_VertexAttrib2f(index, x, y);                                          debug_helper(loc, 0, index, x, y);                                                    }
+	VertexAttrib2fv          :: #force_inline proc "c" (index: u32, v: ^f32, loc := #caller_location)                                                                       {        impl_VertexAttrib2fv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib2s           :: #force_inline proc "c" (index: u32, x: i16, y: i16, loc := #caller_location)                                                                {        impl_VertexAttrib2s(index, x, y);                                          debug_helper(loc, 0, index, x, y);                                                    }
+	VertexAttrib2sv          :: #force_inline proc "c" (index: u32, v: ^i16, loc := #caller_location)                                                                       {        impl_VertexAttrib2sv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib3d           :: #force_inline proc "c" (index: u32, x: f64, y: f64, z: f64, loc := #caller_location)                                                        {        impl_VertexAttrib3d(index, x, y, z);                                       debug_helper(loc, 0, index, x, y, z);                                                 }
+	VertexAttrib3dv          :: #force_inline proc "c" (index: u32, v: ^f64, loc := #caller_location)                                                                       {        impl_VertexAttrib3dv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib3f           :: #force_inline proc "c" (index: u32, x: f32, y: f32, z: f32, loc := #caller_location)                                                        {        impl_VertexAttrib3f(index, x, y, z);                                       debug_helper(loc, 0, index, x, y, z);                                                 }
+	VertexAttrib3fv          :: #force_inline proc "c" (index: u32, v: ^f32, loc := #caller_location)                                                                       {        impl_VertexAttrib3fv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib3s           :: #force_inline proc "c" (index: u32, x: i16, y: i16, z: i16, loc := #caller_location)                                                        {        impl_VertexAttrib3s(index, x, y, z);                                       debug_helper(loc, 0, index, x, y, z);                                                 }
+	VertexAttrib3sv          :: #force_inline proc "c" (index: u32, v: ^i16, loc := #caller_location)                                                                       {        impl_VertexAttrib3sv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4Nbv         :: #force_inline proc "c" (index: u32, v: ^i8, loc := #caller_location)                                                                        {        impl_VertexAttrib4Nbv(index, v);                                           debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4Niv         :: #force_inline proc "c" (index: u32, v: ^i32, loc := #caller_location)                                                                       {        impl_VertexAttrib4Niv(index, v);                                           debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4Nsv         :: #force_inline proc "c" (index: u32, v: ^i16, loc := #caller_location)                                                                       {        impl_VertexAttrib4Nsv(index, v);                                           debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4Nub         :: #force_inline proc "c" (index: u32, x: u8, y: u8, z: u8, w: u8, loc := #caller_location)                                                    {        impl_VertexAttrib4Nub(index, x, y, z, w);                                  debug_helper(loc, 0, index, x, y, z, w);                                              }
+	VertexAttrib4Nubv        :: #force_inline proc "c" (index: u32, v: ^u8, loc := #caller_location)                                                                        {        impl_VertexAttrib4Nubv(index, v);                                          debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4Nuiv        :: #force_inline proc "c" (index: u32, v: ^u32, loc := #caller_location)                                                                       {        impl_VertexAttrib4Nuiv(index, v);                                          debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4Nusv        :: #force_inline proc "c" (index: u32, v: ^u16, loc := #caller_location)                                                                       {        impl_VertexAttrib4Nusv(index, v);                                          debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4bv          :: #force_inline proc "c" (index: u32, v: ^i8, loc := #caller_location)                                                                        {        impl_VertexAttrib4bv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4d           :: #force_inline proc "c" (index: u32, x: f64, y: f64, z: f64, w: f64, loc := #caller_location)                                                {        impl_VertexAttrib4d(index, x, y, z, w);                                    debug_helper(loc, 0, index, x, y, z, w);                                              }
+	VertexAttrib4dv          :: #force_inline proc "c" (index: u32, v: ^f64, loc := #caller_location)                                                                       {        impl_VertexAttrib4dv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4f           :: #force_inline proc "c" (index: u32, x: f32, y: f32, z: f32, w: f32, loc := #caller_location)                                                {        impl_VertexAttrib4f(index, x, y, z, w);                                    debug_helper(loc, 0, index, x, y, z, w);                                              }
+	VertexAttrib4fv          :: #force_inline proc "c" (index: u32, v: ^f32, loc := #caller_location)                                                                       {        impl_VertexAttrib4fv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4iv          :: #force_inline proc "c" (index: u32, v: ^i32, loc := #caller_location)                                                                       {        impl_VertexAttrib4iv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4s           :: #force_inline proc "c" (index: u32, x: i16, y: i16, z: i16, w: i16, loc := #caller_location)                                                {        impl_VertexAttrib4s(index, x, y, z, w);                                    debug_helper(loc, 0, index, x, y, z, w);                                              }
+	VertexAttrib4sv          :: #force_inline proc "c" (index: u32, v: ^i16, loc := #caller_location)                                                                       {        impl_VertexAttrib4sv(index, v);                                            debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4ubv         :: #force_inline proc "c" (index: u32, v: ^u8, loc := #caller_location)                                                                        {        impl_VertexAttrib4ubv(index, v);                                           debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4uiv         :: #force_inline proc "c" (index: u32, v: ^u32, loc := #caller_location)                                                                       {        impl_VertexAttrib4uiv(index, v);                                           debug_helper(loc, 0, index, v);                                                       }
+	VertexAttrib4usv         :: #force_inline proc "c" (index: u32, v: ^u16, loc := #caller_location)                                                                       {        impl_VertexAttrib4usv(index, v);                                           debug_helper(loc, 0, index, v);                                                       }
+	VertexAttribPointer      :: #force_inline proc "c" (index: u32, size: i32, type: u32, normalized: bool, stride: i32, pointer: rawptr, loc := #caller_location)          {        impl_VertexAttribPointer(index, size, type, normalized, stride, pointer); debug_helper(loc, 0, index, size, type, normalized, stride, pointer);                }
+
+	// VERSION_2_1
+	UniformMatrix2x3fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location) { impl_UniformMatrix2x3fv(location, count, transpose, value); debug_helper(loc, 0, location, count, transpose, value); }
+	UniformMatrix3x2fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location) { impl_UniformMatrix3x2fv(location, count, transpose, value); debug_helper(loc, 0, location, count, transpose, value); }
+	UniformMatrix2x4fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location) { impl_UniformMatrix2x4fv(location, count, transpose, value); debug_helper(loc, 0, location, count, transpose, value); }
+	UniformMatrix4x2fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location) { impl_UniformMatrix4x2fv(location, count, transpose, value); debug_helper(loc, 0, location, count, transpose, value); }
+	UniformMatrix3x4fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location) { impl_UniformMatrix3x4fv(location, count, transpose, value); debug_helper(loc, 0, location, count, transpose, value); }
+	UniformMatrix4x3fv :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location) { impl_UniformMatrix4x3fv(location, count, transpose, value); debug_helper(loc, 0, location, count, transpose, value); }
+
+		// VERSION_3_0
+	ColorMaski                          :: #force_inline proc "c" (index: u32, r: u8, g: u8, b: u8, a: u8, loc := #caller_location)                                                                                 {        impl_ColorMaski(index, r, g, b, a);                                                         debug_helper(loc, 0, index, r, g, b, a);                                                                }
+	GetBooleani_v                       :: #force_inline proc "c" (target: u32, index: u32, data: ^bool, loc := #caller_location)                                                                                   {        impl_GetBooleani_v(target, index, data);                                                    debug_helper(loc, 0, target, index, data);                                                              }
+	GetIntegeri_v                       :: #force_inline proc "c" (target: u32, index: u32, data: ^i32, loc := #caller_location)                                                                                    {        impl_GetIntegeri_v(target, index, data);                                                    debug_helper(loc, 0, target, index, data);                                                              }
+	Enablei                             :: #force_inline proc "c" (target: u32, index: u32, loc := #caller_location)                                                                                                {        impl_Enablei(target, index);                                                                debug_helper(loc, 0, target, index);                                                                    }
+	Disablei                            :: #force_inline proc "c" (target: u32, index: u32, loc := #caller_location)                                                                                                {        impl_Disablei(target, index);                                                               debug_helper(loc, 0, target, index);                                                                    }
+	IsEnabledi                          :: #force_inline proc "c" (target: u32, index: u32, loc := #caller_location) -> bool                                                                                        { ret := impl_IsEnabledi(target, index);                                                             debug_helper(loc, 1, ret, target, index);                                                   return ret; }
+	BeginTransformFeedback              :: #force_inline proc "c" (primitiveMode: u32, loc := #caller_location)                                                                                                     {        impl_BeginTransformFeedback(primitiveMode);                                                 debug_helper(loc, 0, primitiveMode);                                                                    }
+	EndTransformFeedback                :: #force_inline proc "c" (loc := #caller_location)                                                                                                                         {        impl_EndTransformFeedback();                                                                debug_helper(loc, 0);                                                                                   }
+	BindBufferRange                     :: #force_inline proc "c" (target: u32, index: u32, buffer: u32, offset: int, size: int, loc := #caller_location)                                                           {        impl_BindBufferRange(target, index, buffer, offset, size);                                  debug_helper(loc, 0, target, index, buffer, offset, size);                                              }
+	BindBufferBase                      :: #force_inline proc "c" (target: u32, index: u32, buffer: u32, loc := #caller_location)                                                                                   {        impl_BindBufferBase(target, index, buffer);                                                 debug_helper(loc, 0, target, index, buffer);                                                            }
+	TransformFeedbackVaryings           :: #force_inline proc "c" (program: u32, count: i32, varyings: [^]cstring, bufferMode: u32, loc := #caller_location)                                                        {        impl_TransformFeedbackVaryings(program, count, varyings, bufferMode);                       debug_helper(loc, 0, program, count, varyings, bufferMode);                                             }
+	GetTransformFeedbackVarying         :: #force_inline proc "c" (program: u32, index: u32, bufSize: i32, length: ^i32, size: ^i32, type: ^u32, name: [^]u8, loc := #caller_location)                              {        impl_GetTransformFeedbackVarying(program, index, bufSize, length, size, type, name);       debug_helper(loc, 0, program, index, bufSize, length, size, type, name);                               }
+	ClampColor                          :: #force_inline proc "c" (target: u32, clamp: u32, loc := #caller_location)                                                                                                {        impl_ClampColor(target, clamp);                                                             debug_helper(loc, 0, target, clamp);                                                                    }
+	BeginConditionalRender              :: #force_inline proc "c" (id: u32, mode: u32, loc := #caller_location)                                                                                                     {        impl_BeginConditionalRender(id, mode);                                                      debug_helper(loc, 0, id, mode);                                                                         }
+	EndConditionalRender                :: #force_inline proc "c" (loc := #caller_location)                                                                                                                         {        impl_EndConditionalRender();                                                                debug_helper(loc, 0);                                                                                   }
+	VertexAttribIPointer                :: #force_inline proc "c" (index: u32, size: i32, type: u32, stride: i32, pointer: rawptr, loc := #caller_location)                                                         {        impl_VertexAttribIPointer(index, size, type, stride, pointer);                             debug_helper(loc, 0, index, size, type, stride, pointer);                                              }
+	GetVertexAttribIiv                  :: #force_inline proc "c" (index: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                 {        impl_GetVertexAttribIiv(index, pname, params);                                              debug_helper(loc, 0, index, pname, params);                                                             }
+	GetVertexAttribIuiv                 :: #force_inline proc "c" (index: u32, pname: u32, params: [^]u32, loc := #caller_location)                                                                                 {        impl_GetVertexAttribIuiv(index, pname, params);                                             debug_helper(loc, 0, index, pname, params);                                                             }
+	VertexAttribI1i                     :: #force_inline proc "c" (index: u32, x: i32, loc := #caller_location)                                                                                                     {        impl_VertexAttribI1i(index, x);                                                             debug_helper(loc, 0, index, x);                                                                         }
+	VertexAttribI2i                     :: #force_inline proc "c" (index: u32, x: i32, y: i32, loc := #caller_location)                                                                                             {        impl_VertexAttribI2i(index, x, y);                                                          debug_helper(loc, 0, index, x, y);                                                                      }
+	VertexAttribI3i                     :: #force_inline proc "c" (index: u32, x: i32, y: i32, z: i32, loc := #caller_location)                                                                                     {        impl_VertexAttribI3i(index, x, y, z);                                                       debug_helper(loc, 0, index, x, y, z);                                                                   }
+	VertexAttribI4i                     :: #force_inline proc "c" (index: u32, x: i32, y: i32, z: i32, w: i32, loc := #caller_location)                                                                             {        impl_VertexAttribI4i(index, x, y, z, w);                                                    debug_helper(loc, 0, index, x, y, z, w);                                                                }
+	VertexAttribI1ui                    :: #force_inline proc "c" (index: u32, x: u32, loc := #caller_location)                                                                                                     {        impl_VertexAttribI1ui(index, x);                                                            debug_helper(loc, 0, index, x);                                                                         }
+	VertexAttribI2ui                    :: #force_inline proc "c" (index: u32, x: u32, y: u32, loc := #caller_location)                                                                                             {        impl_VertexAttribI2ui(index, x, y);                                                         debug_helper(loc, 0, index, x, y);                                                                      }
+	VertexAttribI3ui                    :: #force_inline proc "c" (index: u32, x: u32, y: u32, z: u32, loc := #caller_location)                                                                                     {        impl_VertexAttribI3ui(index, x, y, z);                                                      debug_helper(loc, 0, index, x, y, z);                                                                   }
+	VertexAttribI4ui                    :: #force_inline proc "c" (index: u32, x: u32, y: u32, z: u32, w: u32, loc := #caller_location)                                                                             {        impl_VertexAttribI4ui(index, x, y, z, w);                                                   debug_helper(loc, 0, index, x, y, z, w);                                                                }
+	VertexAttribI1iv                    :: #force_inline proc "c" (index: u32, v: ^i32, loc := #caller_location)                                                                                                    {        impl_VertexAttribI1iv(index, v);                                                            debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI2iv                    :: #force_inline proc "c" (index: u32, v: ^i32, loc := #caller_location)                                                                                                    {        impl_VertexAttribI2iv(index, v);                                                            debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI3iv                    :: #force_inline proc "c" (index: u32, v: ^i32, loc := #caller_location)                                                                                                    {        impl_VertexAttribI3iv(index, v);                                                            debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI4iv                    :: #force_inline proc "c" (index: u32, v: ^i32, loc := #caller_location)                                                                                                    {        impl_VertexAttribI4iv(index, v);                                                            debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI1uiv                   :: #force_inline proc "c" (index: u32, v: ^u32, loc := #caller_location)                                                                                                    {        impl_VertexAttribI1uiv(index, v);                                                           debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI2uiv                   :: #force_inline proc "c" (index: u32, v: ^u32, loc := #caller_location)                                                                                                    {        impl_VertexAttribI2uiv(index, v);                                                           debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI3uiv                   :: #force_inline proc "c" (index: u32, v: ^u32, loc := #caller_location)                                                                                                    {        impl_VertexAttribI3uiv(index, v);                                                           debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI4uiv                   :: #force_inline proc "c" (index: u32, v: ^u32, loc := #caller_location)                                                                                                    {        impl_VertexAttribI4uiv(index, v);                                                           debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI4bv                    :: #force_inline proc "c" (index: u32, v: ^i8, loc := #caller_location)                                                                                                     {        impl_VertexAttribI4bv(index, v);                                                            debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI4sv                    :: #force_inline proc "c" (index: u32, v: ^i16, loc := #caller_location)                                                                                                    {        impl_VertexAttribI4sv(index, v);                                                            debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI4ubv                   :: #force_inline proc "c" (index: u32, v: ^u8, loc := #caller_location)                                                                                                     {        impl_VertexAttribI4ubv(index, v);                                                           debug_helper(loc, 0, index, v);                                                                         }
+	VertexAttribI4usv                   :: #force_inline proc "c" (index: u32, v: ^u16, loc := #caller_location)                                                                                                    {        impl_VertexAttribI4usv(index, v);                                                           debug_helper(loc, 0, index, v);                                                                         }
+	GetUniformuiv                       :: #force_inline proc "c" (program: u32, location: i32, params: [^]u32, loc := #caller_location)                                                                            {        impl_GetUniformuiv(program, location, params);                                              debug_helper(loc, 0, program, location, params);                                                        }
+	BindFragDataLocation                :: #force_inline proc "c" (program: u32, color: u32, name: cstring, loc := #caller_location)                                                                                {        impl_BindFragDataLocation(program, color, name);                                            debug_helper(loc, 0, program, color, name);                                                             }
+	GetFragDataLocation                 :: #force_inline proc "c" (program: u32, name: cstring, loc := #caller_location) -> i32                                                                                     { ret := impl_GetFragDataLocation(program, name);                                                    debug_helper(loc, 1, ret, program, name);                                                   return ret; }
+	Uniform1ui                          :: #force_inline proc "c" (location: i32, v0: u32, loc := #caller_location)                                                                                                 {        impl_Uniform1ui(location, v0);                                                              debug_helper(loc, 0, location, v0);                                                                     }
+	Uniform2ui                          :: #force_inline proc "c" (location: i32, v0: u32, v1: u32, loc := #caller_location)                                                                                        {        impl_Uniform2ui(location, v0, v1);                                                          debug_helper(loc, 0, location, v0, v1);                                                                 }
+	Uniform3ui                          :: #force_inline proc "c" (location: i32, v0: u32, v1: u32, v2: u32, loc := #caller_location)                                                                               {        impl_Uniform3ui(location, v0, v1, v2);                                                      debug_helper(loc, 0, location, v0, v1, v2);                                                             }
+	Uniform4ui                          :: #force_inline proc "c" (location: i32, v0: u32, v1: u32, v2: u32, v3: u32, loc := #caller_location)                                                                      {        impl_Uniform4ui(location, v0, v1, v2, v3);                                                  debug_helper(loc, 0, location, v0, v1, v2, v3);                                                         }
+	Uniform1uiv                         :: #force_inline proc "c" (location: i32, count: i32, value: [^]u32, loc := #caller_location)                                                                               {        impl_Uniform1uiv(location, count, value);                                                   debug_helper(loc, 0, location, count, value);                                                           }
+	Uniform2uiv                         :: #force_inline proc "c" (location: i32, count: i32, value: [^]u32, loc := #caller_location)                                                                               {        impl_Uniform2uiv(location, count, value);                                                   debug_helper(loc, 0, location, count, value);                                                           }
+	Uniform3uiv                         :: #force_inline proc "c" (location: i32, count: i32, value: [^]u32, loc := #caller_location)                                                                               {        impl_Uniform3uiv(location, count, value);                                                   debug_helper(loc, 0, location, count, value);                                                           }
+	Uniform4uiv                         :: #force_inline proc "c" (location: i32, count: i32, value: [^]u32, loc := #caller_location)                                                                               {        impl_Uniform4uiv(location, count, value);                                                   debug_helper(loc, 0, location, count, value);                                                           }
+	TexParameterIiv                     :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                {        impl_TexParameterIiv(target, pname, params);                                                debug_helper(loc, 0, target, pname, params);                                                            }
+	TexParameterIuiv                    :: #force_inline proc "c" (target: u32, pname: u32, params: [^]u32, loc := #caller_location)                                                                                {        impl_TexParameterIuiv(target, pname, params);                                               debug_helper(loc, 0, target, pname, params);                                                            }
+	GetTexParameterIiv                  :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                {        impl_GetTexParameterIiv(target, pname, params);                                             debug_helper(loc, 0, target, pname, params);                                                            }
+	GetTexParameterIuiv                 :: #force_inline proc "c" (target: u32, pname: u32, params: [^]u32, loc := #caller_location)                                                                                {        impl_GetTexParameterIuiv(target, pname, params);                                            debug_helper(loc, 0, target, pname, params);                                                            }
+	ClearBufferiv                       :: #force_inline proc "c" (buffer: u32, drawbuffer: i32, value: ^i32, loc := #caller_location)                                                                              {        impl_ClearBufferiv(buffer, drawbuffer, value);                                              debug_helper(loc, 0, buffer, drawbuffer, value);                                                        }
+	ClearBufferuiv                      :: #force_inline proc "c" (buffer: u32, drawbuffer: i32, value: ^u32, loc := #caller_location)                                                                              {        impl_ClearBufferuiv(buffer, drawbuffer, value);                                             debug_helper(loc, 0, buffer, drawbuffer, value);                                                        }
+	ClearBufferfv                       :: #force_inline proc "c" (buffer: u32, drawbuffer: i32, value: ^f32, loc := #caller_location)                                                                              {        impl_ClearBufferfv(buffer, drawbuffer, value);                                              debug_helper(loc, 0, buffer, drawbuffer, value);                                                        }
+	ClearBufferfi                       :: #force_inline proc "c" (buffer: u32, drawbuffer: i32, depth: f32, stencil: i32, loc := #caller_location) -> rawptr                                                       { ret := impl_ClearBufferfi(buffer, drawbuffer, depth, stencil);                                     debug_helper(loc, 1, ret, buffer, drawbuffer, depth, stencil);                              return ret; }
+	GetStringi                          :: #force_inline proc "c" (name: u32, index: u32, loc := #caller_location) -> cstring                                                                                       { ret := impl_GetStringi(name, index);                                                               debug_helper(loc, 1, ret, name, index);                                                     return ret; }
+	IsRenderbuffer                      :: #force_inline proc "c" (renderbuffer: u32, loc := #caller_location) -> bool                                                                                              { ret := impl_IsRenderbuffer(renderbuffer);                                                          debug_helper(loc, 1, ret, renderbuffer);                                                    return ret; }
+	BindRenderbuffer                    :: #force_inline proc "c" (target: u32, renderbuffer: u32, loc := #caller_location)                                                                                         {        impl_BindRenderbuffer(target, renderbuffer);                                                debug_helper(loc, 0, target, renderbuffer);                                                             }
+	DeleteRenderbuffers                 :: #force_inline proc "c" (n: i32, renderbuffers: [^]u32, loc := #caller_location)                                                                                          {        impl_DeleteRenderbuffers(n, renderbuffers);                                                 debug_helper(loc, 0, n, renderbuffers);                                                                 }
+	GenRenderbuffers                    :: #force_inline proc "c" (n: i32, renderbuffers: [^]u32, loc := #caller_location)                                                                                          {        impl_GenRenderbuffers(n, renderbuffers);                                                    debug_helper(loc, 0, n, renderbuffers);                                                                 }
+	RenderbufferStorage                 :: #force_inline proc "c" (target: u32, internalformat: u32, width: i32, height: i32, loc := #caller_location)                                                              {        impl_RenderbufferStorage(target, internalformat, width, height);                            debug_helper(loc, 0, target, internalformat, width, height);                                            }
+	GetRenderbufferParameteriv          :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                {        impl_GetRenderbufferParameteriv(target, pname, params);                                     debug_helper(loc, 0, target, pname, params);                                                            }
+	IsFramebuffer                       :: #force_inline proc "c" (framebuffer: u32, loc := #caller_location) -> bool                                                                                               { ret := impl_IsFramebuffer(framebuffer);                                                            debug_helper(loc, 1, ret, framebuffer);                                                     return ret; }
+	BindFramebuffer                     :: #force_inline proc "c" (target: u32, framebuffer: u32, loc := #caller_location)                                                                                          {        impl_BindFramebuffer(target, framebuffer);                                                  debug_helper(loc, 0, target, framebuffer);                                                              }
+	DeleteFramebuffers                  :: #force_inline proc "c" (n: i32, framebuffers: [^]u32, loc := #caller_location)                                                                                           {        impl_DeleteFramebuffers(n, framebuffers);                                                   debug_helper(loc, 0, n, framebuffers);                                                                  }
+	GenFramebuffers                     :: #force_inline proc "c" (n: i32, framebuffers: [^]u32, loc := #caller_location)                                                                                           {        impl_GenFramebuffers(n, framebuffers);                                                      debug_helper(loc, 0, n, framebuffers);                                                                  }
+	CheckFramebufferStatus              :: #force_inline proc "c" (target: u32, loc := #caller_location) -> u32                                                                                                     { ret := impl_CheckFramebufferStatus(target);                                                        debug_helper(loc, 1, ret, target);                                                          return ret; }
+	FramebufferTexture1D                :: #force_inline proc "c" (target: u32, attachment: u32, textarget: u32, texture: u32, level: i32, loc := #caller_location)                                                 {        impl_FramebufferTexture1D(target, attachment, textarget, texture, level);                   debug_helper(loc, 0, target, attachment, textarget, texture, level);                                    }
+	FramebufferTexture2D                :: #force_inline proc "c" (target: u32, attachment: u32, textarget: u32, texture: u32, level: i32, loc := #caller_location)                                                 {        impl_FramebufferTexture2D(target, attachment, textarget, texture, level);                   debug_helper(loc, 0, target, attachment, textarget, texture, level);                                    }
+	FramebufferTexture3D                :: #force_inline proc "c" (target: u32, attachment: u32, textarget: u32, texture: u32, level: i32, zoffset: i32, loc := #caller_location)                                   {        impl_FramebufferTexture3D(target, attachment, textarget, texture, level, zoffset);          debug_helper(loc, 0, target, attachment, textarget, texture, level, zoffset);                           }
+	FramebufferRenderbuffer             :: #force_inline proc "c" (target: u32, attachment: u32, renderbuffertarget: u32, renderbuffer: u32, loc := #caller_location)                                               {        impl_FramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer);         debug_helper(loc, 0, target, attachment, renderbuffertarget, renderbuffer);                             }
+	GetFramebufferAttachmentParameteriv :: #force_inline proc "c" (target: u32, attachment: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                               {        impl_GetFramebufferAttachmentParameteriv(target, attachment, pname, params);                debug_helper(loc, 0, target, attachment, pname, params);                                                }
+	GenerateMipmap                      :: #force_inline proc "c" (target: u32, loc := #caller_location)                                                                                                            {        impl_GenerateMipmap(target);                                                                debug_helper(loc, 0, target);                                                                           }
+	BlitFramebuffer                     :: #force_inline proc "c" (srcX0: i32, srcY0: i32, srcX1: i32, srcY1: i32, dstX0: i32, dstY0: i32, dstX1: i32, dstY1: i32, mask: u32, filter: u32, loc := #caller_location) {        impl_BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); debug_helper(loc, 0, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);             }
+	RenderbufferStorageMultisample      :: #force_inline proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, loc := #caller_location)                                                {        impl_RenderbufferStorageMultisample(target, samples, internalformat, width, height);        debug_helper(loc, 0, target, samples, internalformat, width, height);                                   }
+	FramebufferTextureLayer             :: #force_inline proc "c" (target: u32, attachment: u32, texture: u32, level: i32, layer: i32, loc := #caller_location)                                                     {        impl_FramebufferTextureLayer(target, attachment, texture, level, layer);                    debug_helper(loc, 0, target, attachment, texture, level, layer);                                        }
+	MapBufferRange                      :: #force_inline proc "c" (target: u32, offset: int, length: int, access: u32, loc := #caller_location) -> rawptr                                                           { ret := impl_MapBufferRange(target, offset, length, access);                                        debug_helper(loc, 1, ret, target, offset, length, access);                                  return ret; }
+	FlushMappedBufferRange              :: #force_inline proc "c" (target: u32, offset: int, length: int, loc := #caller_location)                                                                                  {        impl_FlushMappedBufferRange(target, offset, length);                                        debug_helper(loc, 0, target, offset, length);                                                           }
+	BindVertexArray                     :: #force_inline proc "c" (array: u32, loc := #caller_location)                                                                                                             {        impl_BindVertexArray(array);                                                                debug_helper(loc, 0, array);                                                                            }
+	DeleteVertexArrays                  :: #force_inline proc "c" (n: i32, arrays: [^]u32, loc := #caller_location)                                                                                                 {        impl_DeleteVertexArrays(n, arrays);                                                         debug_helper(loc, 0, n, arrays);                                                                        }
+	GenVertexArrays                     :: #force_inline proc "c" (n: i32, arrays: [^]u32, loc := #caller_location)                                                                                                 {        impl_GenVertexArrays(n, arrays);                                                            debug_helper(loc, 0, n, arrays);                                                                        }
+	IsVertexArray                       :: #force_inline proc "c" (array: u32, loc := #caller_location) -> bool                                                                                                     { ret := impl_IsVertexArray(array);                                                                  debug_helper(loc, 1, ret, array);                                                           return ret; }
+
+	// VERSION_3_1
+	DrawArraysInstanced       :: #force_inline proc "c" (mode: u32, first: i32, count: i32, instancecount: i32, loc := #caller_location)                                     {        impl_DrawArraysInstanced(mode, first, count, instancecount);                                   debug_helper(loc, 0, mode, first, count, instancecount);            }
+	DrawElementsInstanced     :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32, loc := #caller_location)                     {        impl_DrawElementsInstanced(mode, count, type, indices, instancecount);                        debug_helper(loc, 0, mode, count, type, indices, instancecount);            }
+	TexBuffer                 :: #force_inline proc "c" (target: u32, internalformat: u32, buffer: u32, loc := #caller_location)                                             {        impl_TexBuffer(target, internalformat, buffer);                                                debug_helper(loc, 0, target, internalformat, buffer);            }
+	PrimitiveRestartIndex     :: #force_inline proc "c" (index: u32, loc := #caller_location)                                                                                {        impl_PrimitiveRestartIndex(index);                                                             debug_helper(loc, 0, index);            }
+	CopyBufferSubData         :: #force_inline proc "c" (readTarget: u32, writeTarget: u32, readOffset: int, writeOffset: int, size: int, loc := #caller_location)           {        impl_CopyBufferSubData(readTarget, writeTarget, readOffset, writeOffset, size);                debug_helper(loc, 0, readTarget, writeTarget, readOffset, writeOffset, size);            }
+	GetUniformIndices         :: #force_inline proc "c" (program: u32, uniformCount: i32, uniformNames: [^]cstring, uniformIndices: [^]u32, loc := #caller_location)         {        impl_GetUniformIndices(program, uniformCount, uniformNames, uniformIndices);                   debug_helper(loc, 0, program, uniformCount, uniformNames, uniformIndices);            }
+	GetActiveUniformsiv       :: #force_inline proc "c" (program: u32, uniformCount: i32, uniformIndices: [^]u32, pname: u32, params: [^]i32, loc := #caller_location)       {        impl_GetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params);                debug_helper(loc, 0, program, uniformCount, uniformIndices, pname, params);            }
+	GetActiveUniformName      :: #force_inline proc "c" (program: u32, uniformIndex: u32, bufSize: i32, length: ^i32, uniformName: [^]u8, loc := #caller_location)           {        impl_GetActiveUniformName(program, uniformIndex, bufSize, length, uniformName);                debug_helper(loc, 0, program, uniformIndex, bufSize, length, uniformName);            }
+	GetUniformBlockIndex      :: #force_inline proc "c" (program: u32, uniformBlockName: cstring, loc := #caller_location) -> u32                                            { ret := impl_GetUniformBlockIndex(program, uniformBlockName);                                          debug_helper(loc, 1, ret, program, uniformBlockName); return ret; }
+	GetActiveUniformBlockiv   :: #force_inline proc "c" (program: u32, uniformBlockIndex: u32, pname: u32, params: [^]i32, loc := #caller_location)                          {        impl_GetActiveUniformBlockiv(program, uniformBlockIndex, pname, params);                       debug_helper(loc, 0, program, uniformBlockIndex, pname, params);            }
+	GetActiveUniformBlockName :: #force_inline proc "c" (program: u32, uniformBlockIndex: u32, bufSize: i32, length: ^i32, uniformBlockName: [^]u8, loc := #caller_location) {        impl_GetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName); debug_helper(loc, 0, program, uniformBlockIndex, bufSize, length, uniformBlockName);            }
+	UniformBlockBinding       :: #force_inline proc "c" (program: u32, uniformBlockIndex: u32, uniformBlockBinding: u32, loc := #caller_location)                            {        impl_UniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding);                     debug_helper(loc, 0, program, uniformBlockIndex, uniformBlockBinding);            }
+
+	// VERSION_3_2
+	DrawElementsBaseVertex          :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, basevertex: i32, loc := #caller_location)                                            {        impl_DrawElementsBaseVertex(mode, count, type, indices, basevertex);                                    debug_helper(loc, 0, mode, count, type, indices, basevertex);                                                 }
+	DrawRangeElementsBaseVertex     :: #force_inline proc "c" (mode: u32, start: u32, end: u32, count: i32, type: u32, indices: rawptr, basevertex: i32, loc := #caller_location)                      {        impl_DrawRangeElementsBaseVertex(mode, start, end, count, type, indices, basevertex);                   debug_helper(loc, 0, mode, start, end, count, type, indices, basevertex);                                     }
+	DrawElementsInstancedBaseVertex :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32, basevertex: i32, loc := #caller_location)                        {        impl_DrawElementsInstancedBaseVertex(mode, count, type, indices, instancecount, basevertex);            debug_helper(loc, 0, mode, count, type, indices, instancecount, basevertex);                                  }
+	MultiDrawElementsBaseVertex     :: #force_inline proc "c" (mode: u32, count: [^]i32, type: u32, indices: [^]rawptr, drawcount: i32, basevertex: [^]i32, loc := #caller_location)                   {        impl_MultiDrawElementsBaseVertex(mode, count, type, indices, drawcount, basevertex);                    debug_helper(loc, 0, mode, count, type, indices, drawcount, basevertex);                                      }
+	ProvokingVertex                 :: #force_inline proc "c" (mode: u32, loc := #caller_location)                                                                                                     {        impl_ProvokingVertex(mode);                                                                              debug_helper(loc, 0, mode);                                                                                    }
+	FenceSync                       :: #force_inline proc "c" (condition: u32, flags: u32, loc := #caller_location) -> sync_t                                                                          { ret := impl_FenceSync(condition, flags);                                                                        debug_helper(loc, 1, ret, condition, flags);                                                       return ret; }
+	IsSync                          :: #force_inline proc "c" (sync: sync_t, loc := #caller_location) -> bool                                                                                          { ret := impl_IsSync(sync);                                                                                       debug_helper(loc, 1, ret, sync);                                                                   return ret; }
+	DeleteSync                      :: #force_inline proc "c" (sync: sync_t, loc := #caller_location)                                                                                                  {        impl_DeleteSync(sync);                                                                                   debug_helper(loc, 0, sync);                                                                                    }
+	ClientWaitSync                  :: #force_inline proc "c" (sync: sync_t, flags: u32, timeout: u64, loc := #caller_location) -> u32                                                                 { ret := impl_ClientWaitSync(sync, flags, timeout);                                                               debug_helper(loc, 1, ret, sync, flags, timeout);                                                   return ret; }
+	WaitSync                        :: #force_inline proc "c" (sync: sync_t, flags: u32, timeout: u64, loc := #caller_location)                                                                        {        impl_WaitSync(sync, flags, timeout);                                                                     debug_helper(loc, 0, sync, flags, timeout);                                                                    }
+	GetInteger64v                   :: #force_inline proc "c" (pname: u32, data: ^i64, loc := #caller_location)                                                                                        {        impl_GetInteger64v(pname, data);                                                                         debug_helper(loc, 0, pname, data);                                                                             }
+	GetSynciv                       :: #force_inline proc "c" (sync: sync_t, pname: u32, bufSize: i32, length: ^i32, values: [^]i32, loc := #caller_location)                                          {        impl_GetSynciv(sync, pname, bufSize, length, values);                                                    debug_helper(loc, 0, sync, pname, bufSize, length, values);                                                    }
+	GetInteger64i_v                 :: #force_inline proc "c" (target: u32, index: u32, data: ^i64, loc := #caller_location)                                                                           {        impl_GetInteger64i_v(target, index, data);                                                               debug_helper(loc, 0, target, index, data);                                                                     }
+	GetBufferParameteri64v          :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i64, loc := #caller_location)                                                                       {        impl_GetBufferParameteri64v(target, pname, params);                                                      debug_helper(loc, 0, target, pname, params);                                                                   }
+	FramebufferTexture              :: #force_inline proc "c" (target: u32, attachment: u32, texture: u32, level: i32, loc := #caller_location)                                                        {        impl_FramebufferTexture(target, attachment, texture, level);                                             debug_helper(loc, 0, target, attachment, texture, level);                                                      }
+	TexImage2DMultisample           :: #force_inline proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: u8, loc := #caller_location)             {        impl_TexImage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);        debug_helper(loc, 0, target, samples, internalformat, width, height, fixedsamplelocations);                    }
+	TexImage3DMultisample           :: #force_inline proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: u8, loc := #caller_location) {        impl_TexImage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations); debug_helper(loc, 0, target, samples, internalformat, width, height, depth, fixedsamplelocations);             }
+	GetMultisamplefv                :: #force_inline proc "c" (pname: u32, index: u32, val: ^f32, loc := #caller_location)                                                                             {        impl_GetMultisamplefv(pname, index, val);                                                                debug_helper(loc, 0, pname, index, val);                                                                       }
+	SampleMaski                     :: #force_inline proc "c" (maskNumber: u32, mask: u32, loc := #caller_location)                                                                                    {        impl_SampleMaski(maskNumber, mask);                                                                      debug_helper(loc, 0, maskNumber, mask);                                                                        }
+
+	// VERSION_3_3
+	BindFragDataLocationIndexed :: #force_inline proc "c" (program: u32, colorNumber: u32, index: u32, name: cstring, loc := #caller_location) {        impl_BindFragDataLocationIndexed(program, colorNumber, index, name); debug_helper(loc, 0, program, colorNumber, index, name);             }
+	GetFragDataIndex            :: #force_inline proc "c" (program: u32, name: cstring, loc := #caller_location) -> i32                        { ret := impl_GetFragDataIndex(program, name);                                debug_helper(loc, 1, ret, program, name);                return ret; }
+	GenSamplers                 :: #force_inline proc "c" (count: i32, samplers: [^]u32, loc := #caller_location)                              {        impl_GenSamplers(count, samplers);                                   debug_helper(loc, 0, count, samplers);                               }
+	DeleteSamplers              :: #force_inline proc "c" (count: i32, samplers: [^]u32, loc := #caller_location)                              {        impl_DeleteSamplers(count, samplers);                                debug_helper(loc, 0, count, samplers);                               }
+	IsSampler                   :: #force_inline proc "c" (sampler: u32, loc := #caller_location) -> bool                                      { ret := impl_IsSampler(sampler);                                             debug_helper(loc, 1, ret, sampler);                      return ret; }
+	BindSampler                 :: #force_inline proc "c" (unit: u32, sampler: u32, loc := #caller_location)                                   {        impl_BindSampler(unit, sampler);                                     debug_helper(loc, 0, unit, sampler);                                 }
+	SamplerParameteri           :: #force_inline proc "c" (sampler: u32, pname: u32, param: i32, loc := #caller_location)                      {        impl_SamplerParameteri(sampler, pname, param);                       debug_helper(loc, 0, sampler, pname, param);                         }
+	SamplerParameteriv          :: #force_inline proc "c" (sampler: u32, pname: u32, param: ^i32, loc := #caller_location)                     {        impl_SamplerParameteriv(sampler, pname, param);                      debug_helper(loc, 0, sampler, pname, param);                         }
+	SamplerParameterf           :: #force_inline proc "c" (sampler: u32, pname: u32, param: f32, loc := #caller_location)                      {        impl_SamplerParameterf(sampler, pname, param);                       debug_helper(loc, 0, sampler, pname, param);                         }
+	SamplerParameterfv          :: #force_inline proc "c" (sampler: u32, pname: u32, param: ^f32, loc := #caller_location)                     {        impl_SamplerParameterfv(sampler, pname, param);                      debug_helper(loc, 0, sampler, pname, param);                         }
+	SamplerParameterIiv         :: #force_inline proc "c" (sampler: u32, pname: u32, param: ^i32, loc := #caller_location)                     {        impl_SamplerParameterIiv(sampler, pname, param);                     debug_helper(loc, 0, sampler, pname, param);                         }
+	SamplerParameterIuiv        :: #force_inline proc "c" (sampler: u32, pname: u32, param: ^u32, loc := #caller_location)                     {        impl_SamplerParameterIuiv(sampler, pname, param);                    debug_helper(loc, 0, sampler, pname, param);                         }
+	GetSamplerParameteriv       :: #force_inline proc "c" (sampler: u32, pname: u32, params: [^]i32, loc := #caller_location)                  {        impl_GetSamplerParameteriv(sampler, pname, params);                  debug_helper(loc, 0, sampler, pname, params);                        }
+	GetSamplerParameterIiv      :: #force_inline proc "c" (sampler: u32, pname: u32, params: [^]i32, loc := #caller_location)                  {        impl_GetSamplerParameterIiv(sampler, pname, params);                 debug_helper(loc, 0, sampler, pname, params);                        }
+	GetSamplerParameterfv       :: #force_inline proc "c" (sampler: u32, pname: u32, params: [^]f32, loc := #caller_location)                  {        impl_GetSamplerParameterfv(sampler, pname, params);                  debug_helper(loc, 0, sampler, pname, params);                        }
+	GetSamplerParameterIuiv     :: #force_inline proc "c" (sampler: u32, pname: u32, params: [^]u32, loc := #caller_location)                  {        impl_GetSamplerParameterIuiv(sampler, pname, params);                debug_helper(loc, 0, sampler, pname, params);                        }
+	QueryCounter                :: #force_inline proc "c" (id: u32, target: u32, loc := #caller_location)                                      {        impl_QueryCounter(id, target);                                       debug_helper(loc, 0, id, target);                                    }
+	GetQueryObjecti64v          :: #force_inline proc "c" (id: u32, pname: u32, params: [^]i64, loc := #caller_location)                       {        impl_GetQueryObjecti64v(id, pname, params);                          debug_helper(loc, 0, id, pname, params);                             }
+	GetQueryObjectui64v         :: #force_inline proc "c" (id: u32, pname: u32, params: [^]u64, loc := #caller_location)                       {        impl_GetQueryObjectui64v(id, pname, params);                         debug_helper(loc, 0, id, pname, params);                             }
+	VertexAttribDivisor         :: #force_inline proc "c" (index: u32, divisor: u32, loc := #caller_location)                                  {        impl_VertexAttribDivisor(index, divisor);                            debug_helper(loc, 0, index, divisor);                                }
+	VertexAttribP1ui            :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: u32, loc := #caller_location)       {        impl_VertexAttribP1ui(index, type, normalized, value);              debug_helper(loc, 0, index, type, normalized, value);               }
+	VertexAttribP1uiv           :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: ^u32, loc := #caller_location)      {        impl_VertexAttribP1uiv(index, type, normalized, value);             debug_helper(loc, 0, index, type, normalized, value);               }
+	VertexAttribP2ui            :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: u32, loc := #caller_location)       {        impl_VertexAttribP2ui(index, type, normalized, value);              debug_helper(loc, 0, index, type, normalized, value);               }
+	VertexAttribP2uiv           :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: ^u32, loc := #caller_location)      {        impl_VertexAttribP2uiv(index, type, normalized, value);             debug_helper(loc, 0, index, type, normalized, value);               }
+	VertexAttribP3ui            :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: u32, loc := #caller_location)       {        impl_VertexAttribP3ui(index, type, normalized, value);              debug_helper(loc, 0, index, type, normalized, value);               }
+	VertexAttribP3uiv           :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: ^u32, loc := #caller_location)      {        impl_VertexAttribP3uiv(index, type, normalized, value);             debug_helper(loc, 0, index, type, normalized, value);               }
+	VertexAttribP4ui            :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: u32, loc := #caller_location)       {        impl_VertexAttribP4ui(index, type, normalized, value);              debug_helper(loc, 0, index, type, normalized, value);               }
+	VertexAttribP4uiv           :: #force_inline proc "c" (index: u32, type: u32, normalized: bool, value: ^u32, loc := #caller_location)      {        impl_VertexAttribP4uiv(index, type, normalized, value);             debug_helper(loc, 0, index, type, normalized, value);               }
+	VertexP2ui                  :: #force_inline proc "c" (type: u32, value: u32, loc := #caller_location)                                     {        impl_VertexP2ui(type, value);                                       debug_helper(loc, 0, type, value);                                  }
+	VertexP2uiv                 :: #force_inline proc "c" (type: u32, value: ^u32, loc := #caller_location)                                    {        impl_VertexP2uiv(type, value);                                      debug_helper(loc, 0, type, value);                                  }
+	VertexP3ui                  :: #force_inline proc "c" (type: u32, value: u32, loc := #caller_location)                                     {        impl_VertexP3ui(type, value);                                       debug_helper(loc, 0, type, value);                                  }
+	VertexP3uiv                 :: #force_inline proc "c" (type: u32, value: ^u32, loc := #caller_location)                                    {        impl_VertexP3uiv(type, value);                                      debug_helper(loc, 0, type, value);                                  }
+	VertexP4ui                  :: #force_inline proc "c" (type: u32, value: u32, loc := #caller_location)                                     {        impl_VertexP4ui(type, value);                                       debug_helper(loc, 0, type, value);                                  }
+	VertexP4uiv                 :: #force_inline proc "c" (type: u32, value: ^u32, loc := #caller_location)                                    {        impl_VertexP4uiv(type, value);                                      debug_helper(loc, 0, type, value);                                  }
+	TexCoordP1ui                :: #force_inline proc "c" (type: u32, coords: u32, loc := #caller_location)                                    {        impl_TexCoordP1ui(type, coords);                                    debug_helper(loc, 0, type, coords);                                 }
+	TexCoordP1uiv               :: #force_inline proc "c" (type: u32, coords: [^]u32, loc := #caller_location)                                 {        impl_TexCoordP1uiv(type, coords);                                   debug_helper(loc, 0, type, coords);                                 }
+	TexCoordP2ui                :: #force_inline proc "c" (type: u32, coords: u32, loc := #caller_location)                                    {        impl_TexCoordP2ui(type, coords);                                    debug_helper(loc, 0, type, coords);                                 }
+	TexCoordP2uiv               :: #force_inline proc "c" (type: u32, coords: [^]u32, loc := #caller_location)                                 {        impl_TexCoordP2uiv(type, coords);                                   debug_helper(loc, 0, type, coords);                                 }
+	TexCoordP3ui                :: #force_inline proc "c" (type: u32, coords: u32, loc := #caller_location)                                    {        impl_TexCoordP3ui(type, coords);                                    debug_helper(loc, 0, type, coords);                                 }
+	TexCoordP3uiv               :: #force_inline proc "c" (type: u32, coords: [^]u32, loc := #caller_location)                                 {        impl_TexCoordP3uiv(type, coords);                                   debug_helper(loc, 0, type, coords);                                 }
+	TexCoordP4ui                :: #force_inline proc "c" (type: u32, coords: u32, loc := #caller_location)                                    {        impl_TexCoordP4ui(type, coords);                                    debug_helper(loc, 0, type, coords);                                 }
+	TexCoordP4uiv               :: #force_inline proc "c" (type: u32, coords: [^]u32, loc := #caller_location)                                 {        impl_TexCoordP4uiv(type, coords);                                   debug_helper(loc, 0, type, coords);                                 }
+	MultiTexCoordP1ui           :: #force_inline proc "c" (texture: u32, type: u32, coords: u32, loc := #caller_location)                      {        impl_MultiTexCoordP1ui(texture, type, coords);                      debug_helper(loc, 0, texture, type, coords);                        }
+	MultiTexCoordP1uiv          :: #force_inline proc "c" (texture: u32, type: u32, coords: [^]u32, loc := #caller_location)                   {        impl_MultiTexCoordP1uiv(texture, type, coords);                     debug_helper(loc, 0, texture, type, coords);                        }
+	MultiTexCoordP2ui           :: #force_inline proc "c" (texture: u32, type: u32, coords: u32, loc := #caller_location)                      {        impl_MultiTexCoordP2ui(texture, type, coords);                      debug_helper(loc, 0, texture, type, coords);                        }
+	MultiTexCoordP2uiv          :: #force_inline proc "c" (texture: u32, type: u32, coords: [^]u32, loc := #caller_location)                   {        impl_MultiTexCoordP2uiv(texture, type, coords);                     debug_helper(loc, 0, texture, type, coords);                        }
+	MultiTexCoordP3ui           :: #force_inline proc "c" (texture: u32, type: u32, coords: u32, loc := #caller_location)                      {        impl_MultiTexCoordP3ui(texture, type, coords);                      debug_helper(loc, 0, texture, type, coords);                        }
+	MultiTexCoordP3uiv          :: #force_inline proc "c" (texture: u32, type: u32, coords: [^]u32, loc := #caller_location)                   {        impl_MultiTexCoordP3uiv(texture, type, coords);                     debug_helper(loc, 0, texture, type, coords);                        }
+	MultiTexCoordP4ui           :: #force_inline proc "c" (texture: u32, type: u32, coords: u32, loc := #caller_location)                      {        impl_MultiTexCoordP4ui(texture, type, coords);                      debug_helper(loc, 0, texture, type, coords);                        }
+	MultiTexCoordP4uiv          :: #force_inline proc "c" (texture: u32, type: u32, coords: [^]u32, loc := #caller_location)                   {        impl_MultiTexCoordP4uiv(texture, type, coords);                     debug_helper(loc, 0, texture, type, coords);                        }
+	NormalP3ui                  :: #force_inline proc "c" (type: u32, coords: u32, loc := #caller_location)                                    {        impl_NormalP3ui(type, coords);                                      debug_helper(loc, 0, type, coords);                                 }
+	NormalP3uiv                 :: #force_inline proc "c" (type: u32, coords: [^]u32, loc := #caller_location)                                 {        impl_NormalP3uiv(type, coords);                                     debug_helper(loc, 0, type, coords);                                 }
+	ColorP3ui                   :: #force_inline proc "c" (type: u32, color: u32, loc := #caller_location)                                     {        impl_ColorP3ui(type, color);                                        debug_helper(loc, 0, type, color);                                  }
+	ColorP3uiv                  :: #force_inline proc "c" (type: u32, color: ^u32, loc := #caller_location)                                    {        impl_ColorP3uiv(type, color);                                       debug_helper(loc, 0, type, color);                                  }
+	ColorP4ui                   :: #force_inline proc "c" (type: u32, color: u32, loc := #caller_location)                                     {        impl_ColorP4ui(type, color);                                        debug_helper(loc, 0, type, color);                                  }
+	ColorP4uiv                  :: #force_inline proc "c" (type: u32, color: ^u32, loc := #caller_location)                                    {        impl_ColorP4uiv(type, color);                                       debug_helper(loc, 0, type, color);                                  }
+	SecondaryColorP3ui          :: #force_inline proc "c" (type: u32, color: u32, loc := #caller_location)                                     {        impl_SecondaryColorP3ui(type, color);                               debug_helper(loc, 0, type, color);                                  }
+	SecondaryColorP3uiv         :: #force_inline proc "c" (type: u32, color: ^u32, loc := #caller_location)                                    {        impl_SecondaryColorP3uiv(type, color);                              debug_helper(loc, 0, type, color);                                  }
+
+	// VERSION_4_0
+	MinSampleShading               :: #force_inline proc "c" (value: f32, loc := #caller_location)                                                                         {        impl_MinSampleShading(value);                                                            debug_helper(loc, 0, value);                                                          }
+	BlendEquationi                 :: #force_inline proc "c" (buf: u32, mode: u32, loc := #caller_location)                                                                {        impl_BlendEquationi(buf, mode);                                                          debug_helper(loc, 0, buf, mode);                                                      }
+	BlendEquationSeparatei         :: #force_inline proc "c" (buf: u32, modeRGB: u32, modeAlpha: u32, loc := #caller_location)                                             {        impl_BlendEquationSeparatei(buf, modeRGB, modeAlpha);                                    debug_helper(loc, 0, buf, modeRGB, modeAlpha);                                        }
+	BlendFunci                     :: #force_inline proc "c" (buf: u32, src: u32, dst: u32, loc := #caller_location)                                                       {        impl_BlendFunci(buf, src, dst);                                                          debug_helper(loc, 0, buf, src, dst);                                                  }
+	BlendFuncSeparatei             :: #force_inline proc "c" (buf: u32, srcRGB: u32, dstRGB: u32, srcAlpha: u32, dstAlpha: u32, loc := #caller_location)                   {        impl_BlendFuncSeparatei(buf, srcRGB, dstRGB, srcAlpha, dstAlpha);                        debug_helper(loc, 0, buf, srcRGB, dstRGB, srcAlpha, dstAlpha);                        }
+	DrawArraysIndirect             :: #force_inline proc "c" (mode: u32, indirect: rawptr, loc := #caller_location)                                                        {        impl_DrawArraysIndirect(mode, indirect);                                                 debug_helper(loc, 0, mode, indirect);                                                 }
+	DrawElementsIndirect           :: #force_inline proc "c" (mode: u32, type: u32, indirect: rawptr, loc := #caller_location)                                             {        impl_DrawElementsIndirect(mode, type, indirect);                                        debug_helper(loc, 0, mode, type, indirect);                                          }
+	Uniform1d                      :: #force_inline proc "c" (location: i32, x: f64, loc := #caller_location)                                                              {        impl_Uniform1d(location, x);                                                             debug_helper(loc, 0, location, x);                                                    }
+	Uniform2d                      :: #force_inline proc "c" (location: i32, x: f64, y: f64, loc := #caller_location)                                                      {        impl_Uniform2d(location, x, y);                                                          debug_helper(loc, 0, location, x, y);                                                 }
+	Uniform3d                      :: #force_inline proc "c" (location: i32, x: f64, y: f64, z: f64, loc := #caller_location)                                              {        impl_Uniform3d(location, x, y, z);                                                       debug_helper(loc, 0, location, x, y, z);                                              }
+	Uniform4d                      :: #force_inline proc "c" (location: i32, x: f64, y: f64, z: f64, w: f64, loc := #caller_location)                                      {        impl_Uniform4d(location, x, y, z, w);                                                    debug_helper(loc, 0, location, x, y, z, w);                                           }
+	Uniform1dv                     :: #force_inline proc "c" (location: i32, count: i32, value: [^]f64, loc := #caller_location)                                           {        impl_Uniform1dv(location, count, value);                                                 debug_helper(loc, 0, location, count, value);                                         }
+	Uniform2dv                     :: #force_inline proc "c" (location: i32, count: i32, value: [^]f64, loc := #caller_location)                                           {        impl_Uniform2dv(location, count, value);                                                 debug_helper(loc, 0, location, count, value);                                         }
+	Uniform3dv                     :: #force_inline proc "c" (location: i32, count: i32, value: [^]f64, loc := #caller_location)                                           {        impl_Uniform3dv(location, count, value);                                                 debug_helper(loc, 0, location, count, value);                                         }
+	Uniform4dv                     :: #force_inline proc "c" (location: i32, count: i32, value: [^]f64, loc := #caller_location)                                           {        impl_Uniform4dv(location, count, value);                                                 debug_helper(loc, 0, location, count, value);                                         }
+	UniformMatrix2dv               :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)                          {        impl_UniformMatrix2dv(location, count, transpose, value);                                debug_helper(loc, 0, location, count, transpose, value);                              }
+	UniformMatrix3dv               :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)                          {        impl_UniformMatrix3dv(location, count, transpose, value);                                debug_helper(loc, 0, location, count, transpose, value);                              }
+	UniformMatrix4dv               :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)                          {        impl_UniformMatrix4dv(location, count, transpose, value);                                debug_helper(loc, 0, location, count, transpose, value);                              }
+	UniformMatrix2x3dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)                          {        impl_UniformMatrix2x3dv(location, count, transpose, value);                              debug_helper(loc, 0, location, count, transpose, value);                              }
+	UniformMatrix2x4dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)                          {        impl_UniformMatrix2x4dv(location, count, transpose, value);                              debug_helper(loc, 0, location, count, transpose, value);                              }
+	UniformMatrix3x2dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)                          {        impl_UniformMatrix3x2dv(location, count, transpose, value);                              debug_helper(loc, 0, location, count, transpose, value);                              }
+	UniformMatrix3x4dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)                          {        impl_UniformMatrix3x4dv(location, count, transpose, value);                              debug_helper(loc, 0, location, count, transpose, value);                              }
+	UniformMatrix4x2dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)                          {        impl_UniformMatrix4x2dv(location, count, transpose, value);                              debug_helper(loc, 0, location, count, transpose, value);                              }
+	UniformMatrix4x3dv             :: #force_inline proc "c" (location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)                          {        impl_UniformMatrix4x3dv(location, count, transpose, value);                              debug_helper(loc, 0, location, count, transpose, value);                              }
+	GetUniformdv                   :: #force_inline proc "c" (program: u32, location: i32, params: [^]f64, loc := #caller_location)                                        {        impl_GetUniformdv(program, location, params);                                            debug_helper(loc, 0, program, location, params);                                      }
+	GetSubroutineUniformLocation   :: #force_inline proc "c" (program: u32, shadertype: u32, name: cstring, loc := #caller_location) -> i32                                { ret := impl_GetSubroutineUniformLocation(program, shadertype, name);                           debug_helper(loc, 1, ret, program, shadertype, name);                    return ret; }
+	GetSubroutineIndex             :: #force_inline proc "c" (program: u32, shadertype: u32, name: cstring, loc := #caller_location) -> u32                                { ret := impl_GetSubroutineIndex(program, shadertype, name);                                     debug_helper(loc, 1, ret, program, shadertype, name);                    return ret; }
+	GetActiveSubroutineUniformiv   :: #force_inline proc "c" (program: u32, shadertype: u32, index: u32, pname: u32, values: [^]i32, loc := #caller_location)              {        impl_GetActiveSubroutineUniformiv(program, shadertype, index, pname, values);           debug_helper(loc, 0, program, shadertype, index, pname, values);                     }
+	GetActiveSubroutineUniformName :: #force_inline proc "c" (program: u32, shadertype: u32, index: u32, bufsize: i32, length: ^i32, name: [^]u8, loc := #caller_location) {        impl_GetActiveSubroutineUniformName(program, shadertype, index, bufsize, length, name); debug_helper(loc, 0, program, shadertype, index, bufsize, length, name);             }
+	GetActiveSubroutineName        :: #force_inline proc "c" (program: u32, shadertype: u32, index: u32, bufsize: i32, length: ^i32, name: [^]u8, loc := #caller_location) {        impl_GetActiveSubroutineName(program, shadertype, index, bufsize, length, name);        debug_helper(loc, 0, program, shadertype, index, bufsize, length, name);             }
+	UniformSubroutinesuiv          :: #force_inline proc "c" (shadertype: u32, count: i32, indices: ^u32, loc := #caller_location)                                         {        impl_UniformSubroutinesuiv(shadertype, count, indices);                                 debug_helper(loc, 0, shadertype, count, indices);                                    }
+	GetUniformSubroutineuiv        :: #force_inline proc "c" (shadertype: u32, location: i32, params: [^]u32, loc := #caller_location)                                     {        impl_GetUniformSubroutineuiv(shadertype, location, params);                             debug_helper(loc, 0, shadertype, location, params);                                  }
+	GetProgramStageiv              :: #force_inline proc "c" (program: u32, shadertype: u32, pname: u32, values: [^]i32, loc := #caller_location)                          {        impl_GetProgramStageiv(program, shadertype, pname, values);                             debug_helper(loc, 0, program, shadertype, pname, values);                            }
+	PatchParameteri                :: #force_inline proc "c" (pname: u32, value: i32, loc := #caller_location)                                                             {        impl_PatchParameteri(pname, value);                                                      debug_helper(loc, 0, pname, value);                                                   }
+	PatchParameterfv               :: #force_inline proc "c" (pname: u32, values: [^]f32, loc := #caller_location)                                                         {        impl_PatchParameterfv(pname, values);                                                    debug_helper(loc, 0, pname, values);                                                  }
+	BindTransformFeedback          :: #force_inline proc "c" (target: u32, id: u32, loc := #caller_location)                                                               {        impl_BindTransformFeedback(target, id);                                                  debug_helper(loc, 0, target, id);                                                     }
+	DeleteTransformFeedbacks       :: #force_inline proc "c" (n: i32, ids: [^]u32, loc := #caller_location)                                                                {        impl_DeleteTransformFeedbacks(n, ids);                                                   debug_helper(loc, 0, n, ids);                                                         }
+	GenTransformFeedbacks          :: #force_inline proc "c" (n: i32, ids: [^]u32, loc := #caller_location)                                                                {        impl_GenTransformFeedbacks(n, ids);                                                      debug_helper(loc, 0, n, ids);                                                         }
+	IsTransformFeedback            :: #force_inline proc "c" (id: u32, loc := #caller_location) -> bool                                                                    { ret := impl_IsTransformFeedback(id);                                                            debug_helper(loc, 1, ret, id);                                            return ret; }
+	PauseTransformFeedback         :: #force_inline proc "c" (loc := #caller_location)                                                                                     {        impl_PauseTransformFeedback();                                                           debug_helper(loc, 0);                                                                 }
+	ResumeTransformFeedback        :: #force_inline proc "c" (loc := #caller_location)                                                                                     {        impl_ResumeTransformFeedback();                                                          debug_helper(loc, 0);                                                                 }
+	DrawTransformFeedback          :: #force_inline proc "c" (mode: u32, id: u32, loc := #caller_location)                                                                 {        impl_DrawTransformFeedback(mode, id);                                                    debug_helper(loc, 0, mode, id);                                                       }
+	DrawTransformFeedbackStream    :: #force_inline proc "c" (mode: u32, id: u32, stream: u32, loc := #caller_location)                                                    {        impl_DrawTransformFeedbackStream(mode, id, stream);                                      debug_helper(loc, 0, mode, id, stream);                                               }
+	BeginQueryIndexed              :: #force_inline proc "c" (target: u32, index: u32, id: u32, loc := #caller_location)                                                   {        impl_BeginQueryIndexed(target, index, id);                                               debug_helper(loc, 0, target, index, id);                                              }
+	EndQueryIndexed                :: #force_inline proc "c" (target: u32, index: u32, loc := #caller_location)                                                            {        impl_EndQueryIndexed(target, index);                                                     debug_helper(loc, 0, target, index);                                                  }
+	GetQueryIndexediv              :: #force_inline proc "c" (target: u32, index: u32, pname: u32, params: [^]i32, loc := #caller_location)                                {        impl_GetQueryIndexediv(target, index, pname, params);                                    debug_helper(loc, 0, target, index, pname, params);                                   }
+
+	// VERSION_4_1
+	ReleaseShaderCompiler     :: #force_inline proc "c" (loc := #caller_location)                                                                               {        impl_ReleaseShaderCompiler();                                                 debug_helper(loc, 0);                                                             }
+	ShaderBinary              :: #force_inline proc "c" (count: i32, shaders: ^u32, binaryformat: u32, binary: rawptr, length: i32, loc := #caller_location)    {        impl_ShaderBinary(count, shaders, binaryformat, binary, length);              debug_helper(loc, 0, count, shaders, binaryformat, binary, length);               }
+	GetShaderPrecisionFormat  :: #force_inline proc "c" (shadertype: u32, precisiontype: u32, range: ^i32, precision: ^i32, loc := #caller_location)            {        impl_GetShaderPrecisionFormat(shadertype, precisiontype, range, precision); debug_helper(loc, 0, shadertype, precisiontype, range, precision);              }
+	DepthRangef               :: #force_inline proc "c" (n: f32, f: f32, loc := #caller_location)                                                               {        impl_DepthRangef(n, f);                                                       debug_helper(loc, 0, n, f);                                                       }
+	ClearDepthf               :: #force_inline proc "c" (d: f32, loc := #caller_location)                                                                       {        impl_ClearDepthf(d);                                                          debug_helper(loc, 0, d);                                                          }
+	GetProgramBinary          :: #force_inline proc "c" (program: u32, bufSize: i32, length: ^i32, binaryFormat: ^u32, binary: rawptr, loc := #caller_location) {        impl_GetProgramBinary(program, bufSize, length, binaryFormat, binary);        debug_helper(loc, 0, program, bufSize, length, binaryFormat, binary);             }
+	ProgramBinary             :: #force_inline proc "c" (program: u32, binaryFormat: u32, binary: rawptr, length: i32, loc := #caller_location)                 {        impl_ProgramBinary(program, binaryFormat, binary, length);                    debug_helper(loc, 0, program, binaryFormat, binary, length);                      }
+	ProgramParameteri         :: #force_inline proc "c" (program: u32, pname: u32, value: i32, loc := #caller_location)                                         {        impl_ProgramParameteri(program, pname, value);                                debug_helper(loc, 0, program, pname, value);                                      }
+	UseProgramStages          :: #force_inline proc "c" (pipeline: u32, stages: u32, program: u32, loc := #caller_location)                                     {        impl_UseProgramStages(pipeline, stages, program);                             debug_helper(loc, 0, pipeline, stages, program);                                  }
+	ActiveShaderProgram       :: #force_inline proc "c" (pipeline: u32, program: u32, loc := #caller_location)                                                  {        impl_ActiveShaderProgram(pipeline, program);                                  debug_helper(loc, 0, pipeline, program);                                          }
+	CreateShaderProgramv      :: #force_inline proc "c" (type: u32, count: i32, strings: [^]cstring, loc := #caller_location) -> u32                            { ret := impl_CreateShaderProgramv(type, count, strings);                             debug_helper(loc, 1, ret, type, count, strings);                    return ret;; }
+	BindProgramPipeline       :: #force_inline proc "c" (pipeline: u32, loc := #caller_location)                                                                {        impl_BindProgramPipeline(pipeline);                                           debug_helper(loc, 0, pipeline);                                                   }
+	DeleteProgramPipelines    :: #force_inline proc "c" (n: i32, pipelines: [^]u32, loc := #caller_location)                                                    {        impl_DeleteProgramPipelines(n, pipelines);                                    debug_helper(loc, 0, n, pipelines);                                               }
+	GenProgramPipelines       :: #force_inline proc "c" (n: i32, pipelines: [^]u32, loc := #caller_location)                                                    {        impl_GenProgramPipelines(n, pipelines);                                       debug_helper(loc, 0, n, pipelines);                                               }
+	IsProgramPipeline         :: #force_inline proc "c" (pipeline: u32, loc := #caller_location) -> bool                                                        { ret := impl_IsProgramPipeline(pipeline);                                             debug_helper(loc, 1, ret, pipeline);                                 return ret;; }
+	GetProgramPipelineiv      :: #force_inline proc "c" (pipeline: u32, pname: u32, params: [^]i32, loc := #caller_location)                                    {        impl_GetProgramPipelineiv(pipeline, pname, params);                           debug_helper(loc, 0, pipeline, pname, params);                                    }
+	ProgramUniform1i          :: #force_inline proc "c" (program: u32, location: i32, v0: i32, loc := #caller_location)                                         {        impl_ProgramUniform1i(program, location, v0);                                 debug_helper(loc, 0, program, location, v0);                                      }
+	ProgramUniform1iv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]i32, loc := #caller_location)                       {        impl_ProgramUniform1iv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform1f          :: #force_inline proc "c" (program: u32, location: i32, v0: f32, loc := #caller_location)                                         {        impl_ProgramUniform1f(program, location, v0);                                 debug_helper(loc, 0, program, location, v0);                                      }
+	ProgramUniform1fv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f32, loc := #caller_location)                       {        impl_ProgramUniform1fv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform1d          :: #force_inline proc "c" (program: u32, location: i32, v0: f64, loc := #caller_location)                                         {        impl_ProgramUniform1d(program, location, v0);                                 debug_helper(loc, 0, program, location, v0);                                      }
+	ProgramUniform1dv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f64, loc := #caller_location)                       {        impl_ProgramUniform1dv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform1ui         :: #force_inline proc "c" (program: u32, location: i32, v0: u32, loc := #caller_location)                                         {        impl_ProgramUniform1ui(program, location, v0);                                debug_helper(loc, 0, program, location, v0);                                      }
+	ProgramUniform1uiv        :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]u32, loc := #caller_location)                       {        impl_ProgramUniform1uiv(program, location, count, value);                     debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform2i          :: #force_inline proc "c" (program: u32, location: i32, v0: i32, v1: i32, loc := #caller_location)                                {        impl_ProgramUniform2i(program, location, v0, v1);                             debug_helper(loc, 0, program, location, v0, v1);                                  }
+	ProgramUniform2iv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]i32, loc := #caller_location)                       {        impl_ProgramUniform2iv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform2f          :: #force_inline proc "c" (program: u32, location: i32, v0: f32, v1: f32, loc := #caller_location)                                {        impl_ProgramUniform2f(program, location, v0, v1);                             debug_helper(loc, 0, program, location, v0, v1);                                  }
+	ProgramUniform2fv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f32, loc := #caller_location)                       {        impl_ProgramUniform2fv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform2d          :: #force_inline proc "c" (program: u32, location: i32, v0: f64, v1: f64, loc := #caller_location)                                {        impl_ProgramUniform2d(program, location, v0, v1);                             debug_helper(loc, 0, program, location, v0, v1);                                  }
+	ProgramUniform2dv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f64, loc := #caller_location)                       {        impl_ProgramUniform2dv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform2ui         :: #force_inline proc "c" (program: u32, location: i32, v0: u32, v1: u32, loc := #caller_location)                                {        impl_ProgramUniform2ui(program, location, v0, v1);                            debug_helper(loc, 0, program, location, v0, v1);                                  }
+	ProgramUniform2uiv        :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]u32, loc := #caller_location)                       {        impl_ProgramUniform2uiv(program, location, count, value);                     debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform3i          :: #force_inline proc "c" (program: u32, location: i32, v0: i32, v1: i32, v2: i32, loc := #caller_location)                       {        impl_ProgramUniform3i(program, location, v0, v1, v2);                         debug_helper(loc, 0, program, location, v0, v1, v2);                              }
+	ProgramUniform3iv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]i32, loc := #caller_location)                       {        impl_ProgramUniform3iv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform3f          :: #force_inline proc "c" (program: u32, location: i32, v0: f32, v1: f32, v2: f32, loc := #caller_location)                       {        impl_ProgramUniform3f(program, location, v0, v1, v2);                         debug_helper(loc, 0, program, location, v0, v1, v2);                              }
+	ProgramUniform3fv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f32, loc := #caller_location)                       {        impl_ProgramUniform3fv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform3d          :: #force_inline proc "c" (program: u32, location: i32, v0: f64, v1: f64, v2: f64, loc := #caller_location)                       {        impl_ProgramUniform3d(program, location, v0, v1, v2);                         debug_helper(loc, 0, program, location, v0, v1, v2);                              }
+	ProgramUniform3dv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f64, loc := #caller_location)                       {        impl_ProgramUniform3dv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform3ui         :: #force_inline proc "c" (program: u32, location: i32, v0: u32, v1: u32, v2: u32, loc := #caller_location)                       {        impl_ProgramUniform3ui(program, location, v0, v1, v2);                        debug_helper(loc, 0, program, location, v0, v1, v2);                              }
+	ProgramUniform3uiv        :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]u32, loc := #caller_location)                       {        impl_ProgramUniform3uiv(program, location, count, value);                     debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform4i          :: #force_inline proc "c" (program: u32, location: i32, v0: i32, v1: i32, v2: i32, v3: i32, loc := #caller_location)              {        impl_ProgramUniform4i(program, location, v0, v1, v2, v3);                     debug_helper(loc, 0, program, location, v0, v1, v2, v3);                          }
+	ProgramUniform4iv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]i32, loc := #caller_location)                       {        impl_ProgramUniform4iv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform4f          :: #force_inline proc "c" (program: u32, location: i32, v0: f32, v1: f32, v2: f32, v3: f32, loc := #caller_location)              {        impl_ProgramUniform4f(program, location, v0, v1, v2, v3);                     debug_helper(loc, 0, program, location, v0, v1, v2, v3);                          }
+	ProgramUniform4fv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f32, loc := #caller_location)                       {        impl_ProgramUniform4fv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform4d          :: #force_inline proc "c" (program: u32, location: i32, v0: f64, v1: f64, v2: f64, v3: f64, loc := #caller_location)              {        impl_ProgramUniform4d(program, location, v0, v1, v2, v3);                     debug_helper(loc, 0, program, location, v0, v1, v2, v3);                          }
+	ProgramUniform4dv         :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]f64, loc := #caller_location)                       {        impl_ProgramUniform4dv(program, location, count, value);                      debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniform4ui         :: #force_inline proc "c" (program: u32, location: i32, v0: u32, v1: u32, v2: u32, v3: u32, loc := #caller_location)              {        impl_ProgramUniform4ui(program, location, v0, v1, v2, v3);                    debug_helper(loc, 0, program, location, v0, v1, v2, v3);                          }
+	ProgramUniform4uiv        :: #force_inline proc "c" (program: u32, location: i32, count: i32, value: [^]u32, loc := #caller_location)                       {        impl_ProgramUniform4uiv(program, location, count, value);                     debug_helper(loc, 0, program, location, count, value);                            }
+	ProgramUniformMatrix2fv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)      {        impl_ProgramUniformMatrix2fv(program, location, count, transpose, value);     debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix3fv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)      {        impl_ProgramUniformMatrix3fv(program, location, count, transpose, value);     debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix4fv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)      {        impl_ProgramUniformMatrix4fv(program, location, count, transpose, value);     debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix2dv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)      {        impl_ProgramUniformMatrix2dv(program, location, count, transpose, value);     debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix3dv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)      {        impl_ProgramUniformMatrix3dv(program, location, count, transpose, value);     debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix4dv   :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)      {        impl_ProgramUniformMatrix4dv(program, location, count, transpose, value);     debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix2x3fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)      {        impl_ProgramUniformMatrix2x3fv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix3x2fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)      {        impl_ProgramUniformMatrix3x2fv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix2x4fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)      {        impl_ProgramUniformMatrix2x4fv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix4x2fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)      {        impl_ProgramUniformMatrix4x2fv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix3x4fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)      {        impl_ProgramUniformMatrix3x4fv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix4x3fv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f32, loc := #caller_location)      {        impl_ProgramUniformMatrix4x3fv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix2x3dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)      {        impl_ProgramUniformMatrix2x3dv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix3x2dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)      {        impl_ProgramUniformMatrix3x2dv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix2x4dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)      {        impl_ProgramUniformMatrix2x4dv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix4x2dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)      {        impl_ProgramUniformMatrix4x2dv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix3x4dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)      {        impl_ProgramUniformMatrix3x4dv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ProgramUniformMatrix4x3dv :: #force_inline proc "c" (program: u32, location: i32, count: i32, transpose: bool, value: [^]f64, loc := #caller_location)      {        impl_ProgramUniformMatrix4x3dv(program, location, count, transpose, value);   debug_helper(loc, 0, program, location, count, transpose, value);                 }
+	ValidateProgramPipeline   :: #force_inline proc "c" (pipeline: u32, loc := #caller_location)                                                                {        impl_ValidateProgramPipeline(pipeline);                                       debug_helper(loc, 0, pipeline);                                                   }
+	GetProgramPipelineInfoLog :: #force_inline proc "c" (pipeline: u32, bufSize: i32, length: ^i32, infoLog: [^]u8, loc := #caller_location)                    {        impl_GetProgramPipelineInfoLog(pipeline, bufSize, length, infoLog);           debug_helper(loc, 0, pipeline, bufSize, length, infoLog);                         }
+	VertexAttribL1d           :: #force_inline proc "c" (index: u32, x: f64, loc := #caller_location)                                                           {        impl_VertexAttribL1d(index, x);                                               debug_helper(loc, 0, index, x);                                                   }
+	VertexAttribL2d           :: #force_inline proc "c" (index: u32, x: f64, y: f64, loc := #caller_location)                                                   {        impl_VertexAttribL2d(index, x, y);                                            debug_helper(loc, 0, index, x, y);                                                }
+	VertexAttribL3d           :: #force_inline proc "c" (index: u32, x: f64, y: f64, z: f64, loc := #caller_location)                                           {        impl_VertexAttribL3d(index, x, y, z);                                         debug_helper(loc, 0, index, x, y, z);                                             }
+	VertexAttribL4d           :: #force_inline proc "c" (index: u32, x: f64, y: f64, z: f64, w: f64, loc := #caller_location)                                   {        impl_VertexAttribL4d(index, x, y, z, w);                                      debug_helper(loc, 0, index, x, y, z, w);                                          }
+	VertexAttribL1dv          :: #force_inline proc "c" (index: u32, v: ^f64, loc := #caller_location)                                                          {        impl_VertexAttribL1dv(index, v);                                              debug_helper(loc, 0, index, v);                                                   }
+	VertexAttribL2dv          :: #force_inline proc "c" (index: u32, v: ^f64, loc := #caller_location)                                                          {        impl_VertexAttribL2dv(index, v);                                              debug_helper(loc, 0, index, v);                                                   }
+	VertexAttribL3dv          :: #force_inline proc "c" (index: u32, v: ^f64, loc := #caller_location)                                                          {        impl_VertexAttribL3dv(index, v);                                              debug_helper(loc, 0, index, v);                                                   }
+	VertexAttribL4dv          :: #force_inline proc "c" (index: u32, v: ^f64, loc := #caller_location)                                                          {        impl_VertexAttribL4dv(index, v);                                              debug_helper(loc, 0, index, v);                                                   }
+	VertexAttribLPointer      :: #force_inline proc "c" (index: u32, size: i32, type: u32, stride: i32, pointer: rawptr, loc := #caller_location)               {        impl_VertexAttribLPointer(index, size, type, stride, pointer);               debug_helper(loc, 0, index, size, type, stride, pointer);                        }
+	GetVertexAttribLdv        :: #force_inline proc "c" (index: u32, pname: u32, params: [^]f64, loc := #caller_location)                                       {        impl_GetVertexAttribLdv(index, pname, params);                                debug_helper(loc, 0, index, pname, params);                                       }
+	ViewportArrayv            :: #force_inline proc "c" (first: u32, count: i32, v: [^]f32, loc := #caller_location)                                            {        impl_ViewportArrayv(first, count, v);                                         debug_helper(loc, 0, first, count, v);                                            }
+	ViewportIndexedf          :: #force_inline proc "c" (index: u32, x: f32, y: f32, w: f32, h: f32, loc := #caller_location)                                   {        impl_ViewportIndexedf(index, x, y, w, h);                                     debug_helper(loc, 0, index, x, y, w, h);                                          }
+	ViewportIndexedfv         :: #force_inline proc "c" (index: u32, v: ^f32, loc := #caller_location)                                                          {        impl_ViewportIndexedfv(index, v);                                             debug_helper(loc, 0, index, v);                                                   }
+	ScissorArrayv             :: #force_inline proc "c" (first: u32, count: i32, v: [^]i32, loc := #caller_location)                                            {        impl_ScissorArrayv(first, count, v);                                          debug_helper(loc, 0, first, count, v);                                            }
+	ScissorIndexed            :: #force_inline proc "c" (index: u32, left: i32, bottom: i32, width: i32, height: i32, loc := #caller_location)                  {        impl_ScissorIndexed(index, left, bottom, width, height);                      debug_helper(loc, 0, index, left, bottom, width, height);                         }
+	ScissorIndexedv           :: #force_inline proc "c" (index: u32, v: ^i32, loc := #caller_location)                                                          {        impl_ScissorIndexedv(index, v);                                               debug_helper(loc, 0, index, v);                                                   }
+	DepthRangeArrayv          :: #force_inline proc "c" (first: u32, count: i32, v: [^]f64, loc := #caller_location)                                            {        impl_DepthRangeArrayv(first, count, v);                                       debug_helper(loc, 0, first, count, v);                                            }
+	DepthRangeIndexed         :: #force_inline proc "c" (index: u32, n: f64, f: f64, loc := #caller_location)                                                   {        impl_DepthRangeIndexed(index, n, f);                                          debug_helper(loc, 0, index, n, f);                                                }
+	GetFloati_v               :: #force_inline proc "c" (target: u32, index: u32, data: ^f32, loc := #caller_location)                                          {        impl_GetFloati_v(target, index, data);                                        debug_helper(loc, 0, target, index, data);                                        }
+	GetDoublei_v              :: #force_inline proc "c" (target: u32, index: u32, data: ^f64, loc := #caller_location)                                          {        impl_GetDoublei_v(target, index, data);                                       debug_helper(loc, 0, target, index, data);                                        }
+
+	// VERSION_4_2
+	DrawArraysInstancedBaseInstance             :: #force_inline proc "c" (mode: u32, first: i32, count: i32, instancecount: i32, baseinstance: u32, loc := #caller_location)                                  { impl_DrawArraysInstancedBaseInstance(mode, first, count, instancecount, baseinstance);                                  debug_helper(loc, 0, mode, first, count, instancecount, baseinstance);                      }
+	DrawElementsInstancedBaseInstance           :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32, baseinstance: u32, loc := #caller_location)                  { impl_DrawElementsInstancedBaseInstance(mode, count, type, indices, instancecount, baseinstance);                       debug_helper(loc, 0, mode, count, type, indices, instancecount, baseinstance);             }
+	DrawElementsInstancedBaseVertexBaseInstance :: #force_inline proc "c" (mode: u32, count: i32, type: u32, indices: rawptr, instancecount: i32, basevertex: i32, baseinstance: u32, loc := #caller_location) { impl_DrawElementsInstancedBaseVertexBaseInstance(mode, count, type, indices, instancecount, basevertex, baseinstance); debug_helper(loc, 0, mode, count, type, indices, instancecount, basevertex, baseinstance); }
+	GetInternalformativ                         :: #force_inline proc "c" (target: u32, internalformat: u32, pname: u32, bufSize: i32, params: [^]i32, loc := #caller_location)                                { impl_GetInternalformativ(target, internalformat, pname, bufSize, params);                                               debug_helper(loc, 0, target, internalformat, pname, bufSize, params);                       }
+	GetActiveAtomicCounterBufferiv              :: #force_inline proc "c" (program: u32, bufferIndex: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                { impl_GetActiveAtomicCounterBufferiv(program, bufferIndex, pname, params);                                               debug_helper(loc, 0, program, bufferIndex, pname, params);                                  }
+	BindImageTexture                            :: #force_inline proc "c" (unit: u32, texture: u32, level: i32, layered: u8, layer: i32, access: u32, format: u32, loc := #caller_location)                    { impl_BindImageTexture(unit, texture, level, layered, layer, access, format);                                            debug_helper(loc, 0, unit, texture, level, layered, layer, access, format);                 }
+	MemoryBarrier                               :: #force_inline proc "c" (barriers: u32, loc := #caller_location)                                                                                             { impl_MemoryBarrier(barriers);                                                                                           debug_helper(loc, 0, barriers);                                                             }
+	TexStorage1D                                :: #force_inline proc "c" (target: u32, levels: i32, internalformat: u32, width: i32, loc := #caller_location)                                                 { impl_TexStorage1D(target, levels, internalformat, width);                                                               debug_helper(loc, 0, target, levels, internalformat, width);                                }
+	TexStorage2D                                :: #force_inline proc "c" (target: u32, levels: i32, internalformat: u32, width: i32, height: i32, loc := #caller_location)                                    { impl_TexStorage2D(target, levels, internalformat, width, height);                                                       debug_helper(loc, 0, target, levels, internalformat, width, height);                        }
+	TexStorage3D                                :: #force_inline proc "c" (target: u32, levels: i32, internalformat: u32, width: i32, height: i32, depth: i32, loc := #caller_location)                        { impl_TexStorage3D(target, levels, internalformat, width, height, depth);                                                debug_helper(loc, 0, target, levels, internalformat, width, height, depth);                 }
+	DrawTransformFeedbackInstanced              :: #force_inline proc "c" (mode: u32, id: u32, instancecount: i32, loc := #caller_location)                                                                    { impl_DrawTransformFeedbackInstanced(mode, id, instancecount);                                                           debug_helper(loc, 0, mode, id, instancecount);                                              }
+	DrawTransformFeedbackStreamInstanced        :: #force_inline proc "c" (mode: u32, id: u32, stream: u32, instancecount: i32, loc := #caller_location)                                                       { impl_DrawTransformFeedbackStreamInstanced(mode, id, stream, instancecount);                                             debug_helper(loc, 0, mode, id, stream, instancecount);                                      }
+
+	// VERSION_4_3
+	ClearBufferData                 :: #force_inline proc "c" (target: u32, internalformat: u32, format: u32, type: u32, data: rawptr, loc := #caller_location)                                                                                                                                   {        impl_ClearBufferData(target, internalformat, format, type, data);                                                                                    debug_helper(loc, 0, target, internalformat, format, type, data);                                                                                               }
+	ClearBufferSubData              :: #force_inline proc "c" (target: u32, internalformat: u32, offset: int, size: int, format: u32, type: u32, data: rawptr, loc := #caller_location)                                                                                                           {        impl_ClearBufferSubData(target, internalformat, offset, size, format, type, data);                                                                   debug_helper(loc, 0, target, internalformat, offset, size, format, type, data);                                                                                 }
+	DispatchCompute                 :: #force_inline proc "c" (num_groups_x: u32, num_groups_y: u32, num_groups_z: u32, loc := #caller_location)                                                                                                                                                  {        impl_DispatchCompute(num_groups_x, num_groups_y, num_groups_z);                                                                                       debug_helper(loc, 0, num_groups_x, num_groups_y, num_groups_z);                                                                                                  }
+	DispatchComputeIndirect         :: #force_inline proc "c" (indirect: int, loc := #caller_location)                                                                                                                                                                                            {        impl_DispatchComputeIndirect(indirect);                                                                                                               debug_helper(loc, 0, indirect);                                                                                                                                  }
+	CopyImageSubData                :: #force_inline proc "c" (srcName: u32, srcTarget: u32, srcLevel: i32, srcX: i32, srcY: i32, srcZ: i32, dstName: u32, dstTarget: u32, dstLevel: i32, dstX: i32, dstY: i32, dstZ: i32, srcWidth: i32, srcHeight: i32, srcDepth: i32, loc := #caller_location) {        impl_CopyImageSubData(srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth); debug_helper(loc, 0, srcName, srcTarget, srcLevel, srcX, srcY, srcZ, dstName, dstTarget, dstLevel, dstX, dstY, dstZ, srcWidth, srcHeight, srcDepth);             }
+	FramebufferParameteri           :: #force_inline proc "c" (target: u32, pname: u32, param: i32, loc := #caller_location)                                                                                                                                                                      {        impl_FramebufferParameteri(target, pname, param);                                                                                                     debug_helper(loc, 0, target, pname, param);                                                                                                                      }
+	GetFramebufferParameteriv       :: #force_inline proc "c" (target: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                                                                                                  {        impl_GetFramebufferParameteriv(target, pname, params);                                                                                                debug_helper(loc, 0, target, pname, params);                                                                                                                     }
+	GetInternalformati64v           :: #force_inline proc "c" (target: u32, internalformat: u32, pname: u32, bufSize: i32, params: [^]i64, loc := #caller_location)                                                                                                                               {        impl_GetInternalformati64v(target, internalformat, pname, bufSize, params);                                                                           debug_helper(loc, 0, target, internalformat, pname, bufSize, params);                                                                                            }
+	InvalidateTexSubImage           :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, loc := #caller_location)                                                                                                  {        impl_InvalidateTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth);                                                          debug_helper(loc, 0, texture, level, xoffset, yoffset, zoffset, width, height, depth);                                                                           }
+	InvalidateTexImage              :: #force_inline proc "c" (texture: u32, level: i32, loc := #caller_location)                                                                                                                                                                                 {        impl_InvalidateTexImage(texture, level);                                                                                                              debug_helper(loc, 0, texture, level);                                                                                                                            }
+	InvalidateBufferSubData         :: #force_inline proc "c" (buffer: u32, offset: int, length: int, loc := #caller_location)                                                                                                                                                                    {        impl_InvalidateBufferSubData(buffer, offset, length);                                                                                                 debug_helper(loc, 0, buffer, offset, length);                                                                                                                    }
+	InvalidateBufferData            :: #force_inline proc "c" (buffer: u32, loc := #caller_location)                                                                                                                                                                                              {        impl_InvalidateBufferData(buffer);                                                                                                                    debug_helper(loc, 0, buffer);                                                                                                                                    }
+	InvalidateFramebuffer           :: #force_inline proc "c" (target: u32, numAttachments: i32, attachments: ^u32, loc := #caller_location)                                                                                                                                                      {        impl_InvalidateFramebuffer(target, numAttachments, attachments);                                                                                      debug_helper(loc, 0, target, numAttachments, attachments);                                                                                                       }
+	InvalidateSubFramebuffer        :: #force_inline proc "c" (target: u32, numAttachments: i32, attachments: ^u32, x: i32, y: i32, width: i32, height: i32, loc := #caller_location)                                                                                                             {        impl_InvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height);                                                              debug_helper(loc, 0, target, numAttachments, attachments, x, y, width, height);                                                                                  }
+	MultiDrawArraysIndirect         :: #force_inline proc "c" (mode: u32, indirect: rawptr, drawcount: i32, stride: i32, loc := #caller_location)                                                                                                                                                 {        impl_MultiDrawArraysIndirect(mode, indirect, drawcount, stride);                                                                                      debug_helper(loc, 0, mode, indirect, drawcount, stride);                                                                                                         }
+	MultiDrawElementsIndirect       :: #force_inline proc "c" (mode: u32, type: u32, indirect: rawptr, drawcount: i32, stride: i32, loc := #caller_location)                                                                                                                                      {        impl_MultiDrawElementsIndirect(mode, type, indirect, drawcount, stride);                                                                             debug_helper(loc, 0, mode, type, indirect, drawcount, stride);                                                                                                  }
+	GetProgramInterfaceiv           :: #force_inline proc "c" (program: u32, programInterface: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                                                                          {        impl_GetProgramInterfaceiv(program, programInterface, pname, params);                                                                                 debug_helper(loc, 0, program, programInterface, pname, params);                                                                                                  }
+	GetProgramResourceIndex         :: #force_inline proc "c" (program: u32, programInterface: u32, name: cstring, loc := #caller_location) -> u32                                                                                                                                                { ret := impl_GetProgramResourceIndex(program, programInterface, name);                                                                                        debug_helper(loc, 1, ret, program, programInterface, name);                                                                                          return ret; }
+	GetProgramResourceName          :: #force_inline proc "c" (program: u32, programInterface: u32, index: u32, bufSize: i32, length: ^i32, name: [^]u8, loc := #caller_location)                                                                                                                 {        impl_GetProgramResourceName(program, programInterface, index, bufSize, length, name);                                                                 debug_helper(loc, 0, program, programInterface, index, bufSize, length, name);                                                                                   }
+	GetProgramResourceiv            :: #force_inline proc "c" (program: u32, programInterface: u32, index: u32, propCount: i32, props: [^]u32, bufSize: i32, length: ^i32, params: [^]i32, loc := #caller_location)                                                                               {        impl_GetProgramResourceiv(program, programInterface, index, propCount, props, bufSize, length, params);                                               debug_helper(loc, 0, program, programInterface, index, propCount, props, bufSize, length, params);                                                               }
+	GetProgramResourceLocation      :: #force_inline proc "c" (program: u32, programInterface: u32, name: cstring, loc := #caller_location) -> i32                                                                                                                                                { ret := impl_GetProgramResourceLocation(program, programInterface, name);                                                                                     debug_helper(loc, 1, ret, program, programInterface, name);                                                                                          return ret; }
+	GetProgramResourceLocationIndex :: #force_inline proc "c" (program: u32, programInterface: u32, name: cstring, loc := #caller_location) -> i32                                                                                                                                                { ret := impl_GetProgramResourceLocationIndex(program, programInterface, name);                                                                                debug_helper(loc, 1, ret, program, programInterface, name);                                                                                          return ret; }
+	ShaderStorageBlockBinding       :: #force_inline proc "c" (program: u32, storageBlockIndex: u32, storageBlockBinding: u32, loc := #caller_location)                                                                                                                                           {        impl_ShaderStorageBlockBinding(program, storageBlockIndex, storageBlockBinding);                                                                      debug_helper(loc, 0, program, storageBlockIndex, storageBlockBinding);                                                                                           }
+	TexBufferRange                  :: #force_inline proc "c" (target: u32, internalformat: u32, buffer: u32, offset: int, size: int, loc := #caller_location)                                                                                                                                    {        impl_TexBufferRange(target, internalformat, buffer, offset, size);                                                                                    debug_helper(loc, 0, target, internalformat, buffer, offset, size);                                                                                              }
+	TexStorage2DMultisample         :: #force_inline proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: u8, loc := #caller_location)                                                                                                        {        impl_TexStorage2DMultisample(target, samples, internalformat, width, height, fixedsamplelocations);                                                   debug_helper(loc, 0, target, samples, internalformat, width, height, fixedsamplelocations);                                                                      }
+	TexStorage3DMultisample         :: #force_inline proc "c" (target: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: u8, loc := #caller_location)                                                                                            {        impl_TexStorage3DMultisample(target, samples, internalformat, width, height, depth, fixedsamplelocations);                                            debug_helper(loc, 0, target, samples, internalformat, width, height, depth, fixedsamplelocations);                                                               }
+	TextureView                     :: #force_inline proc "c" (texture: u32, target: u32, origtexture: u32, internalformat: u32, minlevel: u32, numlevels: u32, minlayer: u32, numlayers: u32, loc := #caller_location)                                                                           {        impl_TextureView(texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);                                             debug_helper(loc, 0, texture, target, origtexture, internalformat, minlevel, numlevels, minlayer, numlayers);                                                    }
+	BindVertexBuffer                :: #force_inline proc "c" (bindingindex: u32, buffer: u32, offset: int, stride: i32, loc := #caller_location)                                                                                                                                                 {        impl_BindVertexBuffer(bindingindex, buffer, offset, stride);                                                                                          debug_helper(loc, 0, bindingindex, buffer, offset, stride);                                                                                                      }
+	VertexAttribFormat              :: #force_inline proc "c" (attribindex: u32, size: i32, type: u32, normalized: bool, relativeoffset: u32, loc := #caller_location)                                                                                                                            {        impl_VertexAttribFormat(attribindex, size, type, normalized, relativeoffset);                                                                        debug_helper(loc, 0, attribindex, size, type, normalized, relativeoffset);                                                                                      }
+	VertexAttribIFormat             :: #force_inline proc "c" (attribindex: u32, size: i32, type: u32, relativeoffset: u32, loc := #caller_location)                                                                                                                                              {        impl_VertexAttribIFormat(attribindex, size, type, relativeoffset);                                                                                   debug_helper(loc, 0, attribindex, size, type, relativeoffset);                                                                                                  }
+	VertexAttribLFormat             :: #force_inline proc "c" (attribindex: u32, size: i32, type: u32, relativeoffset: u32, loc := #caller_location)                                                                                                                                              {        impl_VertexAttribLFormat(attribindex, size, type, relativeoffset);                                                                                   debug_helper(loc, 0, attribindex, size, type, relativeoffset);                                                                                                  }
+	VertexAttribBinding             :: #force_inline proc "c" (attribindex: u32, bindingindex: u32, loc := #caller_location)                                                                                                                                                                      {        impl_VertexAttribBinding(attribindex, bindingindex);                                                                                                  debug_helper(loc, 0, attribindex, bindingindex);                                                                                                                 }
+	VertexBindingDivisor            :: #force_inline proc "c" (bindingindex: u32, divisor: u32, loc := #caller_location)                                                                                                                                                                          {        impl_VertexBindingDivisor(bindingindex, divisor);                                                                                                     debug_helper(loc, 0, bindingindex, divisor);                                                                                                                     }
+	DebugMessageControl             :: #force_inline proc "c" (source: u32, type: u32, severity: u32, count: i32, ids: [^]u32, enabled: u8, loc := #caller_location)                                                                                                                              {        impl_DebugMessageControl(source, type, severity, count, ids, enabled);                                                                               debug_helper(loc, 0, source, type, severity, count, ids, enabled);                                                                                              }
+	DebugMessageInsert              :: #force_inline proc "c" (source: u32, type: u32, id: u32, severity: u32, length: i32, buf: ^u8, loc := #caller_location)                                                                                                                                    {        impl_DebugMessageInsert(source, type, id, severity, length, buf);                                                                                    debug_helper(loc, 0, source, type, id, severity, length, buf);                                                                                                  }
+	DebugMessageCallback            :: #force_inline proc "c" (callback: debug_proc_t, userParam: rawptr, loc := #caller_location)                                                                                                                                                                {        impl_DebugMessageCallback(callback, userParam);                                                                                                       debug_helper(loc, 0, callback, userParam);                                                                                                                       }
+	GetDebugMessageLog              :: #force_inline proc "c" (count: u32, bufSize: i32, sources: [^]u32, types: [^]u32, ids: [^]u32, severities: [^]u32, lengths: [^]i32, messageLog: [^]u8, loc := #caller_location) -> u32                                                                     { ret := impl_GetDebugMessageLog(count, bufSize, sources, types, ids, severities, lengths, messageLog);                                                        debug_helper(loc, 1, ret, count, bufSize, sources, types, ids, severities, lengths, messageLog);                                                     return ret; }
+	PushDebugGroup                  :: #force_inline proc "c" (source: u32, id: u32, length: i32, message: cstring, loc := #caller_location)                                                                                                                                                      {        impl_PushDebugGroup(source, id, length, message);                                                                                                     debug_helper(loc, 0, source, id, length, message);                                                                                                               }
+	PopDebugGroup                   :: #force_inline proc "c" (loc := #caller_location)                                                                                                                                                                                                           {        impl_PopDebugGroup();                                                                                                                                 debug_helper(loc, 0);                                                                                                                                            }
+	ObjectLabel                     :: #force_inline proc "c" (identifier: u32, name: u32, length: i32, label: [^]u8, loc := #caller_location)                                                                                                                                                    {        impl_ObjectLabel(identifier, name, length, label);                                                                                                    debug_helper(loc, 0, identifier, name, length, label);                                                                                                           }
+	GetObjectLabel                  :: #force_inline proc "c" (identifier: u32, name: u32, bufSize: i32, length: ^i32, label: [^]u8, loc := #caller_location)                                                                                                                                     {        impl_GetObjectLabel(identifier, name, bufSize, length, label);                                                                                        debug_helper(loc, 0, identifier, name, bufSize, length, label);                                                                                                  }
+	ObjectPtrLabel                  :: #force_inline proc "c" (ptr: rawptr, length: i32, label: [^]u8, loc := #caller_location)                                                                                                                                                                   {        impl_ObjectPtrLabel(ptr, length, label);                                                                                                              debug_helper(loc, 0, ptr, length, label);                                                                                                                        }
+	GetObjectPtrLabel               :: #force_inline proc "c" (ptr: rawptr, bufSize: i32, length: ^i32, label: [^]u8, loc := #caller_location)                                                                                                                                                    {        impl_GetObjectPtrLabel(ptr, bufSize, length, label);                                                                                                  debug_helper(loc, 0, ptr, bufSize, length, label);                                                                                                               }
+
+	// VERSION_4_4
+	BufferStorage     :: #force_inline proc "c" (target: u32, size: int, data: rawptr, flags: u32, loc := #caller_location)                                                                                              { impl_BufferStorage(target, size, data, flags);                                                               debug_helper(loc, 0, target, size, data, flags);                                                            }
+	ClearTexImage     :: #force_inline proc "c" (texture: u32, level: i32, format: u32, type: u32, data: rawptr, loc := #caller_location)                                                                                { impl_ClearTexImage(texture, level, format, type, data);                                                     debug_helper(loc, 0, texture, level, format, type, data);                                                  }
+	ClearTexSubImage  :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, data: rawptr, loc := #caller_location) { impl_ClearTexSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); debug_helper(loc, 0, texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, data); }
+	BindBuffersBase   :: #force_inline proc "c" (target: u32, first: u32, count: i32, buffers: [^]u32, loc := #caller_location)                                                                                          { impl_BindBuffersBase(target, first, count, buffers);                                                         debug_helper(loc, 0, target, first, count, buffers);                                                        }
+	BindBuffersRange  :: #force_inline proc "c" (target: u32, first: u32, count: i32, buffers: [^]u32, offsets: [^]uintptr, sizes: [^]int, loc := #caller_location)                                                      { impl_BindBuffersRange(target, first, count, buffers, offsets, sizes);                                        debug_helper(loc, 0, target, first, count, buffers, offsets, sizes);                                        }
+	BindTextures      :: #force_inline proc "c" (first: u32, count: i32, textures: [^]u32, loc := #caller_location)                                                                                                      { impl_BindTextures(first, count, textures);                                                                   debug_helper(loc, 0, first, count, textures);                                                               }
+	BindSamplers      :: #force_inline proc "c" (first: u32, count: i32, samplers: [^]u32, loc := #caller_location)                                                                                                      { impl_BindSamplers(first, count, samplers);                                                                   debug_helper(loc, 0, first, count, samplers);                                                               }
+	BindImageTextures :: #force_inline proc "c" (first: u32, count: i32, textures: [^]u32, loc := #caller_location)                                                                                                      { impl_BindImageTextures(first, count, textures);                                                              debug_helper(loc, 0, first, count, textures);                                                               }
+	BindVertexBuffers :: #force_inline proc "c" (first: u32, count: i32, buffers: [^]u32, offsets: [^]uintptr, strides: [^]i32, loc := #caller_location)                                                                 { impl_BindVertexBuffers(first, count, buffers, offsets, strides);                                             debug_helper(loc, 0, first, count, buffers, offsets, strides);                                              }
+
+	// VERSION_4_5
+	ClipControl                              :: #force_inline proc "c" (origin: u32, depth: u32, loc := #caller_location)                                                                                                                                            {        impl_ClipControl(origin, depth);                                                                                                   debug_helper(loc, 0, origin, depth);                                                                                                      }
+	CreateTransformFeedbacks                 :: #force_inline proc "c" (n: i32, ids: [^]u32, loc := #caller_location)                                                                                                                                                {        impl_CreateTransformFeedbacks(n, ids);                                                                                             debug_helper(loc, 0, n, ids);                                                                                                             }
+	TransformFeedbackBufferBase              :: #force_inline proc "c" (xfb: u32, index: u32, buffer: u32, loc := #caller_location)                                                                                                                                  {        impl_TransformFeedbackBufferBase(xfb, index, buffer);                                                                              debug_helper(loc, 0, xfb, index, buffer);                                                                                                 }
+	TransformFeedbackBufferRange             :: #force_inline proc "c" (xfb: u32, index: u32, buffer: u32, offset: int, size: int, loc := #caller_location)                                                                                                          {        impl_TransformFeedbackBufferRange(xfb, index, buffer, offset, size);                                                               debug_helper(loc, 0, xfb, index, buffer, offset, size);                                                                                   }
+	GetTransformFeedbackiv                   :: #force_inline proc "c" (xfb: u32, pname: u32, param: ^i32, loc := #caller_location)                                                                                                                                  {        impl_GetTransformFeedbackiv(xfb, pname, param);                                                                                    debug_helper(loc, 0, xfb, pname, param);                                                                                                  }
+	GetTransformFeedbacki_v                  :: #force_inline proc "c" (xfb: u32, pname: u32, index: u32, param: ^i32, loc := #caller_location)                                                                                                                      {        impl_GetTransformFeedbacki_v(xfb, pname, index, param);                                                                            debug_helper(loc, 0, xfb, pname, index, param);                                                                                           }
+	GetTransformFeedbacki64_v                :: #force_inline proc "c" (xfb: u32, pname: u32, index: u32, param: ^i64, loc := #caller_location)                                                                                                                      {        impl_GetTransformFeedbacki64_v(xfb, pname, index, param);                                                                          debug_helper(loc, 0, xfb, pname, index, param);                                                                                           }
+	CreateBuffers                            :: #force_inline proc "c" (n: i32, buffers: [^]u32, loc := #caller_location)                                                                                                                                            {        impl_CreateBuffers(n, buffers);                                                                                                    debug_helper(loc, 0, n, buffers);                                                                                                         }
+	NamedBufferStorage                       :: #force_inline proc "c" (buffer: u32, size: int, data: rawptr, flags: u32, loc := #caller_location)                                                                                                                   {        impl_NamedBufferStorage(buffer, size, data, flags);                                                                                debug_helper(loc, 0, buffer, size, data, flags);                                                                                          }
+	NamedBufferData                          :: #force_inline proc "c" (buffer: u32, size: int, data: rawptr, usage: u32, loc := #caller_location)                                                                                                                   {        impl_NamedBufferData(buffer, size, data, usage);                                                                                   debug_helper(loc, 0, buffer, size, data, usage);                                                                                          }
+	NamedBufferSubData                       :: #force_inline proc "c" (buffer: u32, offset: int, size: int, data: rawptr, loc := #caller_location)                                                                                                                  {        impl_NamedBufferSubData(buffer, offset, size, data);                                                                               debug_helper(loc, 0, buffer, offset, size, data);                                                                                         }
+	CopyNamedBufferSubData                   :: #force_inline proc "c" (readBuffer: u32, writeBuffer: u32, readOffset: int, writeOffset: int, size: int, loc := #caller_location)                                                                                    {        impl_CopyNamedBufferSubData(readBuffer, writeBuffer, readOffset, writeOffset, size);                                               debug_helper(loc, 0, readBuffer, writeBuffer, readOffset, writeOffset, size);                                                             }
+	ClearNamedBufferData                     :: #force_inline proc "c" (buffer: u32, internalformat: u32, format: u32, type: u32, data: rawptr, loc := #caller_location)                                                                                             {        impl_ClearNamedBufferData(buffer, internalformat, format, type, data);                                                            debug_helper(loc, 0, buffer, internalformat, format, type, data);                                                                        }
+	ClearNamedBufferSubData                  :: #force_inline proc "c" (buffer: u32, internalformat: u32, offset: int, size: int, format: u32, type: u32, data: rawptr, loc := #caller_location)                                                                     {        impl_ClearNamedBufferSubData(buffer, internalformat, offset, size, format, type, data);                                           debug_helper(loc, 0, buffer, internalformat, offset, size, format, type, data);                                                          }
+	MapNamedBuffer                           :: #force_inline proc "c" (buffer: u32, access: u32, loc := #caller_location) -> rawptr                                                                                                                                 { ret := impl_MapNamedBuffer(buffer, access);                                                                                               debug_helper(loc, 1, ret, buffer, access);                                                                                    return ret; }
+	MapNamedBufferRange                      :: #force_inline proc "c" (buffer: u32, offset: int, length: int, access: u32, loc := #caller_location) -> rawptr                                                                                                       { ret := impl_MapNamedBufferRange(buffer, offset, length, access);                                                                          debug_helper(loc, 1, ret, buffer, offset, length, access);                                                                    return ret; }
+	UnmapNamedBuffer                         :: #force_inline proc "c" (buffer: u32, loc := #caller_location) -> bool                                                                                                                                                { ret := impl_UnmapNamedBuffer(buffer);                                                                                                     debug_helper(loc, 1, ret, buffer);                                                                                            return ret; }
+	FlushMappedNamedBufferRange              :: #force_inline proc "c" (buffer: u32, offset: int, length: int, loc := #caller_location)                                                                                                                              {        impl_FlushMappedNamedBufferRange(buffer, offset, length);                                                                          debug_helper(loc, 0, buffer, offset, length);                                                                                             }
+	GetNamedBufferParameteriv                :: #force_inline proc "c" (buffer: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                                                            {        impl_GetNamedBufferParameteriv(buffer, pname, params);                                                                             debug_helper(loc, 0, buffer, pname, params);                                                                                              }
+	GetNamedBufferParameteri64v              :: #force_inline proc "c" (buffer: u32, pname: u32, params: [^]i64, loc := #caller_location)                                                                                                                            {        impl_GetNamedBufferParameteri64v(buffer, pname, params);                                                                           debug_helper(loc, 0, buffer, pname, params);                                                                                              }
+	GetNamedBufferPointerv                   :: #force_inline proc "c" (buffer: u32, pname: u32, params: [^]rawptr, loc := #caller_location)                                                                                                                         {        impl_GetNamedBufferPointerv(buffer, pname, params);                                                                                debug_helper(loc, 0, buffer, pname, params);                                                                                              }
+	GetNamedBufferSubData                    :: #force_inline proc "c" (buffer: u32, offset: int, size: int, data: rawptr, loc := #caller_location)                                                                                                                  {        impl_GetNamedBufferSubData(buffer, offset, size, data);                                                                            debug_helper(loc, 0, buffer, offset, size, data);                                                                                         }
+	CreateFramebuffers                       :: #force_inline proc "c" (n: i32, framebuffers: [^]u32, loc := #caller_location)                                                                                                                                       {        impl_CreateFramebuffers(n, framebuffers);                                                                                          debug_helper(loc, 0, n, framebuffers);                                                                                                    }
+	NamedFramebufferRenderbuffer             :: #force_inline proc "c" (framebuffer: u32, attachment: u32, renderbuffertarget: u32, renderbuffer: u32, loc := #caller_location)                                                                                      {        impl_NamedFramebufferRenderbuffer(framebuffer, attachment, renderbuffertarget, renderbuffer);                                      debug_helper(loc, 0, framebuffer, attachment, renderbuffertarget, renderbuffer);                                                          }
+	NamedFramebufferParameteri               :: #force_inline proc "c" (framebuffer: u32, pname: u32, param: i32, loc := #caller_location)                                                                                                                           {        impl_NamedFramebufferParameteri(framebuffer, pname, param);                                                                        debug_helper(loc, 0, framebuffer, pname, param);                                                                                          }
+	NamedFramebufferTexture                  :: #force_inline proc "c" (framebuffer: u32, attachment: u32, texture: u32, level: i32, loc := #caller_location)                                                                                                        {        impl_NamedFramebufferTexture(framebuffer, attachment, texture, level);                                                             debug_helper(loc, 0, framebuffer, attachment, texture, level);                                                                            }
+	NamedFramebufferTextureLayer             :: #force_inline proc "c" (framebuffer: u32, attachment: u32, texture: u32, level: i32, layer: i32, loc := #caller_location)                                                                                            {        impl_NamedFramebufferTextureLayer(framebuffer, attachment, texture, level, layer);                                                 debug_helper(loc, 0, framebuffer, attachment, texture, level, layer);                                                                     }
+	NamedFramebufferDrawBuffer               :: #force_inline proc "c" (framebuffer: u32, buf: u32, loc := #caller_location)                                                                                                                                         {        impl_NamedFramebufferDrawBuffer(framebuffer, buf);                                                                                 debug_helper(loc, 0, framebuffer, buf);                                                                                                   }
+	NamedFramebufferDrawBuffers              :: #force_inline proc "c" (framebuffer: u32, n: i32, bufs: [^]u32, loc := #caller_location)                                                                                                                             {        impl_NamedFramebufferDrawBuffers(framebuffer, n, bufs);                                                                            debug_helper(loc, 0, framebuffer, n, bufs);                                                                                               }
+	NamedFramebufferReadBuffer               :: #force_inline proc "c" (framebuffer: u32, src: u32, loc := #caller_location)                                                                                                                                         {        impl_NamedFramebufferReadBuffer(framebuffer, src);                                                                                 debug_helper(loc, 0, framebuffer, src);                                                                                                   }
+	InvalidateNamedFramebufferData           :: #force_inline proc "c" (framebuffer: u32, numAttachments: i32, attachments: ^u32, loc := #caller_location)                                                                                                           {        impl_InvalidateNamedFramebufferData(framebuffer, numAttachments, attachments);                                                     debug_helper(loc, 0, framebuffer, numAttachments, attachments);                                                                           }
+	InvalidateNamedFramebufferSubData        :: #force_inline proc "c" (framebuffer: u32, numAttachments: i32, attachments: ^u32, x: i32, y: i32, width: i32, height: i32, loc := #caller_location)                                                                  {        impl_InvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, x, y, width, height);                             debug_helper(loc, 0, framebuffer, numAttachments, attachments, x, y, width, height);                                                      }
+	ClearNamedFramebufferiv                  :: #force_inline proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, value: ^i32, loc := #caller_location)                                                                                                        {        impl_ClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value);                                                              debug_helper(loc, 0, framebuffer, buffer, drawbuffer, value);                                                                             }
+	ClearNamedFramebufferuiv                 :: #force_inline proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, value: ^u32, loc := #caller_location)                                                                                                        {        impl_ClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value);                                                             debug_helper(loc, 0, framebuffer, buffer, drawbuffer, value);                                                                             }
+	ClearNamedFramebufferfv                  :: #force_inline proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, value: ^f32, loc := #caller_location)                                                                                                        {        impl_ClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value);                                                              debug_helper(loc, 0, framebuffer, buffer, drawbuffer, value);                                                                             }
+	ClearNamedFramebufferfi                  :: #force_inline proc "c" (framebuffer: u32, buffer: u32, drawbuffer: i32, depth: f32, stencil: i32, loc := #caller_location)                                                                                           {        impl_ClearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, stencil);                                                     debug_helper(loc, 0, framebuffer, buffer, drawbuffer, depth, stencil);                                                                    }
+	BlitNamedFramebuffer                     :: #force_inline proc "c" (readFramebuffer: u32, drawFramebuffer: u32, srcX0: i32, srcY0: i32, srcX1: i32, srcY1: i32, dstX0: i32, dstY0: i32, dstX1: i32, dstY1: i32, mask: u32, filter: u32, loc := #caller_location) {        impl_BlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); debug_helper(loc, 0, readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);             }
+	CheckNamedFramebufferStatus              :: #force_inline proc "c" (framebuffer: u32, target: u32, loc := #caller_location) -> u32                                                                                                                               { ret := impl_CheckNamedFramebufferStatus(framebuffer, target);                                                                             debug_helper(loc, 1, ret, framebuffer, target); return ret;                                                                               }
+	GetNamedFramebufferParameteriv           :: #force_inline proc "c" (framebuffer: u32, pname: u32, param: ^i32, loc := #caller_location)                                                                                                                          {        impl_GetNamedFramebufferParameteriv(framebuffer, pname, param);                                                                    debug_helper(loc, 0, framebuffer, pname, param);                                                                                          }
+	GetNamedFramebufferAttachmentParameteriv :: #force_inline proc "c" (framebuffer: u32, attachment: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                                      {        impl_GetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, params);                                             debug_helper(loc, 0, framebuffer, attachment, pname, params);                                                                             }
+	CreateRenderbuffers                      :: #force_inline proc "c" (n: i32, renderbuffers: [^]u32, loc := #caller_location)                                                                                                                                      {        impl_CreateRenderbuffers(n, renderbuffers);                                                                                        debug_helper(loc, 0, n, renderbuffers);                                                                                                   }
+	NamedRenderbufferStorage                 :: #force_inline proc "c" (renderbuffer: u32, internalformat: u32, width: i32, height: i32, loc := #caller_location)                                                                                                    {        impl_NamedRenderbufferStorage(renderbuffer, internalformat, width, height);                                                        debug_helper(loc, 0, renderbuffer, internalformat, width, height);                                                                        }
+	NamedRenderbufferStorageMultisample      :: #force_inline proc "c" (renderbuffer: u32, samples: i32, internalformat: u32, width: i32, height: i32, loc := #caller_location)                                                                                      {        impl_NamedRenderbufferStorageMultisample(renderbuffer, samples, internalformat, width, height);                                    debug_helper(loc, 0, renderbuffer, samples, internalformat, width, height);                                                               }
+	GetNamedRenderbufferParameteriv          :: #force_inline proc "c" (renderbuffer: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                                                      {        impl_GetNamedRenderbufferParameteriv(renderbuffer, pname, params);                                                                 debug_helper(loc, 0, renderbuffer, pname, params);                                                                                        }
+	CreateTextures                           :: #force_inline proc "c" (target: u32, n: i32, textures: [^]u32, loc := #caller_location)                                                                                                                              {        impl_CreateTextures(target, n, textures);                                                                                          debug_helper(loc, 0, target, n, textures);                                                                                                }
+	TextureBuffer                            :: #force_inline proc "c" (texture: u32, internalformat: u32, buffer: u32, loc := #caller_location)                                                                                                                     {        impl_TextureBuffer(texture, internalformat, buffer);                                                                               debug_helper(loc, 0, texture, internalformat, buffer);                                                                                    }
+	TextureBufferRange                       :: #force_inline proc "c" (texture: u32, internalformat: u32, buffer: u32, offset: int, size: int, loc := #caller_location)                                                                                             {        impl_TextureBufferRange(texture, internalformat, buffer, offset, size);                                                            debug_helper(loc, 0, texture, internalformat, buffer, offset, size);                                                                      }
+	TextureStorage1D                         :: #force_inline proc "c" (texture: u32, levels: i32, internalformat: u32, width: i32, loc := #caller_location)                                                                                                         {        impl_TextureStorage1D(texture, levels, internalformat, width);                                                                     debug_helper(loc, 0, texture, levels, internalformat, width);                                                                             }
+	TextureStorage2D                         :: #force_inline proc "c" (texture: u32, levels: i32, internalformat: u32, width: i32, height: i32, loc := #caller_location)                                                                                            {        impl_TextureStorage2D(texture, levels, internalformat, width, height);                                                             debug_helper(loc, 0, texture, levels, internalformat, width, height);                                                                     }
+	TextureStorage3D                         :: #force_inline proc "c" (texture: u32, levels: i32, internalformat: u32, width: i32, height: i32, depth: i32, loc := #caller_location)                                                                                {        impl_TextureStorage3D(texture, levels, internalformat, width, height, depth);                                                      debug_helper(loc, 0, texture, levels, internalformat, width, height, depth);                                                              }
+	TextureStorage2DMultisample              :: #force_inline proc "c" (texture: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: u8, loc := #caller_location)                                                                 {        impl_TextureStorage2DMultisample(texture, samples, internalformat, width, height, fixedsamplelocations);                           debug_helper(loc, 0, texture, samples, internalformat, width, height, fixedsamplelocations);                                              }
+	TextureStorage3DMultisample              :: #force_inline proc "c" (texture: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: u8, loc := #caller_location)                                                     {        impl_TextureStorage3DMultisample(texture, samples, internalformat, width, height, depth, fixedsamplelocations);                    debug_helper(loc, 0, texture, samples, internalformat, width, height, depth, fixedsamplelocations);                                       }
+	TextureSubImage1D                        :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, width: i32, format: u32, type: u32, pixels: rawptr, loc := #caller_location)                                                                         {        impl_TextureSubImage1D(texture, level, xoffset, width, format, type, pixels);                                                     debug_helper(loc, 0, texture, level, xoffset, width, format, type, pixels);                                                              }
+	TextureSubImage2D                        :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, type: u32, pixels: rawptr, loc := #caller_location)                                              {        impl_TextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels);                                    debug_helper(loc, 0, texture, level, xoffset, yoffset, width, height, format, type, pixels);                                             }
+	TextureSubImage3D                        :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, pixels: rawptr, loc := #caller_location)                    {        impl_TextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);                    debug_helper(loc, 0, texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);                             }
+	CompressedTextureSubImage1D              :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, width: i32, format: u32, imageSize: i32, data: rawptr, loc := #caller_location)                                                                      {        impl_CompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data);                                         debug_helper(loc, 0, texture, level, xoffset, width, format, imageSize, data);                                                            }
+	CompressedTextureSubImage2D              :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, imageSize: i32, data: rawptr, loc := #caller_location)                                           {        impl_CompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data);                        debug_helper(loc, 0, texture, level, xoffset, yoffset, width, height, format, imageSize, data);                                           }
+	CompressedTextureSubImage3D              :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, imageSize: i32, data: rawptr, loc := #caller_location)                 {        impl_CompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);        debug_helper(loc, 0, texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);                           }
+	CopyTextureSubImage1D                    :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, x: i32, y: i32, width: i32, loc := #caller_location)                                                                                                 {        impl_CopyTextureSubImage1D(texture, level, xoffset, x, y, width);                                                                  debug_helper(loc, 0, texture, level, xoffset, x, y, width);                                                                               }
+	CopyTextureSubImage2D                    :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, x: i32, y: i32, width: i32, height: i32, loc := #caller_location)                                                                      {        impl_CopyTextureSubImage2D(texture, level, xoffset, yoffset, x, y, width, height);                                                 debug_helper(loc, 0, texture, level, xoffset, yoffset, x, y, width, height);                                                              }
+	CopyTextureSubImage3D                    :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, x: i32, y: i32, width: i32, height: i32, loc := #caller_location)                                                        {        impl_CopyTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, x, y, width, height);                                        debug_helper(loc, 0, texture, level, xoffset, yoffset, zoffset, x, y, width, height);                                                     }
+	TextureParameterf                        :: #force_inline proc "c" (texture: u32, pname: u32, param: f32, loc := #caller_location)                                                                                                                               {        impl_TextureParameterf(texture, pname, param);                                                                                     debug_helper(loc, 0, texture, pname, param);                                                                                              }
+	TextureParameterfv                       :: #force_inline proc "c" (texture: u32, pname: u32, param: ^f32, loc := #caller_location)                                                                                                                              {        impl_TextureParameterfv(texture, pname, param);                                                                                    debug_helper(loc, 0, texture, pname, param);                                                                                              }
+	TextureParameteri                        :: #force_inline proc "c" (texture: u32, pname: u32, param: i32, loc := #caller_location)                                                                                                                               {        impl_TextureParameteri(texture, pname, param);                                                                                     debug_helper(loc, 0, texture, pname, param);                                                                                              }
+	TextureParameterIiv                      :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                                                           {        impl_TextureParameterIiv(texture, pname, params);                                                                                  debug_helper(loc, 0, texture, pname, params);                                                                                             }
+	TextureParameterIuiv                     :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]u32, loc := #caller_location)                                                                                                                           {        impl_TextureParameterIuiv(texture, pname, params);                                                                                 debug_helper(loc, 0, texture, pname, params);                                                                                             }
+	TextureParameteriv                       :: #force_inline proc "c" (texture: u32, pname: u32, param: ^i32, loc := #caller_location)                                                                                                                              {        impl_TextureParameteriv(texture, pname, param);                                                                                    debug_helper(loc, 0, texture, pname, param);                                                                                              }
+	GenerateTextureMipmap                    :: #force_inline proc "c" (texture: u32, loc := #caller_location)                                                                                                                                                       {        impl_GenerateTextureMipmap(texture);                                                                                               debug_helper(loc, 0, texture);                                                                                                            }
+	BindTextureUnit                          :: #force_inline proc "c" (unit: u32, texture: u32, loc := #caller_location)                                                                                                                                            {        impl_BindTextureUnit(unit, texture);                                                                                               debug_helper(loc, 0, unit, texture);                                                                                                      }
+	GetTextureImage                          :: #force_inline proc "c" (texture: u32, level: i32, format: u32, type: u32, bufSize: i32, pixels: rawptr, loc := #caller_location)                                                                                     {        impl_GetTextureImage(texture, level, format, type, bufSize, pixels);                                                              debug_helper(loc, 0, texture, level, format, type, bufSize, pixels);                                                                     }
+	GetCompressedTextureImage                :: #force_inline proc "c" (texture: u32, level: i32, bufSize: i32, pixels: rawptr, loc := #caller_location)                                                                                                             {        impl_GetCompressedTextureImage(texture, level, bufSize, pixels);                                                                   debug_helper(loc, 0, texture, level, bufSize, pixels);                                                                                    }
+	GetTextureLevelParameterfv               :: #force_inline proc "c" (texture: u32, level: i32, pname: u32, params: [^]f32, loc := #caller_location)                                                                                                               {        impl_GetTextureLevelParameterfv(texture, level, pname, params);                                                                    debug_helper(loc, 0, texture, level, pname, params);                                                                                      }
+	GetTextureLevelParameteriv               :: #force_inline proc "c" (texture: u32, level: i32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                                               {        impl_GetTextureLevelParameteriv(texture, level, pname, params);                                                                    debug_helper(loc, 0, texture, level, pname, params);                                                                                      }
+	GetTextureParameterfv                    :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]f32, loc := #caller_location)                                                                                                                           {        impl_GetTextureParameterfv(texture, pname, params);                                                                                debug_helper(loc, 0, texture, pname, params);                                                                                             }
+	GetTextureParameterIiv                   :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                                                           {        impl_GetTextureParameterIiv(texture, pname, params);                                                                               debug_helper(loc, 0, texture, pname, params);                                                                                             }
+	GetTextureParameterIuiv                  :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]u32, loc := #caller_location)                                                                                                                           {        impl_GetTextureParameterIuiv(texture, pname, params);                                                                              debug_helper(loc, 0, texture, pname, params);                                                                                             }
+	GetTextureParameteriv                    :: #force_inline proc "c" (texture: u32, pname: u32, params: [^]i32, loc := #caller_location)                                                                                                                           {        impl_GetTextureParameteriv(texture, pname, params);                                                                                debug_helper(loc, 0, texture, pname, params);                                                                                             }
+	CreateVertexArrays                       :: #force_inline proc "c" (n: i32, arrays: [^]u32, loc := #caller_location)                                                                                                                                             {        impl_CreateVertexArrays(n, arrays);                                                                                                debug_helper(loc, 0, n, arrays);                                                                                                          }
+	DisableVertexArrayAttrib                 :: #force_inline proc "c" (vaobj: u32, index: u32, loc := #caller_location)                                                                                                                                             {        impl_DisableVertexArrayAttrib(vaobj, index);                                                                                       debug_helper(loc, 0, vaobj, index);                                                                                                       }
+	EnableVertexArrayAttrib                  :: #force_inline proc "c" (vaobj: u32, index: u32, loc := #caller_location)                                                                                                                                             {        impl_EnableVertexArrayAttrib(vaobj, index);                                                                                        debug_helper(loc, 0, vaobj, index);                                                                                                       }
+	VertexArrayElementBuffer                 :: #force_inline proc "c" (vaobj: u32, buffer: u32, loc := #caller_location)                                                                                                                                            {        impl_VertexArrayElementBuffer(vaobj, buffer);                                                                                      debug_helper(loc, 0, vaobj, buffer);                                                                                                      }
+	VertexArrayVertexBuffer                  :: #force_inline proc "c" (vaobj: u32, bindingindex: u32, buffer: u32, offset: int, stride: i32, loc := #caller_location)                                                                                               {        impl_VertexArrayVertexBuffer(vaobj, bindingindex, buffer, offset, stride);                                                         debug_helper(loc, 0, vaobj, bindingindex, buffer, offset, stride);                                                                        }
+	VertexArrayVertexBuffers                 :: #force_inline proc "c" (vaobj: u32, first: u32, count: i32, buffers: [^]u32, offsets: [^]uintptr, strides: [^]i32, loc := #caller_location)                                                                          {        impl_VertexArrayVertexBuffers(vaobj, first, count, buffers, offsets, strides);                                                     debug_helper(loc, 0, vaobj, first, count, buffers, offsets, strides);                                                                     }
+	VertexArrayAttribBinding                 :: #force_inline proc "c" (vaobj: u32, attribindex: u32, bindingindex: u32, loc := #caller_location)                                                                                                                    {        impl_VertexArrayAttribBinding(vaobj, attribindex, bindingindex);                                                                   debug_helper(loc, 0, vaobj, attribindex, bindingindex);                                                                                   }
+	VertexArrayAttribFormat                  :: #force_inline proc "c" (vaobj: u32, attribindex: u32, size: i32, type: u32, normalized: bool, relativeoffset: u32, loc := #caller_location)                                                                          {        impl_VertexArrayAttribFormat(vaobj, attribindex, size, type, normalized, relativeoffset);                                         debug_helper(loc, 0, vaobj, attribindex, size, type, normalized, relativeoffset);                                                        }
+	VertexArrayAttribIFormat                 :: #force_inline proc "c" (vaobj: u32, attribindex: u32, size: i32, type: u32, relativeoffset: u32, loc := #caller_location)                                                                                            {        impl_VertexArrayAttribIFormat(vaobj, attribindex, size, type, relativeoffset);                                                    debug_helper(loc, 0, vaobj, attribindex, size, type, relativeoffset);                                                                    }
+	VertexArrayAttribLFormat                 :: #force_inline proc "c" (vaobj: u32, attribindex: u32, size: i32, type: u32, relativeoffset: u32, loc := #caller_location)                                                                                            {        impl_VertexArrayAttribLFormat(vaobj, attribindex, size, type, relativeoffset);                                                    debug_helper(loc, 0, vaobj, attribindex, size, type, relativeoffset);                                                                    }
+	VertexArrayBindingDivisor                :: #force_inline proc "c" (vaobj: u32, bindingindex: u32, divisor: u32, loc := #caller_location)                                                                                                                        {        impl_VertexArrayBindingDivisor(vaobj, bindingindex, divisor);                                                                      debug_helper(loc, 0, vaobj, bindingindex, divisor);                                                                                       }
+	GetVertexArrayiv                         :: #force_inline proc "c" (vaobj: u32, pname: u32, param: ^i32, loc := #caller_location)                                                                                                                                {        impl_GetVertexArrayiv(vaobj, pname, param);                                                                                        debug_helper(loc, 0, vaobj, pname, param);                                                                                                }
+	GetVertexArrayIndexediv                  :: #force_inline proc "c" (vaobj: u32, index: u32, pname: u32, param: ^i32, loc := #caller_location)                                                                                                                    {        impl_GetVertexArrayIndexediv(vaobj, index, pname, param);                                                                          debug_helper(loc, 0, vaobj, index, pname, param);                                                                                         }
+	GetVertexArrayIndexed64iv                :: #force_inline proc "c" (vaobj: u32, index: u32, pname: u32, param: ^i64, loc := #caller_location)                                                                                                                    {        impl_GetVertexArrayIndexed64iv(vaobj, index, pname, param);                                                                        debug_helper(loc, 0, vaobj, index, pname, param);                                                                                         }
+	CreateSamplers                           :: #force_inline proc "c" (n: i32, samplers: [^]u32, loc := #caller_location)                                                                                                                                           {        impl_CreateSamplers(n, samplers);                                                                                                  debug_helper(loc, 0, n, samplers);                                                                                                        }
+	CreateProgramPipelines                   :: #force_inline proc "c" (n: i32, pipelines: [^]u32, loc := #caller_location)                                                                                                                                          {        impl_CreateProgramPipelines(n, pipelines);                                                                                         debug_helper(loc, 0, n, pipelines);                                                                                                       }
+	CreateQueries                            :: #force_inline proc "c" (target: u32, n: i32, ids: [^]u32, loc := #caller_location)                                                                                                                                   {        impl_CreateQueries(target, n, ids);                                                                                                debug_helper(loc, 0, target, n, ids);                                                                                                     }
+	GetQueryBufferObjecti64v                 :: #force_inline proc "c" (id: u32, buffer: u32, pname: u32, offset: int, loc := #caller_location)                                                                                                                      {        impl_GetQueryBufferObjecti64v(id, buffer, pname, offset);                                                                          debug_helper(loc, 0, id, buffer, pname, offset);                                                                                          }
+	GetQueryBufferObjectiv                   :: #force_inline proc "c" (id: u32, buffer: u32, pname: u32, offset: int, loc := #caller_location)                                                                                                                      {        impl_GetQueryBufferObjectiv(id, buffer, pname, offset);                                                                            debug_helper(loc, 0, id, buffer, pname, offset);                                                                                          }
+	GetQueryBufferObjectui64v                :: #force_inline proc "c" (id: u32, buffer: u32, pname: u32, offset: int, loc := #caller_location)                                                                                                                      {        impl_GetQueryBufferObjectui64v(id, buffer, pname, offset);                                                                         debug_helper(loc, 0, id, buffer, pname, offset);                                                                                          }
+	GetQueryBufferObjectuiv                  :: #force_inline proc "c" (id: u32, buffer: u32, pname: u32, offset: int, loc := #caller_location)                                                                                                                      {        impl_GetQueryBufferObjectuiv(id, buffer, pname, offset);                                                                           debug_helper(loc, 0, id, buffer, pname, offset);                                                                                          }
+	MemoryBarrierByRegion                    :: #force_inline proc "c" (barriers: u32, loc := #caller_location)                                                                                                                                                      {        impl_MemoryBarrierByRegion(barriers);                                                                                              debug_helper(loc, 0, barriers);                                                                                                           }
+	GetTextureSubImage                       :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, bufSize: i32, pixels: rawptr, loc := #caller_location)      {        impl_GetTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);          debug_helper(loc, 0, texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, bufSize, pixels);                    }
+	GetCompressedTextureSubImage             :: #force_inline proc "c" (texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, bufSize: i32, pixels: rawptr, loc := #caller_location)                              {        impl_GetCompressedTextureSubImage(texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);               debug_helper(loc, 0, texture, level, xoffset, yoffset, zoffset, width, height, depth, bufSize, pixels);                                   }
+	GetGraphicsResetStatus                   :: #force_inline proc "c" (loc := #caller_location) -> u32                                                                                                                                                              { ret := impl_GetGraphicsResetStatus();                                                                                                     debug_helper(loc, 1, ret);                                                                                                    return ret; }
+	GetnCompressedTexImage                   :: #force_inline proc "c" (target: u32, lod: i32, bufSize: i32, pixels: rawptr, loc := #caller_location)                                                                                                                {        impl_GetnCompressedTexImage(target, lod, bufSize, pixels);                                                                         debug_helper(loc, 0, target, lod, bufSize, pixels);                                                                                       }
+	GetnTexImage                             :: #force_inline proc "c" (target: u32, level: i32, format: u32, type: u32, bufSize: i32, pixels: rawptr, loc := #caller_location)                                                                                      {        impl_GetnTexImage(target, level, format, type, bufSize, pixels);                                                                  debug_helper(loc, 0, target, level, format, type, bufSize, pixels);                                                                      }
+	GetnUniformdv                            :: #force_inline proc "c" (program: u32, location: i32, bufSize: i32, params: [^]f64, loc := #caller_location)                                                                                                          {        impl_GetnUniformdv(program, location, bufSize, params);                                                                            debug_helper(loc, 0, program, location, bufSize, params);                                                                                 }
+	GetnUniformfv                            :: #force_inline proc "c" (program: u32, location: i32, bufSize: i32, params: [^]f32, loc := #caller_location)                                                                                                          {        impl_GetnUniformfv(program, location, bufSize, params);                                                                            debug_helper(loc, 0, program, location, bufSize, params);                                                                                 }
+	GetnUniformiv                            :: #force_inline proc "c" (program: u32, location: i32, bufSize: i32, params: [^]i32, loc := #caller_location)                                                                                                          {        impl_GetnUniformiv(program, location, bufSize, params);                                                                            debug_helper(loc, 0, program, location, bufSize, params);                                                                                 }
+	GetnUniformuiv                           :: #force_inline proc "c" (program: u32, location: i32, bufSize: i32, params: [^]u32, loc := #caller_location)                                                                                                          {        impl_GetnUniformuiv(program, location, bufSize, params);                                                                           debug_helper(loc, 0, program, location, bufSize, params);                                                                                 }
+	ReadnPixels                              :: #force_inline proc "c" (x: i32, y: i32, width: i32, height: i32, format: u32, type: u32, bufSize: i32, data: rawptr, loc := #caller_location)                                                                        {        impl_ReadnPixels(x, y, width, height, format, type, bufSize, data);                                                               debug_helper(loc, 0, x, y, width, height, format, type, bufSize, data);                                                                  }
+	GetnMapdv                                :: #force_inline proc "c" (target: u32, query: u32, bufSize: i32, v: ^f64, loc := #caller_location)                                                                                                                     {        impl_GetnMapdv(target, query, bufSize, v);                                                                                         debug_helper(loc, 0, target, query, bufSize, v);                                                                                          }
+	GetnMapfv                                :: #force_inline proc "c" (target: u32, query: u32, bufSize: i32, v: ^f32, loc := #caller_location)                                                                                                                     {        impl_GetnMapfv(target, query, bufSize, v);                                                                                         debug_helper(loc, 0, target, query, bufSize, v);                                                                                          }
+	GetnMapiv                                :: #force_inline proc "c" (target: u32, query: u32, bufSize: i32, v: ^i32, loc := #caller_location)                                                                                                                     {        impl_GetnMapiv(target, query, bufSize, v);                                                                                         debug_helper(loc, 0, target, query, bufSize, v);                                                                                          }
+	GetnPixelMapusv                          :: #force_inline proc "c" (map_: u32, bufSize: i32, values: [^]u16, loc := #caller_location)                                                                                                                            {        impl_GetnPixelMapusv(map_, bufSize, values);                                                                                       debug_helper(loc, 0, map_, bufSize, values);                                                                                              }
+	GetnPixelMapfv                           :: #force_inline proc "c" (map_: u32, bufSize: i32, values: [^]f32, loc := #caller_location)                                                                                                                            {        impl_GetnPixelMapfv(map_, bufSize, values);                                                                                        debug_helper(loc, 0, map_, bufSize, values);                                                                                              }
+	GetnPixelMapuiv                          :: #force_inline proc "c" (map_: u32, bufSize: i32, values: [^]u32, loc := #caller_location)                                                                                                                            {        impl_GetnPixelMapuiv(map_, bufSize, values);                                                                                       debug_helper(loc, 0, map_, bufSize, values);                                                                                              }
+	GetnPolygonStipple                       :: #force_inline proc "c" (bufSize: i32, pattern: ^u8, loc := #caller_location)                                                                                                                                         {        impl_GetnPolygonStipple(bufSize, pattern);                                                                                         debug_helper(loc, 0, bufSize, pattern);                                                                                                   }
+	GetnColorTable                           :: #force_inline proc "c" (target: u32, format: u32, type: u32, bufSize: i32, table: rawptr, loc := #caller_location)                                                                                                   {        impl_GetnColorTable(target, format, type, bufSize, table);                                                                        debug_helper(loc, 0, target, format, type, bufSize, table);                                                                              }
+	GetnConvolutionFilter                    :: #force_inline proc "c" (target: u32, format: u32, type: u32, bufSize: i32, image: rawptr, loc := #caller_location)                                                                                                   {        impl_GetnConvolutionFilter(target, format, type, bufSize, image);                                                                 debug_helper(loc, 0, target, format, type, bufSize, image);                                                                              }
+	GetnSeparableFilter                      :: #force_inline proc "c" (target: u32, format: u32, type: u32, rowBufSize: i32, row: rawptr, columnBufSize: i32, column: rawptr, span: rawptr, loc := #caller_location)                                                {        impl_GetnSeparableFilter(target, format, type, rowBufSize, row, columnBufSize, column, span);                                     debug_helper(loc, 0, target, format, type, rowBufSize, row, columnBufSize, column, span);                                                }
+	GetnHistogram                            :: #force_inline proc "c" (target: u32, reset: u8, format: u32, type: u32, bufSize: i32, values: rawptr, loc := #caller_location)                                                                                       {        impl_GetnHistogram(target, reset, format, type, bufSize, values);                                                                 debug_helper(loc, 0, target, reset, format, type, bufSize, values);                                                                      }
+	GetnMinmax                               :: #force_inline proc "c" (target: u32, reset: u8, format: u32, type: u32, bufSize: i32, values: rawptr, loc := #caller_location)                                                                                       {        impl_GetnMinmax(target, reset, format, type, bufSize, values);                                                                    debug_helper(loc, 0, target, reset, format, type, bufSize, values);                                                                      }
+	TextureBarrier                           :: #force_inline proc "c" (loc := #caller_location)                                                                                                                                                                     {        impl_TextureBarrier();                                                                                                             debug_helper(loc, 0);                                                                                                                     }
+	GetUnsignedBytevEXT                      :: #force_inline proc "c" (pname: u32, data: ^byte, loc := #caller_location)                                                                                                                                            {        impl_glGetUnsignedBytevEXT(pname, data);                                                                                           debug_helper(loc, 0, pname, data);                                                                                                                     }
+	TexPageCommitmentARB                     :: #force_inline proc "c"(
+		target: u32,
+		level: i32,
+		xoffset: i32,
+		yoffset: i32,
+		zoffset: i32,
+		width: i32,
+		height: i32,
+		depth: i32,
+		commit: bool,
+		loc := #caller_location,
+	) {
+		impl_TexPageCommitmentARB(target, level, xoffset, yoffset, zoffset, width, height, depth, commit);
+		debug_helper(loc, 0, target, level, xoffset, yoffset, zoffset, width, height, depth, commit);
+	}
+	// VERSION_4_6
+	SpecializeShader               :: #force_inline proc "c" (shader: u32, pEntryPoint: ^u8, numSpecializationConstants: u32, pConstantIndex: ^u32, pConstantValue: ^u32, loc := #caller_location) { impl_SpecializeShader(shader, pEntryPoint, numSpecializationConstants, pConstantIndex, pConstantValue); debug_helper(loc, 0, shader, pEntryPoint, numSpecializationConstants, pConstantIndex, pConstantValue); }
+	MultiDrawArraysIndirectCount   :: #force_inline proc "c" (mode: i32, indirect: rawptr, drawcount: int, maxdrawcount, stride: i32, loc := #caller_location)                                     { impl_MultiDrawArraysIndirectCount(mode, indirect, drawcount, maxdrawcount, stride);                     debug_helper(loc, 0, mode, indirect, drawcount, maxdrawcount, stride);                                 }
+	MultiDrawElementsIndirectCount :: #force_inline proc "c" (mode: i32, type: i32, indirect: rawptr, drawcount: int, maxdrawcount, stride: i32, loc := #caller_location)                          { impl_MultiDrawElementsIndirectCount(mode, type, indirect, drawcount, maxdrawcount, stride);            debug_helper(loc, 0, mode, type, indirect, drawcount, maxdrawcount, stride);                          }
+	PolygonOffsetClamp             :: #force_inline proc "c" (factor, units, clamp: f32, loc := #caller_location)                                                                                  { impl_PolygonOffsetClamp(factor, units, clamp);                                                          debug_helper(loc, 0, factor, units, clamp);                                                            }
+}