import "std_types";
import "libc";

main :: proc(): int {
    load_up_to(4, 5, :Set_Proc_Address_Type(set_proc_address_stub));
    return counter - 710;
}

counter := 0;
set_proc_address_stub :: proc(p: **void, name: *char) {
    counter += 1;
}

//
// converted from: https://github.com/odin-lang/Odin
//

loaded_up_to: [2]int;
loaded_up_to_major := 0;
loaded_up_to_minor := 0;

Set_Proc_Address_Type :: typedef proc(p: **void, name: *char);

load_up_to :: proc(major: int, minor: int, set_proc_address: Set_Proc_Address_Type) {
    loaded_up_to = {major, 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*                           : *void
*/

sync_t :: typedef *void;
debug_proc_t :: typedef proc(source: u32, type: u32, id: u32, severity: u32, length: i32, message: *char, userParam: *void); @weak


GLfloat :: typedef float;
GLdouble :: typedef double;
GLchar :: typedef char;
GLenum :: typedef uint;
GLint :: typedef int;
GLuint :: typedef uint;
GLsizei :: typedef int;
GLboolean :: typedef uchar;
GLbitfield :: typedef uint;
GLvoid :: typedef void;
GLbyte :: typedef i8;
GLubyte :: typedef u8;
GLshort :: typedef i16;
GLushort :: typedef u16;

GL_DEPTH_BUFFER_BIT :: 0x00000100;
GL_STENCIL_BUFFER_BIT :: 0x00000400;
GL_COLOR_BUFFER_BIT :: 0x00004000;
GL_FALSE :: 0;
GL_TRUE :: 1;
GL_POINTS :: 0x0000;
GL_LINES :: 0x0001;
GL_LINE_LOOP :: 0x0002;
GL_LINE_STRIP :: 0x0003;
GL_TRIANGLES :: 0x0004;
GL_TRIANGLE_STRIP :: 0x0005;
GL_TRIANGLE_FAN :: 0x0006;
GL_NEVER :: 0x0200;
GL_LESS :: 0x0201;
GL_EQUAL :: 0x0202;
GL_LEQUAL :: 0x0203;
GL_GREATER :: 0x0204;
GL_NOTEQUAL :: 0x0205;
GL_GEQUAL :: 0x0206;
GL_ALWAYS :: 0x0207;
GL_ZERO :: 0;
GL_ONE :: 1;
GL_SRC_COLOR :: 0x0300;
GL_ONE_MINUS_SRC_COLOR :: 0x0301;
GL_SRC_ALPHA :: 0x0302;
GL_ONE_MINUS_SRC_ALPHA :: 0x0303;
GL_DST_ALPHA :: 0x0304;
GL_ONE_MINUS_DST_ALPHA :: 0x0305;
GL_DST_COLOR :: 0x0306;
GL_ONE_MINUS_DST_COLOR :: 0x0307;
GL_SRC_ALPHA_SATURATE :: 0x0308;
GL_NONE :: 0;
GL_FRONT_LEFT :: 0x0400;
GL_FRONT_RIGHT :: 0x0401;
GL_BACK_LEFT :: 0x0402;
GL_BACK_RIGHT :: 0x0403;
GL_FRONT :: 0x0404;
GL_BACK :: 0x0405;
GL_LEFT :: 0x0406;
GL_RIGHT :: 0x0407;
GL_FRONT_AND_BACK :: 0x0408;
GL_NO_ERROR :: 0;
GL_INVALID_ENUM :: 0x0500;
GL_INVALID_VALUE :: 0x0501;
GL_INVALID_OPERATION :: 0x0502;
GL_OUT_OF_MEMORY :: 0x0505;
GL_CW :: 0x0900;
GL_CCW :: 0x0901;
GL_POINT_SIZE :: 0x0b11;
GL_POINT_SIZE_RANGE :: 0x0b12;
GL_POINT_SIZE_GRANULARITY :: 0x0b13;
GL_LINE_SMOOTH :: 0x0b20;
GL_LINE_WIDTH :: 0x0b21;
GL_LINE_WIDTH_RANGE :: 0x0b22;
GL_LINE_WIDTH_GRANULARITY :: 0x0b23;
GL_POLYGON_MODE :: 0x0b40;
GL_POLYGON_SMOOTH :: 0x0b41;
GL_CULL_FACE :: 0x0b44;
GL_CULL_FACE_MODE :: 0x0b45;
GL_FRONT_FACE :: 0x0b46;
GL_DEPTH_RANGE :: 0x0b70;
GL_DEPTH_TEST :: 0x0b71;
GL_DEPTH_WRITEMASK :: 0x0b72;
GL_DEPTH_CLEAR_VALUE :: 0x0b73;
GL_DEPTH_FUNC :: 0x0b74;
GL_STENCIL_TEST :: 0x0b90;
GL_STENCIL_CLEAR_VALUE :: 0x0b91;
GL_STENCIL_FUNC :: 0x0b92;
GL_STENCIL_VALUE_MASK :: 0x0b93;
GL_STENCIL_FAIL :: 0x0b94;
GL_STENCIL_PASS_DEPTH_FAIL :: 0x0b95;
GL_STENCIL_PASS_DEPTH_PASS :: 0x0b96;
GL_STENCIL_REF :: 0x0b97;
GL_STENCIL_WRITEMASK :: 0x0b98;
GL_VIEWPORT :: 0x0ba2;
GL_DITHER :: 0x0bd0;
GL_BLEND_DST :: 0x0be0;
GL_BLEND_SRC :: 0x0be1;
GL_BLEND :: 0x0be2;
GL_LOGIC_OP_MODE :: 0x0bf0;
GL_DRAW_BUFFER :: 0x0c01;
GL_READ_BUFFER :: 0x0c02;
GL_SCISSOR_BOX :: 0x0c10;
GL_SCISSOR_TEST :: 0x0c11;
GL_COLOR_CLEAR_VALUE :: 0x0c22;
GL_COLOR_WRITEMASK :: 0x0c23;
GL_DOUBLEBUFFER :: 0x0c32;
GL_STEREO :: 0x0c33;
GL_LINE_SMOOTH_HINT :: 0x0c52;
GL_POLYGON_SMOOTH_HINT :: 0x0c53;
GL_UNPACK_SWAP_BYTES :: 0x0cf0;
GL_UNPACK_LSB_FIRST :: 0x0cf1;
GL_UNPACK_ROW_LENGTH :: 0x0cf2;
GL_UNPACK_SKIP_ROWS :: 0x0cf3;
GL_UNPACK_SKIP_PIXELS :: 0x0cf4;
GL_UNPACK_ALIGNMENT :: 0x0cf5;
GL_PACK_SWAP_BYTES :: 0x0d00;
GL_PACK_LSB_FIRST :: 0x0d01;
GL_PACK_ROW_LENGTH :: 0x0d02;
GL_PACK_SKIP_ROWS :: 0x0d03;
GL_PACK_SKIP_PIXELS :: 0x0d04;
GL_PACK_ALIGNMENT :: 0x0d05;
GL_MAX_TEXTURE_SIZE :: 0x0d33;
GL_MAX_VIEWPORT_DIMS :: 0x0d3a;
GL_SUBPIXEL_BITS :: 0x0d50;
GL_TEXTURE_1D :: 0x0de0;
GL_TEXTURE_2D :: 0x0de1;
GL_TEXTURE_WIDTH :: 0x1000;
GL_TEXTURE_HEIGHT :: 0x1001;
GL_TEXTURE_BORDER_COLOR :: 0x1004;
GL_DONT_CARE :: 0x1100;
GL_FASTEST :: 0x1101;
GL_NICEST :: 0x1102;
GL_BYTE :: 0x1400;
GL_UNSIGNED_BYTE :: 0x1401;
GL_SHORT :: 0x1402;
GL_UNSIGNED_SHORT :: 0x1403;
GL_INT :: 0x1404;
GL_UNSIGNED_INT :: 0x1405;
GL_FLOAT :: 0x1406;
GL_CLEAR :: 0x1500;
GL_AND :: 0x1501;
GL_AND_REVERSE :: 0x1502;
GL_COPY :: 0x1503;
GL_AND_INVERTED :: 0x1504;
GL_NOOP :: 0x1505;
GL_XOR :: 0x1506;
GL_OR :: 0x1507;
GL_NOR :: 0x1508;
GL_EQUIV :: 0x1509;
GL_INVERT :: 0x150a;
GL_OR_REVERSE :: 0x150b;
GL_COPY_INVERTED :: 0x150c;
GL_OR_INVERTED :: 0x150d;
GL_NAND :: 0x150e;
GL_SET :: 0x150f;
GL_TEXTURE :: 0x1702;
GL_COLOR :: 0x1800;
GL_DEPTH :: 0x1801;
GL_STENCIL :: 0x1802;
GL_STENCIL_INDEX :: 0x1901;
GL_DEPTH_COMPONENT :: 0x1902;
GL_RED :: 0x1903;
GL_GREEN :: 0x1904;
GL_BLUE :: 0x1905;
GL_ALPHA :: 0x1906;
GL_RGB :: 0x1907;
GL_RGBA :: 0x1908;
GL_POINT :: 0x1b00;
GL_LINE :: 0x1b01;
GL_FILL :: 0x1b02;
GL_KEEP :: 0x1e00;
GL_REPLACE :: 0x1e01;
GL_INCR :: 0x1e02;
GL_DECR :: 0x1e03;
GL_VENDOR :: 0x1f00;
GL_RENDERER :: 0x1f01;
GL_VERSION :: 0x1f02;
GL_EXTENSIONS :: 0x1f03;
GL_NEAREST :: 0x2600;
GL_LINEAR :: 0x2601;
GL_NEAREST_MIPMAP_NEAREST :: 0x2700;
GL_LINEAR_MIPMAP_NEAREST :: 0x2701;
GL_NEAREST_MIPMAP_LINEAR :: 0x2702;
GL_LINEAR_MIPMAP_LINEAR :: 0x2703;
GL_TEXTURE_MAG_FILTER :: 0x2800;
GL_TEXTURE_MIN_FILTER :: 0x2801;
GL_TEXTURE_WRAP_S :: 0x2802;
GL_TEXTURE_WRAP_T :: 0x2803;
GL_REPEAT :: 0x2901;
GL_COLOR_LOGIC_OP :: 0x0bf2;
GL_POLYGON_OFFSET_UNITS :: 0x2a00;
GL_POLYGON_OFFSET_POINT :: 0x2a01;
GL_POLYGON_OFFSET_LINE :: 0x2a02;
GL_POLYGON_OFFSET_FILL :: 0x8037;
GL_POLYGON_OFFSET_FACTOR :: 0x8038;
GL_TEXTURE_BINDING_1D :: 0x8068;
GL_TEXTURE_BINDING_2D :: 0x8069;
GL_TEXTURE_INTERNAL_FORMAT :: 0x1003;
GL_TEXTURE_RED_SIZE :: 0x805c;
GL_TEXTURE_GREEN_SIZE :: 0x805d;
GL_TEXTURE_BLUE_SIZE :: 0x805e;
GL_TEXTURE_ALPHA_SIZE :: 0x805f;
GL_DOUBLE :: 0x140a;
GL_PROXY_TEXTURE_1D :: 0x8063;
GL_PROXY_TEXTURE_2D :: 0x8064;
GL_R3_G3_B2 :: 0x2a10;
GL_RGB4 :: 0x804f;
GL_RGB5 :: 0x8050;
GL_RGB8 :: 0x8051;
GL_RGB10 :: 0x8052;
GL_RGB12 :: 0x8053;
GL_RGB16 :: 0x8054;
GL_RGBA2 :: 0x8055;
GL_RGBA4 :: 0x8056;
GL_RGB5_A1 :: 0x8057;
GL_RGBA8 :: 0x8058;
GL_RGB10_A2 :: 0x8059;
GL_RGBA12 :: 0x805a;
GL_RGBA16 :: 0x805b;
GL_UNSIGNED_BYTE_3_3_2 :: 0x8032;
GL_UNSIGNED_SHORT_4_4_4_4 :: 0x8033;
GL_UNSIGNED_SHORT_5_5_5_1 :: 0x8034;
GL_UNSIGNED_INT_8_8_8_8 :: 0x8035;
GL_UNSIGNED_INT_10_10_10_2 :: 0x8036;
GL_TEXTURE_BINDING_3D :: 0x806a;
GL_PACK_SKIP_IMAGES :: 0x806b;
GL_PACK_IMAGE_HEIGHT :: 0x806c;
GL_UNPACK_SKIP_IMAGES :: 0x806d;
GL_UNPACK_IMAGE_HEIGHT :: 0x806e;
GL_TEXTURE_3D :: 0x806f;
GL_PROXY_TEXTURE_3D :: 0x8070;
GL_TEXTURE_DEPTH :: 0x8071;
GL_TEXTURE_WRAP_R :: 0x8072;
GL_MAX_3D_TEXTURE_SIZE :: 0x8073;
GL_UNSIGNED_BYTE_2_3_3_REV :: 0x8362;
GL_UNSIGNED_SHORT_5_6_5 :: 0x8363;
GL_UNSIGNED_SHORT_5_6_5_REV :: 0x8364;
GL_UNSIGNED_SHORT_4_4_4_4_REV :: 0x8365;
GL_UNSIGNED_SHORT_1_5_5_5_REV :: 0x8366;
GL_UNSIGNED_INT_8_8_8_8_REV :: 0x8367;
GL_UNSIGNED_INT_2_10_10_10_REV :: 0x8368;
GL_BGR :: 0x80e0;
GL_BGRA :: 0x80e1;
GL_MAX_ELEMENTS_VERTICES :: 0x80e8;
GL_MAX_ELEMENTS_INDICES :: 0x80e9;
GL_CLAMP_TO_EDGE :: 0x812f;
GL_TEXTURE_MIN_LOD :: 0x813a;
GL_TEXTURE_MAX_LOD :: 0x813b;
GL_TEXTURE_BASE_LEVEL :: 0x813c;
GL_TEXTURE_MAX_LEVEL :: 0x813d;
GL_SMOOTH_POINT_SIZE_RANGE :: 0x0b12;
GL_SMOOTH_POINT_SIZE_GRANULARITY :: 0x0b13;
GL_SMOOTH_LINE_WIDTH_RANGE :: 0x0b22;
GL_SMOOTH_LINE_WIDTH_GRANULARITY :: 0x0b23;
GL_ALIASED_LINE_WIDTH_RANGE :: 0x846e;
GL_TEXTURE0 :: 0x84c0;
GL_TEXTURE1 :: 0x84c1;
GL_TEXTURE2 :: 0x84c2;
GL_TEXTURE3 :: 0x84c3;
GL_TEXTURE4 :: 0x84c4;
GL_TEXTURE5 :: 0x84c5;
GL_TEXTURE6 :: 0x84c6;
GL_TEXTURE7 :: 0x84c7;
GL_TEXTURE8 :: 0x84c8;
GL_TEXTURE9 :: 0x84c9;
GL_TEXTURE10 :: 0x84ca;
GL_TEXTURE11 :: 0x84cb;
GL_TEXTURE12 :: 0x84cc;
GL_TEXTURE13 :: 0x84cd;
GL_TEXTURE14 :: 0x84ce;
GL_TEXTURE15 :: 0x84cf;
GL_TEXTURE16 :: 0x84d0;
GL_TEXTURE17 :: 0x84d1;
GL_TEXTURE18 :: 0x84d2;
GL_TEXTURE19 :: 0x84d3;
GL_TEXTURE20 :: 0x84d4;
GL_TEXTURE21 :: 0x84d5;
GL_TEXTURE22 :: 0x84d6;
GL_TEXTURE23 :: 0x84d7;
GL_TEXTURE24 :: 0x84d8;
GL_TEXTURE25 :: 0x84d9;
GL_TEXTURE26 :: 0x84da;
GL_TEXTURE27 :: 0x84db;
GL_TEXTURE28 :: 0x84dc;
GL_TEXTURE29 :: 0x84dd;
GL_TEXTURE30 :: 0x84de;
GL_TEXTURE31 :: 0x84df;
GL_ACTIVE_TEXTURE :: 0x84e0;
GL_MULTISAMPLE :: 0x809d;
GL_SAMPLE_ALPHA_TO_COVERAGE :: 0x809e;
GL_SAMPLE_ALPHA_TO_ONE :: 0x809f;
GL_SAMPLE_COVERAGE :: 0x80a0;
GL_SAMPLE_BUFFERS :: 0x80a8;
GL_SAMPLES :: 0x80a9;
GL_SAMPLE_COVERAGE_VALUE :: 0x80aa;
GL_SAMPLE_COVERAGE_INVERT :: 0x80ab;
GL_TEXTURE_CUBE_MAP :: 0x8513;
GL_TEXTURE_BINDING_CUBE_MAP :: 0x8514;
GL_TEXTURE_CUBE_MAP_POSITIVE_X :: 0x8515;
GL_TEXTURE_CUBE_MAP_NEGATIVE_X :: 0x8516;
GL_TEXTURE_CUBE_MAP_POSITIVE_Y :: 0x8517;
GL_TEXTURE_CUBE_MAP_NEGATIVE_Y :: 0x8518;
GL_TEXTURE_CUBE_MAP_POSITIVE_Z :: 0x8519;
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z :: 0x851a;
GL_PROXY_TEXTURE_CUBE_MAP :: 0x851b;
GL_MAX_CUBE_MAP_TEXTURE_SIZE :: 0x851c;
GL_COMPRESSED_RGB :: 0x84ed;
GL_COMPRESSED_RGBA :: 0x84ee;
GL_TEXTURE_COMPRESSION_HINT :: 0x84ef;
GL_TEXTURE_COMPRESSED_IMAGE_SIZE :: 0x86a0;
GL_TEXTURE_COMPRESSED :: 0x86a1;
GL_NUM_COMPRESSED_TEXTURE_FORMATS :: 0x86a2;
GL_COMPRESSED_TEXTURE_FORMATS :: 0x86a3;
GL_CLAMP_TO_BORDER :: 0x812d;
GL_BLEND_DST_RGB :: 0x80c8;
GL_BLEND_SRC_RGB :: 0x80c9;
GL_BLEND_DST_ALPHA :: 0x80ca;
GL_BLEND_SRC_ALPHA :: 0x80cb;
GL_POINT_FADE_THRESHOLD_SIZE :: 0x8128;
GL_DEPTH_COMPONENT16 :: 0x81a5;
GL_DEPTH_COMPONENT24 :: 0x81a6;
GL_DEPTH_COMPONENT32 :: 0x81a7;
GL_MIRRORED_REPEAT :: 0x8370;
GL_MAX_TEXTURE_LOD_BIAS :: 0x84fd;
GL_TEXTURE_LOD_BIAS :: 0x8501;
GL_INCR_WRAP :: 0x8507;
GL_DECR_WRAP :: 0x8508;
GL_TEXTURE_DEPTH_SIZE :: 0x884a;
GL_TEXTURE_COMPARE_MODE :: 0x884c;
GL_TEXTURE_COMPARE_FUNC :: 0x884d;
GL_BLEND_COLOR :: 0x8005;
GL_BLEND_EQUATION :: 0x8009;
GL_CONSTANT_COLOR :: 0x8001;
GL_ONE_MINUS_CONSTANT_COLOR :: 0x8002;
GL_CONSTANT_ALPHA :: 0x8003;
GL_ONE_MINUS_CONSTANT_ALPHA :: 0x8004;
GL_FUNC_ADD :: 0x8006;
GL_FUNC_REVERSE_SUBTRACT :: 0x800b;
GL_FUNC_SUBTRACT :: 0x800a;
GL_MIN :: 0x8007;
GL_MAX :: 0x8008;
GL_BUFFER_SIZE :: 0x8764;
GL_BUFFER_USAGE :: 0x8765;
GL_QUERY_COUNTER_BITS :: 0x8864;
GL_CURRENT_QUERY :: 0x8865;
GL_QUERY_RESULT :: 0x8866;
GL_QUERY_RESULT_AVAILABLE :: 0x8867;
GL_ARRAY_BUFFER :: 0x8892;
GL_ELEMENT_ARRAY_BUFFER :: 0x8893;
GL_ARRAY_BUFFER_BINDING :: 0x8894;
GL_ELEMENT_ARRAY_BUFFER_BINDING :: 0x8895;
GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING :: 0x889f;
GL_READ_ONLY :: 0x88b8;
GL_WRITE_ONLY :: 0x88b9;
GL_READ_WRITE :: 0x88ba;
GL_BUFFER_ACCESS :: 0x88bb;
GL_BUFFER_MAPPED :: 0x88bc;
GL_BUFFER_MAP_POINTER :: 0x88bd;
GL_STREAM_DRAW :: 0x88e0;
GL_STREAM_READ :: 0x88e1;
GL_STREAM_COPY :: 0x88e2;
GL_STATIC_DRAW :: 0x88e4;
GL_STATIC_READ :: 0x88e5;
GL_STATIC_COPY :: 0x88e6;
GL_DYNAMIC_DRAW :: 0x88e8;
GL_DYNAMIC_READ :: 0x88e9;
GL_DYNAMIC_COPY :: 0x88ea;
GL_SAMPLES_PASSED :: 0x8914;
GL_SRC1_ALPHA :: 0x8589;
GL_BLEND_EQUATION_RGB :: 0x8009;
GL_VERTEX_ATTRIB_ARRAY_ENABLED :: 0x8622;
GL_VERTEX_ATTRIB_ARRAY_SIZE :: 0x8623;
GL_VERTEX_ATTRIB_ARRAY_STRIDE :: 0x8624;
GL_VERTEX_ATTRIB_ARRAY_TYPE :: 0x8625;
GL_CURRENT_VERTEX_ATTRIB :: 0x8626;
GL_VERTEX_PROGRAM_POINT_SIZE :: 0x8642;
GL_VERTEX_ATTRIB_ARRAY_POINTER :: 0x8645;
GL_STENCIL_BACK_FUNC :: 0x8800;
GL_STENCIL_BACK_FAIL :: 0x8801;
GL_STENCIL_BACK_PASS_DEPTH_FAIL :: 0x8802;
GL_STENCIL_BACK_PASS_DEPTH_PASS :: 0x8803;
GL_MAX_DRAW_BUFFERS :: 0x8824;
GL_DRAW_BUFFER0 :: 0x8825;
GL_DRAW_BUFFER1 :: 0x8826;
GL_DRAW_BUFFER2 :: 0x8827;
GL_DRAW_BUFFER3 :: 0x8828;
GL_DRAW_BUFFER4 :: 0x8829;
GL_DRAW_BUFFER5 :: 0x882a;
GL_DRAW_BUFFER6 :: 0x882b;
GL_DRAW_BUFFER7 :: 0x882c;
GL_DRAW_BUFFER8 :: 0x882d;
GL_DRAW_BUFFER9 :: 0x882e;
GL_DRAW_BUFFER10 :: 0x882f;
GL_DRAW_BUFFER11 :: 0x8830;
GL_DRAW_BUFFER12 :: 0x8831;
GL_DRAW_BUFFER13 :: 0x8832;
GL_DRAW_BUFFER14 :: 0x8833;
GL_DRAW_BUFFER15 :: 0x8834;
GL_BLEND_EQUATION_ALPHA :: 0x883d;
GL_MAX_VERTEX_ATTRIBS :: 0x8869;
GL_VERTEX_ATTRIB_ARRAY_NORMALIZED :: 0x886a;
GL_MAX_TEXTURE_IMAGE_UNITS :: 0x8872;
GL_FRAGMENT_SHADER :: 0x8b30;
GL_VERTEX_SHADER :: 0x8b31;
GL_MAX_FRAGMENT_UNIFORM_COMPONENTS :: 0x8b49;
GL_MAX_VERTEX_UNIFORM_COMPONENTS :: 0x8b4a;
GL_MAX_VARYING_FLOATS :: 0x8b4b;
GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS :: 0x8b4c;
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS :: 0x8b4d;
GL_SHADER_TYPE :: 0x8b4f;
GL_FLOAT_VEC2 :: 0x8b50;
GL_FLOAT_VEC3 :: 0x8b51;
GL_FLOAT_VEC4 :: 0x8b52;
GL_INT_VEC2 :: 0x8b53;
GL_INT_VEC3 :: 0x8b54;
GL_INT_VEC4 :: 0x8b55;
GL_BOOL :: 0x8b56;
GL_BOOL_VEC2 :: 0x8b57;
GL_BOOL_VEC3 :: 0x8b58;
GL_BOOL_VEC4 :: 0x8b59;
GL_FLOAT_MAT2 :: 0x8b5a;
GL_FLOAT_MAT3 :: 0x8b5b;
GL_FLOAT_MAT4 :: 0x8b5c;
GL_SAMPLER_1D :: 0x8b5d;
GL_SAMPLER_2D :: 0x8b5e;
GL_SAMPLER_3D :: 0x8b5f;
GL_SAMPLER_CUBE :: 0x8b60;
GL_SAMPLER_1D_SHADOW :: 0x8b61;
GL_SAMPLER_2D_SHADOW :: 0x8b62;
GL_DELETE_STATUS :: 0x8b80;
GL_COMPILE_STATUS :: 0x8b81;
GL_LINK_STATUS :: 0x8b82;
GL_VALIDATE_STATUS :: 0x8b83;
GL_INFO_LOG_LENGTH :: 0x8b84;
GL_ATTACHED_SHADERS :: 0x8b85;
GL_ACTIVE_UNIFORMS :: 0x8b86;
GL_ACTIVE_UNIFORM_MAX_LENGTH :: 0x8b87;
GL_SHADER_SOURCE_LENGTH :: 0x8b88;
GL_ACTIVE_ATTRIBUTES :: 0x8b89;
GL_ACTIVE_ATTRIBUTE_MAX_LENGTH :: 0x8b8a;
GL_FRAGMENT_SHADER_DERIVATIVE_HINT :: 0x8b8b;
GL_SHADING_LANGUAGE_VERSION :: 0x8b8c;
GL_CURRENT_PROGRAM :: 0x8b8d;
GL_POINT_SPRITE_COORD_ORIGIN :: 0x8ca0;
GL_LOWER_LEFT :: 0x8ca1;
GL_UPPER_LEFT :: 0x8ca2;
GL_STENCIL_BACK_REF :: 0x8ca3;
GL_STENCIL_BACK_VALUE_MASK :: 0x8ca4;
GL_STENCIL_BACK_WRITEMASK :: 0x8ca5;
GL_PIXEL_PACK_BUFFER :: 0x88eb;
GL_PIXEL_UNPACK_BUFFER :: 0x88ec;
GL_PIXEL_PACK_BUFFER_BINDING :: 0x88ed;
GL_PIXEL_UNPACK_BUFFER_BINDING :: 0x88ef;
GL_FLOAT_MAT2x3 :: 0x8b65;
GL_FLOAT_MAT2x4 :: 0x8b66;
GL_FLOAT_MAT3x2 :: 0x8b67;
GL_FLOAT_MAT3x4 :: 0x8b68;
GL_FLOAT_MAT4x2 :: 0x8b69;
GL_FLOAT_MAT4x3 :: 0x8b6a;
GL_SRGB :: 0x8c40;
GL_SRGB8 :: 0x8c41;
GL_SRGB_ALPHA :: 0x8c42;
GL_SRGB8_ALPHA8 :: 0x8c43;
GL_COMPRESSED_SRGB :: 0x8c48;
GL_COMPRESSED_SRGB_ALPHA :: 0x8c49;
GL_COMPARE_REF_TO_TEXTURE :: 0x884e;
GL_CLIP_DISTANCE0 :: 0x3000;
GL_CLIP_DISTANCE1 :: 0x3001;
GL_CLIP_DISTANCE2 :: 0x3002;
GL_CLIP_DISTANCE3 :: 0x3003;
GL_CLIP_DISTANCE4 :: 0x3004;
GL_CLIP_DISTANCE5 :: 0x3005;
GL_CLIP_DISTANCE6 :: 0x3006;
GL_CLIP_DISTANCE7 :: 0x3007;
GL_MAX_CLIP_DISTANCES :: 0x0d32;
GL_MAJOR_VERSION :: 0x821b;
GL_MINOR_VERSION :: 0x821c;
GL_NUM_EXTENSIONS :: 0x821d;
GL_CONTEXT_FLAGS :: 0x821e;
GL_COMPRESSED_RED :: 0x8225;
GL_COMPRESSED_RG :: 0x8226;
GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT :: 0x00000001;
GL_RGBA32F :: 0x8814;
GL_RGB32F :: 0x8815;
GL_RGBA16F :: 0x881a;
GL_RGB16F :: 0x881b;
GL_VERTEX_ATTRIB_ARRAY_INTEGER :: 0x88fd;
GL_MAX_ARRAY_TEXTURE_LAYERS :: 0x88ff;
GL_MIN_PROGRAM_TEXEL_OFFSET :: 0x8904;
GL_MAX_PROGRAM_TEXEL_OFFSET :: 0x8905;
GL_CLAMP_READ_COLOR :: 0x891c;
GL_FIXED_ONLY :: 0x891d;
GL_MAX_VARYING_COMPONENTS :: 0x8b4b;
GL_TEXTURE_1D_ARRAY :: 0x8c18;
GL_PROXY_TEXTURE_1D_ARRAY :: 0x8c19;
GL_TEXTURE_2D_ARRAY :: 0x8c1a;
GL_PROXY_TEXTURE_2D_ARRAY :: 0x8c1b;
GL_TEXTURE_BINDING_1D_ARRAY :: 0x8c1c;
GL_TEXTURE_BINDING_2D_ARRAY :: 0x8c1d;
GL_R11F_G11F_B10F :: 0x8c3a;
GL_UNSIGNED_INT_10F_11F_11F_REV :: 0x8c3b;
GL_RGB9_E5 :: 0x8c3d;
GL_UNSIGNED_INT_5_9_9_9_REV :: 0x8c3e;
GL_TEXTURE_SHARED_SIZE :: 0x8c3f;
GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH :: 0x8c76;
GL_TRANSFORM_FEEDBACK_BUFFER_MODE :: 0x8c7f;
GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS :: 0x8c80;
GL_TRANSFORM_FEEDBACK_VARYINGS :: 0x8c83;
GL_TRANSFORM_FEEDBACK_BUFFER_START :: 0x8c84;
GL_TRANSFORM_FEEDBACK_BUFFER_SIZE :: 0x8c85;
GL_PRIMITIVES_GENERATED :: 0x8c87;
GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN :: 0x8c88;
GL_RASTERIZER_DISCARD :: 0x8c89;
GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS :: 0x8c8a;
GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS :: 0x8c8b;
GL_INTERLEAVED_ATTRIBS :: 0x8c8c;
GL_SEPARATE_ATTRIBS :: 0x8c8d;
GL_TRANSFORM_FEEDBACK_BUFFER :: 0x8c8e;
GL_TRANSFORM_FEEDBACK_BUFFER_BINDING :: 0x8c8f;
GL_RGBA32UI :: 0x8d70;
GL_RGB32UI :: 0x8d71;
GL_RGBA16UI :: 0x8d76;
GL_RGB16UI :: 0x8d77;
GL_RGBA8UI :: 0x8d7c;
GL_RGB8UI :: 0x8d7d;
GL_RGBA32I :: 0x8d82;
GL_RGB32I :: 0x8d83;
GL_RGBA16I :: 0x8d88;
GL_RGB16I :: 0x8d89;
GL_RGBA8I :: 0x8d8e;
GL_RGB8I :: 0x8d8f;
GL_RED_INTEGER :: 0x8d94;
GL_GREEN_INTEGER :: 0x8d95;
GL_BLUE_INTEGER :: 0x8d96;
GL_RGB_INTEGER :: 0x8d98;
GL_RGBA_INTEGER :: 0x8d99;
GL_BGR_INTEGER :: 0x8d9a;
GL_BGRA_INTEGER :: 0x8d9b;
GL_SAMPLER_1D_ARRAY :: 0x8dc0;
GL_SAMPLER_2D_ARRAY :: 0x8dc1;
GL_SAMPLER_1D_ARRAY_SHADOW :: 0x8dc3;
GL_SAMPLER_2D_ARRAY_SHADOW :: 0x8dc4;
GL_SAMPLER_CUBE_SHADOW :: 0x8dc5;
GL_UNSIGNED_INT_VEC2 :: 0x8dc6;
GL_UNSIGNED_INT_VEC3 :: 0x8dc7;
GL_UNSIGNED_INT_VEC4 :: 0x8dc8;
GL_INT_SAMPLER_1D :: 0x8dc9;
GL_INT_SAMPLER_2D :: 0x8dca;
GL_INT_SAMPLER_3D :: 0x8dcb;
GL_INT_SAMPLER_CUBE :: 0x8dcc;
GL_INT_SAMPLER_1D_ARRAY :: 0x8dce;
GL_INT_SAMPLER_2D_ARRAY :: 0x8dcf;
GL_UNSIGNED_INT_SAMPLER_1D :: 0x8dd1;
GL_UNSIGNED_INT_SAMPLER_2D :: 0x8dd2;
GL_UNSIGNED_INT_SAMPLER_3D :: 0x8dd3;
GL_UNSIGNED_INT_SAMPLER_CUBE :: 0x8dd4;
GL_UNSIGNED_INT_SAMPLER_1D_ARRAY :: 0x8dd6;
GL_UNSIGNED_INT_SAMPLER_2D_ARRAY :: 0x8dd7;
GL_QUERY_WAIT :: 0x8e13;
GL_QUERY_NO_WAIT :: 0x8e14;
GL_QUERY_BY_REGION_WAIT :: 0x8e15;
GL_QUERY_BY_REGION_NO_WAIT :: 0x8e16;
GL_BUFFER_ACCESS_FLAGS :: 0x911f;
GL_BUFFER_MAP_LENGTH :: 0x9120;
GL_BUFFER_MAP_OFFSET :: 0x9121;
GL_DEPTH_COMPONENT32F :: 0x8cac;
GL_DEPTH32F_STENCIL8 :: 0x8cad;
GL_FLOAT_32_UNSIGNED_INT_24_8_REV :: 0x8dad;
GL_INVALID_FRAMEBUFFER_OPERATION :: 0x0506;
GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING :: 0x8210;
GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE :: 0x8211;
GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE :: 0x8212;
GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE :: 0x8213;
GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE :: 0x8214;
GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE :: 0x8215;
GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE :: 0x8216;
GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE :: 0x8217;
GL_FRAMEBUFFER_DEFAULT :: 0x8218;
GL_FRAMEBUFFER_UNDEFINED :: 0x8219;
GL_DEPTH_STENCIL_ATTACHMENT :: 0x821a;
GL_MAX_RENDERBUFFER_SIZE :: 0x84e8;
GL_DEPTH_STENCIL :: 0x84f9;
GL_UNSIGNED_INT_24_8 :: 0x84fa;
GL_DEPTH24_STENCIL8 :: 0x88f0;
GL_TEXTURE_STENCIL_SIZE :: 0x88f1;
GL_TEXTURE_RED_TYPE :: 0x8c10;
GL_TEXTURE_GREEN_TYPE :: 0x8c11;
GL_TEXTURE_BLUE_TYPE :: 0x8c12;
GL_TEXTURE_ALPHA_TYPE :: 0x8c13;
GL_TEXTURE_DEPTH_TYPE :: 0x8c16;
GL_UNSIGNED_NORMALIZED :: 0x8c17;
GL_FRAMEBUFFER_BINDING :: 0x8ca6;
GL_DRAW_FRAMEBUFFER_BINDING :: 0x8ca6;
GL_RENDERBUFFER_BINDING :: 0x8ca7;
GL_READ_FRAMEBUFFER :: 0x8ca8;
GL_DRAW_FRAMEBUFFER :: 0x8ca9;
GL_READ_FRAMEBUFFER_BINDING :: 0x8caa;
GL_RENDERBUFFER_SAMPLES :: 0x8cab;
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE :: 0x8cd0;
GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME :: 0x8cd1;
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL :: 0x8cd2;
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE :: 0x8cd3;
GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER :: 0x8cd4;
GL_FRAMEBUFFER_COMPLETE :: 0x8cd5;
GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT :: 0x8cd6;
GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT :: 0x8cd7;
GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER :: 0x8cdb;
GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER :: 0x8cdc;
GL_FRAMEBUFFER_UNSUPPORTED :: 0x8cdd;
GL_MAX_COLOR_ATTACHMENTS :: 0x8cdf;
GL_COLOR_ATTACHMENT0 :: 0x8ce0;
GL_COLOR_ATTACHMENT1 :: 0x8ce1;
GL_COLOR_ATTACHMENT2 :: 0x8ce2;
GL_COLOR_ATTACHMENT3 :: 0x8ce3;
GL_COLOR_ATTACHMENT4 :: 0x8ce4;
GL_COLOR_ATTACHMENT5 :: 0x8ce5;
GL_COLOR_ATTACHMENT6 :: 0x8ce6;
GL_COLOR_ATTACHMENT7 :: 0x8ce7;
GL_COLOR_ATTACHMENT8 :: 0x8ce8;
GL_COLOR_ATTACHMENT9 :: 0x8ce9;
GL_COLOR_ATTACHMENT10 :: 0x8cea;
GL_COLOR_ATTACHMENT11 :: 0x8ceb;
GL_COLOR_ATTACHMENT12 :: 0x8cec;
GL_COLOR_ATTACHMENT13 :: 0x8ced;
GL_COLOR_ATTACHMENT14 :: 0x8cee;
GL_COLOR_ATTACHMENT15 :: 0x8cef;
GL_COLOR_ATTACHMENT16 :: 0x8cf0;
GL_COLOR_ATTACHMENT17 :: 0x8cf1;
GL_COLOR_ATTACHMENT18 :: 0x8cf2;
GL_COLOR_ATTACHMENT19 :: 0x8cf3;
GL_COLOR_ATTACHMENT20 :: 0x8cf4;
GL_COLOR_ATTACHMENT21 :: 0x8cf5;
GL_COLOR_ATTACHMENT22 :: 0x8cf6;
GL_COLOR_ATTACHMENT23 :: 0x8cf7;
GL_COLOR_ATTACHMENT24 :: 0x8cf8;
GL_COLOR_ATTACHMENT25 :: 0x8cf9;
GL_COLOR_ATTACHMENT26 :: 0x8cfa;
GL_COLOR_ATTACHMENT27 :: 0x8cfb;
GL_COLOR_ATTACHMENT28 :: 0x8cfc;
GL_COLOR_ATTACHMENT29 :: 0x8cfd;
GL_COLOR_ATTACHMENT30 :: 0x8cfe;
GL_COLOR_ATTACHMENT31 :: 0x8cff;
GL_DEPTH_ATTACHMENT :: 0x8d00;
GL_STENCIL_ATTACHMENT :: 0x8d20;
GL_FRAMEBUFFER :: 0x8d40;
GL_RENDERBUFFER :: 0x8d41;
GL_RENDERBUFFER_WIDTH :: 0x8d42;
GL_RENDERBUFFER_HEIGHT :: 0x8d43;
GL_RENDERBUFFER_INTERNAL_FORMAT :: 0x8d44;
GL_STENCIL_INDEX1 :: 0x8d46;
GL_STENCIL_INDEX4 :: 0x8d47;
GL_STENCIL_INDEX8 :: 0x8d48;
GL_STENCIL_INDEX16 :: 0x8d49;
GL_RENDERBUFFER_RED_SIZE :: 0x8d50;
GL_RENDERBUFFER_GREEN_SIZE :: 0x8d51;
GL_RENDERBUFFER_BLUE_SIZE :: 0x8d52;
GL_RENDERBUFFER_ALPHA_SIZE :: 0x8d53;
GL_RENDERBUFFER_DEPTH_SIZE :: 0x8d54;
GL_RENDERBUFFER_STENCIL_SIZE :: 0x8d55;
GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE :: 0x8d56;
GL_MAX_SAMPLES :: 0x8d57;
GL_FRAMEBUFFER_SRGB :: 0x8db9;
GL_HALF_FLOAT :: 0x140b;
GL_MAP_READ_BIT :: 0x0001;
GL_MAP_WRITE_BIT :: 0x0002;
GL_MAP_INVALIDATE_RANGE_BIT :: 0x0004;
GL_MAP_INVALIDATE_BUFFER_BIT :: 0x0008;
GL_MAP_FLUSH_EXPLICIT_BIT :: 0x0010;
GL_MAP_UNSYNCHRONIZED_BIT :: 0x0020;
GL_COMPRESSED_RED_RGTC1 :: 0x8dbb;
GL_COMPRESSED_SIGNED_RED_RGTC1 :: 0x8dbc;
GL_COMPRESSED_RG_RGTC2 :: 0x8dbd;
GL_COMPRESSED_SIGNED_RG_RGTC2 :: 0x8dbe;
GL_RG :: 0x8227;
GL_RG_INTEGER :: 0x8228;
GL_R8 :: 0x8229;
GL_R16 :: 0x822a;
GL_RG8 :: 0x822b;
GL_RG16 :: 0x822c;
GL_R16F :: 0x822d;
GL_R32F :: 0x822e;
GL_RG16F :: 0x822f;
GL_RG32F :: 0x8230;
GL_R8I :: 0x8231;
GL_R8UI :: 0x8232;
GL_R16I :: 0x8233;
GL_R16UI :: 0x8234;
GL_R32I :: 0x8235;
GL_R32UI :: 0x8236;
GL_RG8I :: 0x8237;
GL_RG8UI :: 0x8238;
GL_RG16I :: 0x8239;
GL_RG16UI :: 0x823a;
GL_RG32I :: 0x823b;
GL_RG32UI :: 0x823c;
GL_VERTEX_ARRAY_BINDING :: 0x85b5;
GL_SAMPLER_2D_RECT :: 0x8b63;
GL_SAMPLER_2D_RECT_SHADOW :: 0x8b64;
GL_SAMPLER_BUFFER :: 0x8dc2;
GL_INT_SAMPLER_2D_RECT :: 0x8dcd;
GL_INT_SAMPLER_BUFFER :: 0x8dd0;
GL_UNSIGNED_INT_SAMPLER_2D_RECT :: 0x8dd5;
GL_UNSIGNED_INT_SAMPLER_BUFFER :: 0x8dd8;
GL_TEXTURE_BUFFER :: 0x8c2a;
GL_MAX_TEXTURE_BUFFER_SIZE :: 0x8c2b;
GL_TEXTURE_BINDING_BUFFER :: 0x8c2c;
GL_TEXTURE_BUFFER_DATA_STORE_BINDING :: 0x8c2d;
GL_TEXTURE_RECTANGLE :: 0x84f5;
GL_TEXTURE_BINDING_RECTANGLE :: 0x84f6;
GL_PROXY_TEXTURE_RECTANGLE :: 0x84f7;
GL_MAX_RECTANGLE_TEXTURE_SIZE :: 0x84f8;
GL_R8_SNORM :: 0x8f94;
GL_RG8_SNORM :: 0x8f95;
GL_RGB8_SNORM :: 0x8f96;
GL_RGBA8_SNORM :: 0x8f97;
GL_R16_SNORM :: 0x8f98;
GL_RG16_SNORM :: 0x8f99;
GL_RGB16_SNORM :: 0x8f9a;
GL_RGBA16_SNORM :: 0x8f9b;
GL_SIGNED_NORMALIZED :: 0x8f9c;
GL_PRIMITIVE_RESTART :: 0x8f9d;
GL_PRIMITIVE_RESTART_INDEX :: 0x8f9e;
GL_COPY_READ_BUFFER :: 0x8f36;
GL_COPY_WRITE_BUFFER :: 0x8f37;
GL_UNIFORM_BUFFER :: 0x8a11;
GL_UNIFORM_BUFFER_BINDING :: 0x8a28;
GL_UNIFORM_BUFFER_START :: 0x8a29;
GL_UNIFORM_BUFFER_SIZE :: 0x8a2a;
GL_MAX_VERTEX_UNIFORM_BLOCKS :: 0x8a2b;
GL_MAX_GEOMETRY_UNIFORM_BLOCKS :: 0x8a2c;
GL_MAX_FRAGMENT_UNIFORM_BLOCKS :: 0x8a2d;
GL_MAX_COMBINED_UNIFORM_BLOCKS :: 0x8a2e;
GL_MAX_UNIFORM_BUFFER_BINDINGS :: 0x8a2f;
GL_MAX_UNIFORM_BLOCK_SIZE :: 0x8a30;
GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS :: 0x8a31;
GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS :: 0x8a32;
GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS :: 0x8a33;
GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT :: 0x8a34;
GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH :: 0x8a35;
GL_ACTIVE_UNIFORM_BLOCKS :: 0x8a36;
GL_UNIFORM_TYPE :: 0x8a37;
GL_UNIFORM_SIZE :: 0x8a38;
GL_UNIFORM_NAME_LENGTH :: 0x8a39;
GL_UNIFORM_BLOCK_INDEX :: 0x8a3a;
GL_UNIFORM_OFFSET :: 0x8a3b;
GL_UNIFORM_ARRAY_STRIDE :: 0x8a3c;
GL_UNIFORM_MATRIX_STRIDE :: 0x8a3d;
GL_UNIFORM_IS_ROW_MAJOR :: 0x8a3e;
GL_UNIFORM_BLOCK_BINDING :: 0x8a3f;
GL_UNIFORM_BLOCK_DATA_SIZE :: 0x8a40;
GL_UNIFORM_BLOCK_NAME_LENGTH :: 0x8a41;
GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS :: 0x8a42;
GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES :: 0x8a43;
GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER :: 0x8a44;
GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER :: 0x8a45;
GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER :: 0x8a46;
GL_INVALID_INDEX :: 0xffffffff;
GL_CONTEXT_CORE_PROFILE_BIT :: 0x00000001;
GL_CONTEXT_COMPATIBILITY_PROFILE_BIT :: 0x00000002;
GL_LINES_ADJACENCY :: 0x000a;
GL_LINE_STRIP_ADJACENCY :: 0x000b;
GL_TRIANGLES_ADJACENCY :: 0x000c;
GL_TRIANGLE_STRIP_ADJACENCY :: 0x000d;
GL_PROGRAM_POINT_SIZE :: 0x8642;
GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS :: 0x8c29;
GL_FRAMEBUFFER_ATTACHMENT_LAYERED :: 0x8da7;
GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS :: 0x8da8;
GL_GEOMETRY_SHADER :: 0x8dd9;
GL_GEOMETRY_VERTICES_OUT :: 0x8916;
GL_GEOMETRY_INPUT_TYPE :: 0x8917;
GL_GEOMETRY_OUTPUT_TYPE :: 0x8918;
GL_MAX_GEOMETRY_UNIFORM_COMPONENTS :: 0x8ddf;
GL_MAX_GEOMETRY_OUTPUT_VERTICES :: 0x8de0;
GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS :: 0x8de1;
GL_MAX_VERTEX_OUTPUT_COMPONENTS :: 0x9122;
GL_MAX_GEOMETRY_INPUT_COMPONENTS :: 0x9123;
GL_MAX_GEOMETRY_OUTPUT_COMPONENTS :: 0x9124;
GL_MAX_FRAGMENT_INPUT_COMPONENTS :: 0x9125;
GL_CONTEXT_PROFILE_MASK :: 0x9126;
GL_DEPTH_CLAMP :: 0x864f;
GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION :: 0x8e4c;
GL_FIRST_VERTEX_CONVENTION :: 0x8e4d;
GL_LAST_VERTEX_CONVENTION :: 0x8e4e;
GL_PROVOKING_VERTEX :: 0x8e4f;
GL_TEXTURE_CUBE_MAP_SEAMLESS :: 0x884f;
GL_MAX_SERVER_WAIT_TIMEOUT :: 0x9111;
GL_OBJECT_TYPE :: 0x9112;
GL_SYNC_CONDITION :: 0x9113;
GL_SYNC_STATUS :: 0x9114;
GL_SYNC_FLAGS :: 0x9115;
GL_SYNC_FENCE :: 0x9116;
GL_SYNC_GPU_COMMANDS_COMPLETE :: 0x9117;
GL_UNSIGNALED :: 0x9118;
GL_SIGNALED :: 0x9119;
GL_ALREADY_SIGNALED :: 0x911a;
GL_TIMEOUT_EXPIRED :: 0x911b;
GL_CONDITION_SATISFIED :: 0x911c;
GL_WAIT_FAILED :: 0x911d;
GL_TIMEOUT_IGNORED :: 0xffffffffffffffff;
GL_SYNC_FLUSH_COMMANDS_BIT :: 0x00000001;
GL_SAMPLE_POSITION :: 0x8e50;
GL_SAMPLE_MASK :: 0x8e51;
GL_SAMPLE_MASK_VALUE :: 0x8e52;
GL_MAX_SAMPLE_MASK_WORDS :: 0x8e59;
GL_TEXTURE_2D_MULTISAMPLE :: 0x9100;
GL_PROXY_TEXTURE_2D_MULTISAMPLE :: 0x9101;
GL_TEXTURE_2D_MULTISAMPLE_ARRAY :: 0x9102;
GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY :: 0x9103;
GL_TEXTURE_BINDING_2D_MULTISAMPLE :: 0x9104;
GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY :: 0x9105;
GL_TEXTURE_SAMPLES :: 0x9106;
GL_TEXTURE_FIXED_SAMPLE_LOCATIONS :: 0x9107;
GL_SAMPLER_2D_MULTISAMPLE :: 0x9108;
GL_INT_SAMPLER_2D_MULTISAMPLE :: 0x9109;
GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE :: 0x910a;
GL_SAMPLER_2D_MULTISAMPLE_ARRAY :: 0x910b;
GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY :: 0x910c;
GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY :: 0x910d;
GL_MAX_COLOR_TEXTURE_SAMPLES :: 0x910e;
GL_MAX_DEPTH_TEXTURE_SAMPLES :: 0x910f;
GL_MAX_INTEGER_SAMPLES :: 0x9110;
GL_VERTEX_ATTRIB_ARRAY_DIVISOR :: 0x88fe;
GL_SRC1_COLOR :: 0x88f9;
GL_ONE_MINUS_SRC1_COLOR :: 0x88fa;
GL_ONE_MINUS_SRC1_ALPHA :: 0x88fb;
GL_MAX_DUAL_SOURCE_DRAW_BUFFERS :: 0x88fc;
GL_ANY_SAMPLES_PASSED :: 0x8c2f;
GL_SAMPLER_BINDING :: 0x8919;
GL_RGB10_A2UI :: 0x906f;
GL_TEXTURE_SWIZZLE_R :: 0x8e42;
GL_TEXTURE_SWIZZLE_G :: 0x8e43;
GL_TEXTURE_SWIZZLE_B :: 0x8e44;
GL_TEXTURE_SWIZZLE_A :: 0x8e45;
GL_TEXTURE_SWIZZLE_RGBA :: 0x8e46;
GL_TIME_ELAPSED :: 0x88bf;
GL_TIMESTAMP :: 0x8e28;
GL_INT_2_10_10_10_REV :: 0x8d9f;
GL_SAMPLE_SHADING :: 0x8c36;
GL_MIN_SAMPLE_SHADING_VALUE :: 0x8c37;
GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET :: 0x8e5e;
GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET :: 0x8e5f;
GL_TEXTURE_CUBE_MAP_ARRAY :: 0x9009;
GL_TEXTURE_BINDING_CUBE_MAP_ARRAY :: 0x900a;
GL_PROXY_TEXTURE_CUBE_MAP_ARRAY :: 0x900b;
GL_SAMPLER_CUBE_MAP_ARRAY :: 0x900c;
GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW :: 0x900d;
GL_INT_SAMPLER_CUBE_MAP_ARRAY :: 0x900e;
GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY :: 0x900f;
GL_DRAW_INDIRECT_BUFFER :: 0x8f3f;
GL_DRAW_INDIRECT_BUFFER_BINDING :: 0x8f43;
GL_GEOMETRY_SHADER_INVOCATIONS :: 0x887f;
GL_MAX_GEOMETRY_SHADER_INVOCATIONS :: 0x8e5a;
GL_MIN_FRAGMENT_INTERPOLATION_OFFSET :: 0x8e5b;
GL_MAX_FRAGMENT_INTERPOLATION_OFFSET :: 0x8e5c;
GL_FRAGMENT_INTERPOLATION_OFFSET_BITS :: 0x8e5d;
GL_MAX_VERTEX_STREAMS :: 0x8e71;
GL_DOUBLE_VEC2 :: 0x8ffc;
GL_DOUBLE_VEC3 :: 0x8ffd;
GL_DOUBLE_VEC4 :: 0x8ffe;
GL_DOUBLE_MAT2 :: 0x8f46;
GL_DOUBLE_MAT3 :: 0x8f47;
GL_DOUBLE_MAT4 :: 0x8f48;
GL_DOUBLE_MAT2x3 :: 0x8f49;
GL_DOUBLE_MAT2x4 :: 0x8f4a;
GL_DOUBLE_MAT3x2 :: 0x8f4b;
GL_DOUBLE_MAT3x4 :: 0x8f4c;
GL_DOUBLE_MAT4x2 :: 0x8f4d;
GL_DOUBLE_MAT4x3 :: 0x8f4e;
GL_ACTIVE_SUBROUTINES :: 0x8de5;
GL_ACTIVE_SUBROUTINE_UNIFORMS :: 0x8de6;
GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS :: 0x8e47;
GL_ACTIVE_SUBROUTINE_MAX_LENGTH :: 0x8e48;
GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH :: 0x8e49;
GL_MAX_SUBROUTINES :: 0x8de7;
GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS :: 0x8de8;
GL_NUM_COMPATIBLE_SUBROUTINES :: 0x8e4a;
GL_COMPATIBLE_SUBROUTINES :: 0x8e4b;
GL_PATCHES :: 0x000e;
GL_PATCH_VERTICES :: 0x8e72;
GL_PATCH_DEFAULT_INNER_LEVEL :: 0x8e73;
GL_PATCH_DEFAULT_OUTER_LEVEL :: 0x8e74;
GL_TESS_CONTROL_OUTPUT_VERTICES :: 0x8e75;
GL_TESS_GEN_MODE :: 0x8e76;
GL_TESS_GEN_SPACING :: 0x8e77;
GL_TESS_GEN_VERTEX_ORDER :: 0x8e78;
GL_TESS_GEN_POINT_MODE :: 0x8e79;
GL_ISOLINES :: 0x8e7a;
GL_QUADS :: 0x0007;
GL_FRACTIONAL_ODD :: 0x8e7b;
GL_FRACTIONAL_EVEN :: 0x8e7c;
GL_MAX_PATCH_VERTICES :: 0x8e7d;
GL_MAX_TESS_GEN_LEVEL :: 0x8e7e;
GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS :: 0x8e7f;
GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS :: 0x8e80;
GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS :: 0x8e81;
GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS :: 0x8e82;
GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS :: 0x8e83;
GL_MAX_TESS_PATCH_COMPONENTS :: 0x8e84;
GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS :: 0x8e85;
GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS :: 0x8e86;
GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS :: 0x8e89;
GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS :: 0x8e8a;
GL_MAX_TESS_CONTROL_INPUT_COMPONENTS :: 0x886c;
GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS :: 0x886d;
GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS :: 0x8e1e;
GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS :: 0x8e1f;
GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER :: 0x84f0;
GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER :: 0x84f1;
GL_TESS_EVALUATION_SHADER :: 0x8e87;
GL_TESS_CONTROL_SHADER :: 0x8e88;
GL_TRANSFORM_FEEDBACK :: 0x8e22;
GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED :: 0x8e23;
GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE :: 0x8e24;
GL_TRANSFORM_FEEDBACK_BINDING :: 0x8e25;
GL_MAX_TRANSFORM_FEEDBACK_BUFFERS :: 0x8e70;
GL_FIXED :: 0x140c;
GL_IMPLEMENTATION_COLOR_READ_TYPE :: 0x8b9a;
GL_IMPLEMENTATION_COLOR_READ_FORMAT :: 0x8b9b;
GL_LOW_FLOAT :: 0x8df0;
GL_MEDIUM_FLOAT :: 0x8df1;
GL_HIGH_FLOAT :: 0x8df2;
GL_LOW_INT :: 0x8df3;
GL_MEDIUM_INT :: 0x8df4;
GL_HIGH_INT :: 0x8df5;
GL_SHADER_COMPILER :: 0x8dfa;
GL_SHADER_BINARY_FORMATS :: 0x8df8;
GL_NUM_SHADER_BINARY_FORMATS :: 0x8df9;
GL_MAX_VERTEX_UNIFORM_VECTORS :: 0x8dfb;
GL_MAX_VARYING_VECTORS :: 0x8dfc;
GL_MAX_FRAGMENT_UNIFORM_VECTORS :: 0x8dfd;
GL_RGB565 :: 0x8d62;
GL_PROGRAM_BINARY_RETRIEVABLE_HINT :: 0x8257;
GL_PROGRAM_BINARY_LENGTH :: 0x8741;
GL_NUM_PROGRAM_BINARY_FORMATS :: 0x87fe;
GL_PROGRAM_BINARY_FORMATS :: 0x87ff;
GL_VERTEX_SHADER_BIT :: 0x00000001;
GL_FRAGMENT_SHADER_BIT :: 0x00000002;
GL_GEOMETRY_SHADER_BIT :: 0x00000004;
GL_TESS_CONTROL_SHADER_BIT :: 0x00000008;
GL_TESS_EVALUATION_SHADER_BIT :: 0x00000010;
GL_ALL_SHADER_BITS :: 0xffffffff;
GL_PROGRAM_SEPARABLE :: 0x8258;
GL_ACTIVE_PROGRAM :: 0x8259;
GL_PROGRAM_PIPELINE_BINDING :: 0x825a;
GL_MAX_VIEWPORTS :: 0x825b;
GL_VIEWPORT_SUBPIXEL_BITS :: 0x825c;
GL_VIEWPORT_BOUNDS_RANGE :: 0x825d;
GL_LAYER_PROVOKING_VERTEX :: 0x825e;
GL_VIEWPORT_INDEX_PROVOKING_VERTEX :: 0x825f;
GL_UNDEFINED_VERTEX :: 0x8260;
GL_COPY_READ_BUFFER_BINDING :: 0x8f36;
GL_COPY_WRITE_BUFFER_BINDING :: 0x8f37;
GL_TRANSFORM_FEEDBACK_ACTIVE :: 0x8e24;
GL_TRANSFORM_FEEDBACK_PAUSED :: 0x8e23;
GL_UNPACK_COMPRESSED_BLOCK_WIDTH :: 0x9127;
GL_UNPACK_COMPRESSED_BLOCK_HEIGHT :: 0x9128;
GL_UNPACK_COMPRESSED_BLOCK_DEPTH :: 0x9129;
GL_UNPACK_COMPRESSED_BLOCK_SIZE :: 0x912a;
GL_PACK_COMPRESSED_BLOCK_WIDTH :: 0x912b;
GL_PACK_COMPRESSED_BLOCK_HEIGHT :: 0x912c;
GL_PACK_COMPRESSED_BLOCK_DEPTH :: 0x912d;
GL_PACK_COMPRESSED_BLOCK_SIZE :: 0x912e;
GL_NUM_SAMPLE_COUNTS :: 0x9380;
GL_MIN_MAP_BUFFER_ALIGNMENT :: 0x90bc;
GL_ATOMIC_COUNTER_BUFFER :: 0x92c0;
GL_ATOMIC_COUNTER_BUFFER_BINDING :: 0x92c1;
GL_ATOMIC_COUNTER_BUFFER_START :: 0x92c2;
GL_ATOMIC_COUNTER_BUFFER_SIZE :: 0x92c3;
GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE :: 0x92c4;
GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS :: 0x92c5;
GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES :: 0x92c6;
GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER :: 0x92c7;
GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER :: 0x92c8;
GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER :: 0x92c9;
GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER :: 0x92ca;
GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER :: 0x92cb;
GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS :: 0x92cc;
GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS :: 0x92cd;
GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS :: 0x92ce;
GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS :: 0x92cf;
GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS :: 0x92d0;
GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS :: 0x92d1;
GL_MAX_VERTEX_ATOMIC_COUNTERS :: 0x92d2;
GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS :: 0x92d3;
GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS :: 0x92d4;
GL_MAX_GEOMETRY_ATOMIC_COUNTERS :: 0x92d5;
GL_MAX_FRAGMENT_ATOMIC_COUNTERS :: 0x92d6;
GL_MAX_COMBINED_ATOMIC_COUNTERS :: 0x92d7;
GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE :: 0x92d8;
GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS :: 0x92dc;
GL_ACTIVE_ATOMIC_COUNTER_BUFFERS :: 0x92d9;
GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX :: 0x92da;
GL_UNSIGNED_INT_ATOMIC_COUNTER :: 0x92db;
GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT :: 0x00000001;
GL_ELEMENT_ARRAY_BARRIER_BIT :: 0x00000002;
GL_UNIFORM_BARRIER_BIT :: 0x00000004;
GL_TEXTURE_FETCH_BARRIER_BIT :: 0x00000008;
GL_SHADER_IMAGE_ACCESS_BARRIER_BIT :: 0x00000020;
GL_COMMAND_BARRIER_BIT :: 0x00000040;
GL_PIXEL_BUFFER_BARRIER_BIT :: 0x00000080;
GL_TEXTURE_UPDATE_BARRIER_BIT :: 0x00000100;
GL_BUFFER_UPDATE_BARRIER_BIT :: 0x00000200;
GL_FRAMEBUFFER_BARRIER_BIT :: 0x00000400;
GL_TRANSFORM_FEEDBACK_BARRIER_BIT :: 0x00000800;
GL_ATOMIC_COUNTER_BARRIER_BIT :: 0x00001000;
GL_ALL_BARRIER_BITS :: 0xffffffff;
GL_MAX_IMAGE_UNITS :: 0x8f38;
GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS :: 0x8f39;
GL_IMAGE_BINDING_NAME :: 0x8f3a;
GL_IMAGE_BINDING_LEVEL :: 0x8f3b;
GL_IMAGE_BINDING_LAYERED :: 0x8f3c;
GL_IMAGE_BINDING_LAYER :: 0x8f3d;
GL_IMAGE_BINDING_ACCESS :: 0x8f3e;
GL_IMAGE_1D :: 0x904c;
GL_IMAGE_2D :: 0x904d;
GL_IMAGE_3D :: 0x904e;
GL_IMAGE_2D_RECT :: 0x904f;
GL_IMAGE_CUBE :: 0x9050;
GL_IMAGE_BUFFER :: 0x9051;
GL_IMAGE_1D_ARRAY :: 0x9052;
GL_IMAGE_2D_ARRAY :: 0x9053;
GL_IMAGE_CUBE_MAP_ARRAY :: 0x9054;
GL_IMAGE_2D_MULTISAMPLE :: 0x9055;
GL_IMAGE_2D_MULTISAMPLE_ARRAY :: 0x9056;
GL_INT_IMAGE_1D :: 0x9057;
GL_INT_IMAGE_2D :: 0x9058;
GL_INT_IMAGE_3D :: 0x9059;
GL_INT_IMAGE_2D_RECT :: 0x905a;
GL_INT_IMAGE_CUBE :: 0x905b;
GL_INT_IMAGE_BUFFER :: 0x905c;
GL_INT_IMAGE_1D_ARRAY :: 0x905d;
GL_INT_IMAGE_2D_ARRAY :: 0x905e;
GL_INT_IMAGE_CUBE_MAP_ARRAY :: 0x905f;
GL_INT_IMAGE_2D_MULTISAMPLE :: 0x9060;
GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY :: 0x9061;
GL_UNSIGNED_INT_IMAGE_1D :: 0x9062;
GL_UNSIGNED_INT_IMAGE_2D :: 0x9063;
GL_UNSIGNED_INT_IMAGE_3D :: 0x9064;
GL_UNSIGNED_INT_IMAGE_2D_RECT :: 0x9065;
GL_UNSIGNED_INT_IMAGE_CUBE :: 0x9066;
GL_UNSIGNED_INT_IMAGE_BUFFER :: 0x9067;
GL_UNSIGNED_INT_IMAGE_1D_ARRAY :: 0x9068;
GL_UNSIGNED_INT_IMAGE_2D_ARRAY :: 0x9069;
GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY :: 0x906a;
GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE :: 0x906b;
GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY :: 0x906c;
GL_MAX_IMAGE_SAMPLES :: 0x906d;
GL_IMAGE_BINDING_FORMAT :: 0x906e;
GL_IMAGE_FORMAT_COMPATIBILITY_TYPE :: 0x90c7;
GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE :: 0x90c8;
GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS :: 0x90c9;
GL_MAX_VERTEX_IMAGE_UNIFORMS :: 0x90ca;
GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS :: 0x90cb;
GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS :: 0x90cc;
GL_MAX_GEOMETRY_IMAGE_UNIFORMS :: 0x90cd;
GL_MAX_FRAGMENT_IMAGE_UNIFORMS :: 0x90ce;
GL_MAX_COMBINED_IMAGE_UNIFORMS :: 0x90cf;
GL_COMPRESSED_RGBA_BPTC_UNORM :: 0x8e8c;
GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM :: 0x8e8d;
GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT :: 0x8e8e;
GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT :: 0x8e8f;
GL_TEXTURE_IMMUTABLE_FORMAT :: 0x912f;
GL_NUM_SHADING_LANGUAGE_VERSIONS :: 0x82e9;
GL_VERTEX_ATTRIB_ARRAY_LONG :: 0x874e;
GL_COMPRESSED_RGB8_ETC2 :: 0x9274;
GL_COMPRESSED_SRGB8_ETC2 :: 0x9275;
GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 :: 0x9276;
GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 :: 0x9277;
GL_COMPRESSED_RGBA8_ETC2_EAC :: 0x9278;
GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC :: 0x9279;
GL_COMPRESSED_R11_EAC :: 0x9270;
GL_COMPRESSED_SIGNED_R11_EAC :: 0x9271;
GL_COMPRESSED_RG11_EAC :: 0x9272;
GL_COMPRESSED_SIGNED_RG11_EAC :: 0x9273;
GL_PRIMITIVE_RESTART_FIXED_INDEX :: 0x8d69;
GL_ANY_SAMPLES_PASSED_CONSERVATIVE :: 0x8d6a;
GL_MAX_ELEMENT_INDEX :: 0x8d6b;
GL_COMPUTE_SHADER :: 0x91b9;
GL_MAX_COMPUTE_UNIFORM_BLOCKS :: 0x91bb;
GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS :: 0x91bc;
GL_MAX_COMPUTE_IMAGE_UNIFORMS :: 0x91bd;
GL_MAX_COMPUTE_SHARED_MEMORY_SIZE :: 0x8262;
GL_MAX_COMPUTE_UNIFORM_COMPONENTS :: 0x8263;
GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS :: 0x8264;
GL_MAX_COMPUTE_ATOMIC_COUNTERS :: 0x8265;
GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS :: 0x8266;
GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS :: 0x90eb;
GL_MAX_COMPUTE_WORK_GROUP_COUNT :: 0x91be;
GL_MAX_COMPUTE_WORK_GROUP_SIZE :: 0x91bf;
GL_COMPUTE_WORK_GROUP_SIZE :: 0x8267;
GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER :: 0x90ec;
GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER :: 0x90ed;
GL_DISPATCH_INDIRECT_BUFFER :: 0x90ee;
GL_DISPATCH_INDIRECT_BUFFER_BINDING :: 0x90ef;
GL_COMPUTE_SHADER_BIT :: 0x00000020;
GL_DEBUG_OUTPUT_SYNCHRONOUS :: 0x8242;
GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH :: 0x8243;
GL_DEBUG_CALLBACK_FUNCTION :: 0x8244;
GL_DEBUG_CALLBACK_USER_PARAM :: 0x8245;
GL_DEBUG_SOURCE_API :: 0x8246;
GL_DEBUG_SOURCE_WINDOW_SYSTEM :: 0x8247;
GL_DEBUG_SOURCE_SHADER_COMPILER :: 0x8248;
GL_DEBUG_SOURCE_THIRD_PARTY :: 0x8249;
GL_DEBUG_SOURCE_APPLICATION :: 0x824a;
GL_DEBUG_SOURCE_OTHER :: 0x824b;
GL_DEBUG_TYPE_ERROR :: 0x824c;
GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR :: 0x824d;
GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR :: 0x824e;
GL_DEBUG_TYPE_PORTABILITY :: 0x824f;
GL_DEBUG_TYPE_PERFORMANCE :: 0x8250;
GL_DEBUG_TYPE_OTHER :: 0x8251;
GL_MAX_DEBUG_MESSAGE_LENGTH :: 0x9143;
GL_MAX_DEBUG_LOGGED_MESSAGES :: 0x9144;
GL_DEBUG_LOGGED_MESSAGES :: 0x9145;
GL_DEBUG_SEVERITY_HIGH :: 0x9146;
GL_DEBUG_SEVERITY_MEDIUM :: 0x9147;
GL_DEBUG_SEVERITY_LOW :: 0x9148;
GL_DEBUG_TYPE_MARKER :: 0x8268;
GL_DEBUG_TYPE_PUSH_GROUP :: 0x8269;
GL_DEBUG_TYPE_POP_GROUP :: 0x826a;
GL_DEBUG_SEVERITY_NOTIFICATION :: 0x826b;
GL_MAX_DEBUG_GROUP_STACK_DEPTH :: 0x826c;
GL_DEBUG_GROUP_STACK_DEPTH :: 0x826d;
GL_BUFFER :: 0x82e0;
GL_SHADER :: 0x82e1;
GL_PROGRAM :: 0x82e2;
GL_VERTEX_ARRAY :: 0x8074;
GL_QUERY :: 0x82e3;
GL_PROGRAM_PIPELINE :: 0x82e4;
GL_SAMPLER :: 0x82e6;
GL_MAX_LABEL_LENGTH :: 0x82e8;
GL_DEBUG_OUTPUT :: 0x92e0;
GL_CONTEXT_FLAG_DEBUG_BIT :: 0x00000002;
GL_MAX_UNIFORM_LOCATIONS :: 0x826e;
GL_FRAMEBUFFER_DEFAULT_WIDTH :: 0x9310;
GL_FRAMEBUFFER_DEFAULT_HEIGHT :: 0x9311;
GL_FRAMEBUFFER_DEFAULT_LAYERS :: 0x9312;
GL_FRAMEBUFFER_DEFAULT_SAMPLES :: 0x9313;
GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS :: 0x9314;
GL_MAX_FRAMEBUFFER_WIDTH :: 0x9315;
GL_MAX_FRAMEBUFFER_HEIGHT :: 0x9316;
GL_MAX_FRAMEBUFFER_LAYERS :: 0x9317;
GL_MAX_FRAMEBUFFER_SAMPLES :: 0x9318;
GL_INTERNALFORMAT_SUPPORTED :: 0x826f;
GL_INTERNALFORMAT_PREFERRED :: 0x8270;
GL_INTERNALFORMAT_RED_SIZE :: 0x8271;
GL_INTERNALFORMAT_GREEN_SIZE :: 0x8272;
GL_INTERNALFORMAT_BLUE_SIZE :: 0x8273;
GL_INTERNALFORMAT_ALPHA_SIZE :: 0x8274;
GL_INTERNALFORMAT_DEPTH_SIZE :: 0x8275;
GL_INTERNALFORMAT_STENCIL_SIZE :: 0x8276;
GL_INTERNALFORMAT_SHARED_SIZE :: 0x8277;
GL_INTERNALFORMAT_RED_TYPE :: 0x8278;
GL_INTERNALFORMAT_GREEN_TYPE :: 0x8279;
GL_INTERNALFORMAT_BLUE_TYPE :: 0x827a;
GL_INTERNALFORMAT_ALPHA_TYPE :: 0x827b;
GL_INTERNALFORMAT_DEPTH_TYPE :: 0x827c;
GL_INTERNALFORMAT_STENCIL_TYPE :: 0x827d;
GL_MAX_WIDTH :: 0x827e;
GL_MAX_HEIGHT :: 0x827f;
GL_MAX_DEPTH :: 0x8280;
GL_MAX_LAYERS :: 0x8281;
GL_MAX_COMBINED_DIMENSIONS :: 0x8282;
GL_COLOR_COMPONENTS :: 0x8283;
GL_DEPTH_COMPONENTS :: 0x8284;
GL_STENCIL_COMPONENTS :: 0x8285;
GL_COLOR_RENDERABLE :: 0x8286;
GL_DEPTH_RENDERABLE :: 0x8287;
GL_STENCIL_RENDERABLE :: 0x8288;
GL_FRAMEBUFFER_RENDERABLE :: 0x8289;
GL_FRAMEBUFFER_RENDERABLE_LAYERED :: 0x828a;
GL_FRAMEBUFFER_BLEND :: 0x828b;
GL_READ_PIXELS :: 0x828c;
GL_READ_PIXELS_FORMAT :: 0x828d;
GL_READ_PIXELS_TYPE :: 0x828e;
GL_TEXTURE_IMAGE_FORMAT :: 0x828f;
GL_TEXTURE_IMAGE_TYPE :: 0x8290;
GL_GET_TEXTURE_IMAGE_FORMAT :: 0x8291;
GL_GET_TEXTURE_IMAGE_TYPE :: 0x8292;
GL_MIPMAP :: 0x8293;
GL_MANUAL_GENERATE_MIPMAP :: 0x8294;
GL_AUTO_GENERATE_MIPMAP :: 0x8295;
GL_COLOR_ENCODING :: 0x8296;
GL_SRGB_READ :: 0x8297;
GL_SRGB_WRITE :: 0x8298;
GL_FILTER :: 0x829a;
GL_VERTEX_TEXTURE :: 0x829b;
GL_TESS_CONTROL_TEXTURE :: 0x829c;
GL_TESS_EVALUATION_TEXTURE :: 0x829d;
GL_GEOMETRY_TEXTURE :: 0x829e;
GL_FRAGMENT_TEXTURE :: 0x829f;
GL_COMPUTE_TEXTURE :: 0x82a0;
GL_TEXTURE_SHADOW :: 0x82a1;
GL_TEXTURE_GATHER :: 0x82a2;
GL_TEXTURE_GATHER_SHADOW :: 0x82a3;
GL_SHADER_IMAGE_LOAD :: 0x82a4;
GL_SHADER_IMAGE_STORE :: 0x82a5;
GL_SHADER_IMAGE_ATOMIC :: 0x82a6;
GL_IMAGE_TEXEL_SIZE :: 0x82a7;
GL_IMAGE_COMPATIBILITY_CLASS :: 0x82a8;
GL_IMAGE_PIXEL_FORMAT :: 0x82a9;
GL_IMAGE_PIXEL_TYPE :: 0x82aa;
GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST :: 0x82ac;
GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST :: 0x82ad;
GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE :: 0x82ae;
GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE :: 0x82af;
GL_TEXTURE_COMPRESSED_BLOCK_WIDTH :: 0x82b1;
GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT :: 0x82b2;
GL_TEXTURE_COMPRESSED_BLOCK_SIZE :: 0x82b3;
GL_CLEAR_BUFFER :: 0x82b4;
GL_TEXTURE_VIEW :: 0x82b5;
GL_VIEW_COMPATIBILITY_CLASS :: 0x82b6;
GL_FULL_SUPPORT :: 0x82b7;
GL_CAVEAT_SUPPORT :: 0x82b8;
GL_IMAGE_CLASS_4_X_32 :: 0x82b9;
GL_IMAGE_CLASS_2_X_32 :: 0x82ba;
GL_IMAGE_CLASS_1_X_32 :: 0x82bb;
GL_IMAGE_CLASS_4_X_16 :: 0x82bc;
GL_IMAGE_CLASS_2_X_16 :: 0x82bd;
GL_IMAGE_CLASS_1_X_16 :: 0x82be;
GL_IMAGE_CLASS_4_X_8 :: 0x82bf;
GL_IMAGE_CLASS_2_X_8 :: 0x82c0;
GL_IMAGE_CLASS_1_X_8 :: 0x82c1;
GL_IMAGE_CLASS_11_11_10 :: 0x82c2;
GL_IMAGE_CLASS_10_10_10_2 :: 0x82c3;
GL_VIEW_CLASS_128_BITS :: 0x82c4;
GL_VIEW_CLASS_96_BITS :: 0x82c5;
GL_VIEW_CLASS_64_BITS :: 0x82c6;
GL_VIEW_CLASS_48_BITS :: 0x82c7;
GL_VIEW_CLASS_32_BITS :: 0x82c8;
GL_VIEW_CLASS_24_BITS :: 0x82c9;
GL_VIEW_CLASS_16_BITS :: 0x82ca;
GL_VIEW_CLASS_8_BITS :: 0x82cb;
GL_VIEW_CLASS_S3TC_DXT1_RGB :: 0x82cc;
GL_VIEW_CLASS_S3TC_DXT1_RGBA :: 0x82cd;
GL_VIEW_CLASS_S3TC_DXT3_RGBA :: 0x82ce;
GL_VIEW_CLASS_S3TC_DXT5_RGBA :: 0x82cf;
GL_VIEW_CLASS_RGTC1_RED :: 0x82d0;
GL_VIEW_CLASS_RGTC2_RG :: 0x82d1;
GL_VIEW_CLASS_BPTC_UNORM :: 0x82d2;
GL_VIEW_CLASS_BPTC_FLOAT :: 0x82d3;
GL_UNIFORM :: 0x92e1;
GL_UNIFORM_BLOCK :: 0x92e2;
GL_PROGRAM_INPUT :: 0x92e3;
GL_PROGRAM_OUTPUT :: 0x92e4;
GL_BUFFER_VARIABLE :: 0x92e5;
GL_SHADER_STORAGE_BLOCK :: 0x92e6;
GL_VERTEX_SUBROUTINE :: 0x92e8;
GL_TESS_CONTROL_SUBROUTINE :: 0x92e9;
GL_TESS_EVALUATION_SUBROUTINE :: 0x92ea;
GL_GEOMETRY_SUBROUTINE :: 0x92eb;
GL_FRAGMENT_SUBROUTINE :: 0x92ec;
GL_COMPUTE_SUBROUTINE :: 0x92ed;
GL_VERTEX_SUBROUTINE_UNIFORM :: 0x92ee;
GL_TESS_CONTROL_SUBROUTINE_UNIFORM :: 0x92ef;
GL_TESS_EVALUATION_SUBROUTINE_UNIFORM :: 0x92f0;
GL_GEOMETRY_SUBROUTINE_UNIFORM :: 0x92f1;
GL_FRAGMENT_SUBROUTINE_UNIFORM :: 0x92f2;
GL_COMPUTE_SUBROUTINE_UNIFORM :: 0x92f3;
GL_TRANSFORM_FEEDBACK_VARYING :: 0x92f4;
GL_ACTIVE_RESOURCES :: 0x92f5;
GL_MAX_NAME_LENGTH :: 0x92f6;
GL_MAX_NUM_ACTIVE_VARIABLES :: 0x92f7;
GL_MAX_NUM_COMPATIBLE_SUBROUTINES :: 0x92f8;
GL_NAME_LENGTH :: 0x92f9;
GL_TYPE :: 0x92fa;
GL_ARRAY_SIZE :: 0x92fb;
GL_OFFSET :: 0x92fc;
GL_BLOCK_INDEX :: 0x92fd;
GL_ARRAY_STRIDE :: 0x92fe;
GL_MATRIX_STRIDE :: 0x92ff;
GL_IS_ROW_MAJOR :: 0x9300;
GL_ATOMIC_COUNTER_BUFFER_INDEX :: 0x9301;
GL_BUFFER_BINDING :: 0x9302;
GL_BUFFER_DATA_SIZE :: 0x9303;
GL_NUM_ACTIVE_VARIABLES :: 0x9304;
GL_ACTIVE_VARIABLES :: 0x9305;
GL_REFERENCED_BY_VERTEX_SHADER :: 0x9306;
GL_REFERENCED_BY_TESS_CONTROL_SHADER :: 0x9307;
GL_REFERENCED_BY_TESS_EVALUATION_SHADER :: 0x9308;
GL_REFERENCED_BY_GEOMETRY_SHADER :: 0x9309;
GL_REFERENCED_BY_FRAGMENT_SHADER :: 0x930a;
GL_REFERENCED_BY_COMPUTE_SHADER :: 0x930b;
GL_TOP_LEVEL_ARRAY_SIZE :: 0x930c;
GL_TOP_LEVEL_ARRAY_STRIDE :: 0x930d;
GL_LOCATION :: 0x930e;
GL_LOCATION_INDEX :: 0x930f;
GL_IS_PER_PATCH :: 0x92e7;
GL_SHADER_STORAGE_BUFFER :: 0x90d2;
GL_SHADER_STORAGE_BUFFER_BINDING :: 0x90d3;
GL_SHADER_STORAGE_BUFFER_START :: 0x90d4;
GL_SHADER_STORAGE_BUFFER_SIZE :: 0x90d5;
GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS :: 0x90d6;
GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS :: 0x90d7;
GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS :: 0x90d8;
GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS :: 0x90d9;
GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS :: 0x90da;
GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS :: 0x90db;
GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS :: 0x90dc;
GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS :: 0x90dd;
GL_MAX_SHADER_STORAGE_BLOCK_SIZE :: 0x90de;
GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT :: 0x90df;
GL_SHADER_STORAGE_BARRIER_BIT :: 0x00002000;
GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES :: 0x8f39;
GL_DEPTH_STENCIL_TEXTURE_MODE :: 0x90ea;
GL_TEXTURE_BUFFER_OFFSET :: 0x919d;
GL_TEXTURE_BUFFER_SIZE :: 0x919e;
GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT :: 0x919f;
GL_TEXTURE_VIEW_MIN_LEVEL :: 0x82db;
GL_TEXTURE_VIEW_NUM_LEVELS :: 0x82dc;
GL_TEXTURE_VIEW_MIN_LAYER :: 0x82dd;
GL_TEXTURE_VIEW_NUM_LAYERS :: 0x82de;
GL_TEXTURE_IMMUTABLE_LEVELS :: 0x82df;
GL_VERTEX_ATTRIB_BINDING :: 0x82d4;
GL_VERTEX_ATTRIB_RELATIVE_OFFSET :: 0x82d5;
GL_VERTEX_BINDING_DIVISOR :: 0x82d6;
GL_VERTEX_BINDING_OFFSET :: 0x82d7;
GL_VERTEX_BINDING_STRIDE :: 0x82d8;
GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET :: 0x82d9;
GL_MAX_VERTEX_ATTRIB_BINDINGS :: 0x82da;
GL_VERTEX_BINDING_BUFFER :: 0x8f4f;
GL_DISPLAY_LIST :: 0x82e7;
GL_STACK_UNDERFLOW :: 0x0504;
GL_STACK_OVERFLOW :: 0x0503;
GL_MAX_VERTEX_ATTRIB_STRIDE :: 0x82e5;
GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED :: 0x8221;
GL_TEXTURE_BUFFER_BINDING :: 0x8c2a;
GL_MAP_PERSISTENT_BIT :: 0x0040;
GL_MAP_COHERENT_BIT :: 0x0080;
GL_DYNAMIC_STORAGE_BIT :: 0x0100;
GL_CLIENT_STORAGE_BIT :: 0x0200;
GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT :: 0x00004000;
GL_BUFFER_IMMUTABLE_STORAGE :: 0x821f;
GL_BUFFER_STORAGE_FLAGS :: 0x8220;
GL_CLEAR_TEXTURE :: 0x9365;
GL_LOCATION_COMPONENT :: 0x934a;
GL_TRANSFORM_FEEDBACK_BUFFER_INDEX :: 0x934b;
GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE :: 0x934c;
GL_QUERY_BUFFER :: 0x9192;
GL_QUERY_BUFFER_BARRIER_BIT :: 0x00008000;
GL_QUERY_BUFFER_BINDING :: 0x9193;
GL_QUERY_RESULT_NO_WAIT :: 0x9194;
GL_MIRROR_CLAMP_TO_EDGE :: 0x8743;
GL_CONTEXT_LOST :: 0x0507;
GL_NEGATIVE_ONE_TO_ONE :: 0x935e;
GL_ZERO_TO_ONE :: 0x935f;
GL_CLIP_ORIGIN :: 0x935c;
GL_CLIP_DEPTH_MODE :: 0x935d;
GL_QUERY_WAIT_INVERTED :: 0x8e17;
GL_QUERY_NO_WAIT_INVERTED :: 0x8e18;
GL_QUERY_BY_REGION_WAIT_INVERTED :: 0x8e19;
GL_QUERY_BY_REGION_NO_WAIT_INVERTED :: 0x8e1a;
GL_MAX_CULL_DISTANCES :: 0x82f9;
GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES :: 0x82fa;
GL_TEXTURE_TARGET :: 0x1006;
GL_QUERY_TARGET :: 0x82ea;
GL_GUILTY_CONTEXT_RESET :: 0x8253;
GL_INNOCENT_CONTEXT_RESET :: 0x8254;
GL_UNKNOWN_CONTEXT_RESET :: 0x8255;
GL_RESET_NOTIFICATION_STRATEGY :: 0x8256;
GL_LOSE_CONTEXT_ON_RESET :: 0x8252;
GL_NO_RESET_NOTIFICATION :: 0x8261;
GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT :: 0x00000004;
GL_COLOR_TABLE :: 0x80d0;
GL_POST_CONVOLUTION_COLOR_TABLE :: 0x80d1;
GL_POST_COLOR_MATRIX_COLOR_TABLE :: 0x80d2;
GL_PROXY_COLOR_TABLE :: 0x80d3;
GL_PROXY_POST_CONVOLUTION_COLOR_TABLE :: 0x80d4;
GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE :: 0x80d5;
GL_CONVOLUTION_1D :: 0x8010;
GL_CONVOLUTION_2D :: 0x8011;
GL_SEPARABLE_2D :: 0x8012;
GL_HISTOGRAM :: 0x8024;
GL_PROXY_HISTOGRAM :: 0x8025;
GL_MINMAX :: 0x802e;
GL_CONTEXT_RELEASE_BEHAVIOR :: 0x82fb;
GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH :: 0x82fc;



// VERSION_1_0
glCullFace:               proc(mode: u32);
glFrontFace:              proc(mode: u32);
glHint:                   proc(target: u32, mode: u32);
glLineWidth:              proc(width: f32);
glPointSize:              proc(size: f32);
glPolygonMode:            proc(face: u32, mode: u32);
glScissor:                proc(x: i32, y: i32, width: i32, height: i32);
glTexParameterf:          proc(target: u32, pname: u32, param: f32);
glTexParameterfv:         proc(target: u32, pname: u32, params: *f32);
glTexParameteri:          proc(target: u32, pname: u32, param: i32);
glTexParameteriv:         proc(target: u32, pname: u32, params: *i32);
glTexImage1D:             proc(target: u32, level: i32, internalformat: i32, width: i32, border: i32, format: u32, type: u32, pixels: *void);
glTexImage2D:             proc(target: u32, level: i32, internalformat: i32, width: i32, height: i32, border: i32, format: u32, type: u32, pixels: *void);
glDrawBuffer:             proc(buf: u32);
glClear:                  proc(mask: u32);
glClearColor:             proc(red: f32, green: f32, blue: f32, alpha: f32);
glClearStencil:           proc(s: i32);
glClearDepth:             proc(depth: f64);
glStencilMask:            proc(mask: u32);
glColorMask:              proc(red: bool, green: bool, blue: bool, alpha: bool);
glDepthMask:              proc(flag: bool);
glDisable:                proc(cap: u32);
glEnable:                 proc(cap: u32);
glFinish:                 proc();
glFlush:                  proc();
glBlendFunc:              proc(sfactor: u32, dfactor: u32);
glLogicOp:                proc(opcode: u32);
glStencilFunc:            proc(func: u32, ref: i32, mask: u32);
glStencilOp:              proc(fail: u32, zfail: u32, zpass: u32);
glDepthFunc:              proc(func: u32);
glPixelStoref:            proc(pname: u32, param: f32);
glPixelStorei:            proc(pname: u32, param: i32);
glReadBuffer:             proc(src: u32);
glReadPixels:             proc(x: i32, y: i32, width: i32, height: i32, format: u32, type: u32, pixels: *void);
glGetBooleanv:            proc(pname: u32, data: *bool);
glGetDoublev:             proc(pname: u32, data: *f64);
glGetError:               proc(): u32;
glGetFloatv:              proc(pname: u32, data: *f32);
glGetIntegerv:            proc(pname: u32, data: *i32);
glGetString:              proc(name: u32): *char;
glGetTexImage:            proc(target: u32,  level: i32, format: u32, type: u32, pixels: *void);
glGetTexParameterfv:      proc(target: u32, pname: u32, params: *f32);
glGetTexParameteriv:      proc(target: u32, pname: u32, params: *i32);
glGetTexLevelParameterfv: proc(target: u32, level: i32, pname: u32, params: *f32);
glGetTexLevelParameteriv: proc(target: u32, level: i32, pname: u32, params: *i32);
glIsEnabled:              proc(cap: u32): bool;
glDepthRange:             proc(near: f64, far: f64);
glViewport:               proc(x: i32, y: i32, width: i32, height: i32);

load_1_0 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glCullFace),               "glCullFace");
    set_proc_address(:**void(&glFrontFace),              "glFrontFace");
    set_proc_address(:**void(&glHint),                   "glHint");
    set_proc_address(:**void(&glLineWidth),              "glLineWidth");
    set_proc_address(:**void(&glPointSize),              "glPointSize");
    set_proc_address(:**void(&glPolygonMode),            "glPolygonMode");
    set_proc_address(:**void(&glScissor),                "glScissor");
    set_proc_address(:**void(&glTexParameterf),          "glTexParameterf");
    set_proc_address(:**void(&glTexParameterfv),         "glTexParameterfv");
    set_proc_address(:**void(&glTexParameteri),          "glTexParameteri");
    set_proc_address(:**void(&glTexParameteriv),         "glTexParameteriv");
    set_proc_address(:**void(&glTexImage1D),             "glTexImage1D");
    set_proc_address(:**void(&glTexImage2D),             "glTexImage2D");
    set_proc_address(:**void(&glDrawBuffer),             "glDrawBuffer");
    set_proc_address(:**void(&glClear),                  "glClear");
    set_proc_address(:**void(&glClearColor),             "glClearColor");
    set_proc_address(:**void(&glClearStencil),           "glClearStencil");
    set_proc_address(:**void(&glClearDepth),             "glClearDepth");
    set_proc_address(:**void(&glStencilMask),            "glStencilMask");
    set_proc_address(:**void(&glColorMask),              "glColorMask");
    set_proc_address(:**void(&glDepthMask),              "glDepthMask");
    set_proc_address(:**void(&glDisable),                "glDisable");
    set_proc_address(:**void(&glEnable),                 "glEnable");
    set_proc_address(:**void(&glFinish),                 "glFinish");
    set_proc_address(:**void(&glFlush),                  "glFlush");
    set_proc_address(:**void(&glBlendFunc),              "glBlendFunc");
    set_proc_address(:**void(&glLogicOp),                "glLogicOp");
    set_proc_address(:**void(&glStencilFunc),            "glStencilFunc");
    set_proc_address(:**void(&glStencilOp),              "glStencilOp");
    set_proc_address(:**void(&glDepthFunc),              "glDepthFunc");
    set_proc_address(:**void(&glPixelStoref),            "glPixelStoref");
    set_proc_address(:**void(&glPixelStorei),            "glPixelStorei");
    set_proc_address(:**void(&glReadBuffer),             "glReadBuffer");
    set_proc_address(:**void(&glReadPixels),             "glReadPixels");
    set_proc_address(:**void(&glGetBooleanv),            "glGetBooleanv");
    set_proc_address(:**void(&glGetDoublev),             "glGetDoublev");
    set_proc_address(:**void(&glGetError),               "glGetError");
    set_proc_address(:**void(&glGetFloatv),              "glGetFloatv");
    set_proc_address(:**void(&glGetIntegerv),            "glGetIntegerv");
    set_proc_address(:**void(&glGetString),              "glGetString");
    set_proc_address(:**void(&glGetTexImage),            "glGetTexImage");
    set_proc_address(:**void(&glGetTexParameterfv),      "glGetTexParameterfv");
    set_proc_address(:**void(&glGetTexParameteriv),      "glGetTexParameteriv");
    set_proc_address(:**void(&glGetTexLevelParameterfv), "glGetTexLevelParameterfv");
    set_proc_address(:**void(&glGetTexLevelParameteriv), "glGetTexLevelParameteriv");
    set_proc_address(:**void(&glIsEnabled),              "glIsEnabled");
    set_proc_address(:**void(&glDepthRange),             "glDepthRange");
    set_proc_address(:**void(&glViewport),               "glViewport");
}


// VERSION_1_1
glDrawArrays:        proc(mode: u32, first: i32, count: i32);
glDrawElements:      proc(mode: u32, count: i32, type: u32, indices: *void);
glPolygonOffset:     proc(factor: f32, units: f32);
glCopyTexImage1D:    proc(target: u32, level: i32, internalformat: u32, x: i32, y: i32, width: i32, border: i32);
glCopyTexImage2D:    proc(target: u32, level: i32, internalformat: u32, x: i32, y: i32, width: i32, height: i32, border: i32);
glCopyTexSubImage1D: proc(target: u32, level: i32, xoffset: i32, x: i32, y: i32, width: i32);
glCopyTexSubImage2D: proc(target: u32, level: i32, xoffset: i32, yoffset: i32, x: i32, y: i32, width: i32, height: i32);
glTexSubImage1D:     proc(target: u32, level: i32, xoffset: i32, width: i32, format: u32, type: u32, pixels: *void);
glTexSubImage2D:     proc(target: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, type: u32, pixels: *void);
glBindTexture:       proc(target: u32, texture: u32);
glDeleteTextures:    proc(n: i32, textures: *u32);
glGenTextures:       proc(n: i32, textures: *u32);
glIsTexture:         proc(texture: u32): bool;

load_1_1 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glDrawArrays),        "glDrawArrays");
    set_proc_address(:**void(&glDrawElements),      "glDrawElements");
    set_proc_address(:**void(&glPolygonOffset),     "glPolygonOffset");
    set_proc_address(:**void(&glCopyTexImage1D),    "glCopyTexImage1D");
    set_proc_address(:**void(&glCopyTexImage2D),    "glCopyTexImage2D");
    set_proc_address(:**void(&glCopyTexSubImage1D), "glCopyTexSubImage1D");
    set_proc_address(:**void(&glCopyTexSubImage2D), "glCopyTexSubImage2D");
    set_proc_address(:**void(&glTexSubImage1D),     "glTexSubImage1D");
    set_proc_address(:**void(&glTexSubImage2D),     "glTexSubImage2D");
    set_proc_address(:**void(&glBindTexture),       "glBindTexture");
    set_proc_address(:**void(&glDeleteTextures),    "glDeleteTextures");
    set_proc_address(:**void(&glGenTextures),       "glGenTextures");
    set_proc_address(:**void(&glIsTexture),         "glIsTexture");
}


// VERSION_1_2
glDrawRangeElements: proc(mode: u32, start: u32, end: u32, count: i32, type: u32, indices: *void);
glTexImage3D:        proc(target: u32, level: i32, internalformat: i32, width: i32, height: i32, depth: i32, border: i32, format: u32, type: u32, data: *void);
glTexSubImage3D:     proc(target: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, pixels: *void);
glCopyTexSubImage3D: proc(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(:**void(&glDrawRangeElements), "glDrawRangeElements");
    set_proc_address(:**void(&glTexImage3D),        "glTexImage3D");
    set_proc_address(:**void(&glTexSubImage3D),     "glTexSubImage3D");
    set_proc_address(:**void(&glCopyTexSubImage3D), "glCopyTexSubImage3D");
}


// VERSION_1_3
glActiveTexture:           proc(texture: u32);
glSampleCoverage:          proc(value: f32, invert: bool);
glCompressedTexImage3D:    proc(target: u32, level: i32, internalformat: u32, width: i32, height: i32, depth: i32, border: i32, imageSize: i32, data: *void);
glCompressedTexImage2D:    proc(target: u32, level: i32, internalformat: u32, width: i32, height: i32, border: i32, imageSize: i32, data: *void);
glCompressedTexImage1D:    proc(target: u32, level: i32, internalformat: u32, width: i32, border: i32, imageSize: i32, data: *void);
glCompressedTexSubImage3D: proc(target: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, imageSize: i32, data: *void);
glCompressedTexSubImage2D: proc(target: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, imageSize: i32, data: *void);
glCompressedTexSubImage1D: proc(target: u32, level: i32, xoffset: i32, width: i32, format: u32, imageSize: i32, data: *void);
glGetCompressedTexImage:   proc(target: u32, level: i32, img: *void);

load_1_3 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glActiveTexture),           "glActiveTexture");
    set_proc_address(:**void(&glSampleCoverage),          "glSampleCoverage");
    set_proc_address(:**void(&glCompressedTexImage3D),    "glCompressedTexImage3D");
    set_proc_address(:**void(&glCompressedTexImage2D),    "glCompressedTexImage2D");
    set_proc_address(:**void(&glCompressedTexImage1D),    "glCompressedTexImage1D");
    set_proc_address(:**void(&glCompressedTexSubImage3D), "glCompressedTexSubImage3D");
    set_proc_address(:**void(&glCompressedTexSubImage2D), "glCompressedTexSubImage2D");
    set_proc_address(:**void(&glCompressedTexSubImage1D), "glCompressedTexSubImage1D");
    set_proc_address(:**void(&glGetCompressedTexImage),   "glGetCompressedTexImage");
}


// VERSION_1_4
glBlendFuncSeparate: proc(sfactorRGB: u32, dfactorRGB: u32, sfactorAlpha: u32, dfactorAlpha: u32);
glMultiDrawArrays:   proc(mode: u32, first: *i32, count: *i32, drawcount: i32);
glMultiDrawElements: proc(mode: u32, count: *i32, type: u32, indices: **void, drawcount: i32);
glPointParameterf:   proc(pname: u32, param: f32);
glPointParameterfv:  proc(pname: u32, params: *f32);
glPointParameteri:   proc(pname: u32, param: i32);
glPointParameteriv:  proc(pname: u32, params: *i32);
glBlendColor:        proc(red: f32, green: f32, blue: f32, alpha: f32);
glBlendEquation:     proc(mode: u32);


load_1_4 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glBlendFuncSeparate), "glBlendFuncSeparate");
    set_proc_address(:**void(&glMultiDrawArrays),   "glMultiDrawArrays");
    set_proc_address(:**void(&glMultiDrawElements), "glMultiDrawElements");
    set_proc_address(:**void(&glPointParameterf),   "glPointParameterf");
    set_proc_address(:**void(&glPointParameterfv),  "glPointParameterfv");
    set_proc_address(:**void(&glPointParameteri),   "glPointParameteri");
    set_proc_address(:**void(&glPointParameteriv),  "glPointParameteriv");
    set_proc_address(:**void(&glBlendColor),        "glBlendColor");
    set_proc_address(:**void(&glBlendEquation),     "glBlendEquation");
}


// VERSION_1_5
glGenQueries:           proc(n: i32, ids: *u32);
glDeleteQueries:        proc(n: i32, ids: *u32);
glIsQuery:              proc(id: u32): bool;
glBeginQuery:           proc(target: u32, id: u32);
glEndQuery:             proc(target: u32);
glGetQueryiv:           proc(target: u32, pname: u32, params: *i32);
glGetQueryObjectiv:     proc(id: u32, pname: u32, params: *i32);
glGetQueryObjectuiv:    proc(id: u32, pname: u32, params: *u32);
glBindBuffer:           proc(target: u32, buffer: u32);
glDeleteBuffers:        proc(n: i32, buffers: *u32);
glGenBuffers:           proc(n: i32, buffers: *u32);
glIsBuffer:             proc(buffer: u32): bool;
glBufferData:           proc(target: u32, size: int, data: *void, usage: u32);
glBufferSubData:        proc(target: u32, offset: int, size: int, data: *void);
glGetBufferSubData:     proc(target: u32, offset: int, size: int, data: *void);
glMapBuffer:            proc(target: u32, access: u32): *void;
glUnmapBuffer:          proc(target: u32): bool;
glGetBufferParameteriv: proc(target: u32, pname: u32, params: *i32);
glGetBufferPointerv:    proc(target: u32, pname: u32, params: **void);

load_1_5 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glGenQueries),           "glGenQueries");
    set_proc_address(:**void(&glDeleteQueries),        "glDeleteQueries");
    set_proc_address(:**void(&glIsQuery),              "glIsQuery");
    set_proc_address(:**void(&glBeginQuery),           "glBeginQuery");
    set_proc_address(:**void(&glEndQuery),             "glEndQuery");
    set_proc_address(:**void(&glGetQueryiv),           "glGetQueryiv");
    set_proc_address(:**void(&glGetQueryObjectiv),     "glGetQueryObjectiv");
    set_proc_address(:**void(&glGetQueryObjectuiv),    "glGetQueryObjectuiv");
    set_proc_address(:**void(&glBindBuffer),           "glBindBuffer");
    set_proc_address(:**void(&glDeleteBuffers),        "glDeleteBuffers");
    set_proc_address(:**void(&glGenBuffers),           "glGenBuffers");
    set_proc_address(:**void(&glIsBuffer),             "glIsBuffer");
    set_proc_address(:**void(&glBufferData),           "glBufferData");
    set_proc_address(:**void(&glBufferSubData),        "glBufferSubData");
    set_proc_address(:**void(&glGetBufferSubData),     "glGetBufferSubData");
    set_proc_address(:**void(&glMapBuffer),            "glMapBuffer");
    set_proc_address(:**void(&glUnmapBuffer),          "glUnmapBuffer");
    set_proc_address(:**void(&glGetBufferParameteriv), "glGetBufferParameteriv");
    set_proc_address(:**void(&glGetBufferPointerv),    "glGetBufferPointerv");
}


// VERSION_2_0
glBlendEquationSeparate:    proc(modeRGB: u32, modeAlpha: u32);
glDrawBuffers:              proc(n: i32, bufs: *u32);
glStencilOpSeparate:        proc(face: u32, sfail: u32, dpfail: u32, dppass: u32);
glStencilFuncSeparate:      proc(face: u32, func: u32, ref: i32, mask: u32);
glStencilMaskSeparate:      proc(face: u32, mask: u32);
glAttachShader:             proc(program: u32, shader: u32);
glBindAttribLocation:       proc(program: u32, index: u32, name: *char);
glCompileShader:            proc(shader: u32);
glCreateProgram:            proc(): u32;
glCreateShader:             proc(type: u32): u32;
glDeleteProgram:            proc(program: u32);
glDeleteShader:             proc(shader: u32);
glDetachShader:             proc(program: u32, shader: u32);
glDisableVertexAttribArray: proc(index: u32);
glEnableVertexAttribArray:  proc(index: u32);
glGetActiveAttrib:          proc(program: u32, index: u32, bufSize: i32, length: *i32, size: *i32, type: *u32, name: *u8);
glGetActiveUniform:         proc(program: u32, index: u32, bufSize: i32, length: *i32, size: *i32, type: *u32, name: *u8);
glGetAttachedShaders:       proc(program: u32, maxCount: i32, count: *i32, shaders: *u32);
glGetAttribLocation:        proc(program: u32, name: *char): i32;
glGetProgramiv:             proc(program: u32, pname: u32, params: *i32);
glGetProgramInfoLog:        proc(program: u32, bufSize: i32, length: *i32, infoLog: *u8);
glGetShaderiv:              proc(shader: u32, pname: u32, params: *i32);
glGetShaderInfoLog:         proc(shader: u32, bufSize: i32, length: *i32, infoLog: *u8);
glGetShaderSource:          proc(shader: u32, bufSize: i32, length: *i32, source: *u8);
glGetUniformLocation:       proc(program: u32, name: *char): i32;
glGetUniformfv:             proc(program: u32, location: i32, params: *f32);
glGetUniformiv:             proc(program: u32, location: i32, params: *i32);
glGetVertexAttribdv:        proc(index: u32, pname: u32, params: *f64);
glGetVertexAttribfv:        proc(index: u32, pname: u32, params: *f32);
glGetVertexAttribiv:        proc(index: u32, pname: u32, params: *i32);
glGetVertexAttribPointerv:  proc(index: u32, pname: u32, pointer: *uintptr);
glIsProgram:                proc(program: u32): bool;
glIsShader:                 proc(shader: u32): bool;
glLinkProgram:              proc(program: u32);
glShaderSource:             proc(shader: u32, count: i32, string: **char, length: *i32);
glUseProgram:               proc(program: u32);
glUniform1f:                proc(location: i32, v0: f32);
glUniform2f:                proc(location: i32, v0: f32, v1: f32);
glUniform3f:                proc(location: i32, v0: f32, v1: f32, v2: f32);
glUniform4f:                proc(location: i32, v0: f32, v1: f32, v2: f32, v3: f32);
glUniform1i:                proc(location: i32, v0: i32);
glUniform2i:                proc(location: i32, v0: i32, v1: i32);
glUniform3i:                proc(location: i32, v0: i32, v1: i32, v2: i32);
glUniform4i:                proc(location: i32, v0: i32, v1: i32, v2: i32, v3: i32);
glUniform1fv:               proc(location: i32, count: i32, value: *f32);
glUniform2fv:               proc(location: i32, count: i32, value: *f32);
glUniform3fv:               proc(location: i32, count: i32, value: *f32);
glUniform4fv:               proc(location: i32, count: i32, value: *f32);
glUniform1iv:               proc(location: i32, count: i32, value: *i32);
glUniform2iv:               proc(location: i32, count: i32, value: *i32);
glUniform3iv:               proc(location: i32, count: i32, value: *i32);
glUniform4iv:               proc(location: i32, count: i32, value: *i32);
glUniformMatrix2fv:         proc(location: i32, count: i32, transpose: bool, value: *f32);
glUniformMatrix3fv:         proc(location: i32, count: i32, transpose: bool, value: *f32);
glUniformMatrix4fv:         proc(location: i32, count: i32, transpose: bool, value: *f32);
glValidateProgram:          proc(program: u32);
glVertexAttrib1d:           proc(index: u32, x: f64);
glVertexAttrib1dv:          proc(index: u32, v: *f64);
glVertexAttrib1f:           proc(index: u32, x: f32);
glVertexAttrib1fv:          proc(index: u32, v: *f32);
glVertexAttrib1s:           proc(index: u32, x: i16);
glVertexAttrib1sv:          proc(index: u32, v: *i16);
glVertexAttrib2d:           proc(index: u32, x: f64, y: f64);
glVertexAttrib2dv:          proc(index: u32, v: *[2]f64);
glVertexAttrib2f:           proc(index: u32, x: f32, y: f32);
glVertexAttrib2fv:          proc(index: u32, v: *[2]f32);
glVertexAttrib2s:           proc(index: u32, x: i16, y: i16);
glVertexAttrib2sv:          proc(index: u32, v: *[2]i16);
glVertexAttrib3d:           proc(index: u32, x: f64, y: f64, z: f64);
glVertexAttrib3dv:          proc(index: u32, v: *[3]f64);
glVertexAttrib3f:           proc(index: u32, x: f32, y: f32, z: f32);
glVertexAttrib3fv:          proc(index: u32, v: *[3]f32);
glVertexAttrib3s:           proc(index: u32, x: i16, y: i16, z: i16);
glVertexAttrib3sv:          proc(index: u32, v: *[3]i16);
glVertexAttrib4Nbv:         proc(index: u32, v: *[4]i8);
glVertexAttrib4Niv:         proc(index: u32, v: *[4]i32);
glVertexAttrib4Nsv:         proc(index: u32, v: *[4]i16);
glVertexAttrib4Nub:         proc(index: u32, x: u8, y: u8, z: u8, w: u8);
glVertexAttrib4Nubv:        proc(index: u32, v: *[4]u8);
glVertexAttrib4Nuiv:        proc(index: u32, v: *[4]u32);
glVertexAttrib4Nusv:        proc(index: u32, v: *[4]u16);
glVertexAttrib4bv:          proc(index: u32, v: *[4]i8);
glVertexAttrib4d:           proc(index: u32, x: f64, y: f64, z: f64, w: f64);
glVertexAttrib4dv:          proc(index: u32, v: *[4]f64);
glVertexAttrib4f:           proc(index: u32, x: f32, y: f32, z: f32, w: f32);
glVertexAttrib4fv:          proc(index: u32, v: *[4]f32);
glVertexAttrib4iv:          proc(index: u32, v: *[4]i32);
glVertexAttrib4s:           proc(index: u32, x: i16, y: i16, z: i16, w: i16);
glVertexAttrib4sv:          proc(index: u32, v: *[4]i16);
glVertexAttrib4ubv:         proc(index: u32, v: *[4]u8);
glVertexAttrib4uiv:         proc(index: u32, v: *[4]u32);
glVertexAttrib4usv:         proc(index: u32, v: *[4]u16);
glVertexAttribPointer:      proc(index: u32, size: i32, type: u32, normalized: bool, stride: i32, pointer: uintptr);

load_2_0 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glBlendEquationSeparate),    "glBlendEquationSeparate");
    set_proc_address(:**void(&glDrawBuffers),              "glDrawBuffers");
    set_proc_address(:**void(&glStencilOpSeparate),        "glStencilOpSeparate");
    set_proc_address(:**void(&glStencilFuncSeparate),      "glStencilFuncSeparate");
    set_proc_address(:**void(&glStencilMaskSeparate),      "glStencilMaskSeparate");
    set_proc_address(:**void(&glAttachShader),             "glAttachShader");
    set_proc_address(:**void(&glBindAttribLocation),       "glBindAttribLocation");
    set_proc_address(:**void(&glCompileShader),            "glCompileShader");
    set_proc_address(:**void(&glCreateProgram),            "glCreateProgram");
    set_proc_address(:**void(&glCreateShader),             "glCreateShader");
    set_proc_address(:**void(&glDeleteProgram),            "glDeleteProgram");
    set_proc_address(:**void(&glDeleteShader),             "glDeleteShader");
    set_proc_address(:**void(&glDetachShader),             "glDetachShader");
    set_proc_address(:**void(&glDisableVertexAttribArray), "glDisableVertexAttribArray");
    set_proc_address(:**void(&glEnableVertexAttribArray),  "glEnableVertexAttribArray");
    set_proc_address(:**void(&glGetActiveAttrib),          "glGetActiveAttrib");
    set_proc_address(:**void(&glGetActiveUniform),         "glGetActiveUniform");
    set_proc_address(:**void(&glGetAttachedShaders),       "glGetAttachedShaders");
    set_proc_address(:**void(&glGetAttribLocation),        "glGetAttribLocation");
    set_proc_address(:**void(&glGetProgramiv),             "glGetProgramiv");
    set_proc_address(:**void(&glGetProgramInfoLog),        "glGetProgramInfoLog");
    set_proc_address(:**void(&glGetShaderiv),              "glGetShaderiv");
    set_proc_address(:**void(&glGetShaderInfoLog),         "glGetShaderInfoLog");
    set_proc_address(:**void(&glGetShaderSource),          "glGetShaderSource");
    set_proc_address(:**void(&glGetUniformLocation),       "glGetUniformLocation");
    set_proc_address(:**void(&glGetUniformfv),             "glGetUniformfv");
    set_proc_address(:**void(&glGetUniformiv),             "glGetUniformiv");
    set_proc_address(:**void(&glGetVertexAttribdv),        "glGetVertexAttribdv");
    set_proc_address(:**void(&glGetVertexAttribfv),        "glGetVertexAttribfv");
    set_proc_address(:**void(&glGetVertexAttribiv),        "glGetVertexAttribiv");
    set_proc_address(:**void(&glGetVertexAttribPointerv),  "glGetVertexAttribPointerv");
    set_proc_address(:**void(&glIsProgram),                "glIsProgram");
    set_proc_address(:**void(&glIsShader),                 "glIsShader");
    set_proc_address(:**void(&glLinkProgram),              "glLinkProgram");
    set_proc_address(:**void(&glShaderSource),             "glShaderSource");
    set_proc_address(:**void(&glUseProgram),               "glUseProgram");
    set_proc_address(:**void(&glUniform1f),                "glUniform1f");
    set_proc_address(:**void(&glUniform2f),                "glUniform2f");
    set_proc_address(:**void(&glUniform3f),                "glUniform3f");
    set_proc_address(:**void(&glUniform4f),                "glUniform4f");
    set_proc_address(:**void(&glUniform1i),                "glUniform1i");
    set_proc_address(:**void(&glUniform2i),                "glUniform2i");
    set_proc_address(:**void(&glUniform3i),                "glUniform3i");
    set_proc_address(:**void(&glUniform4i),                "glUniform4i");
    set_proc_address(:**void(&glUniform1fv),               "glUniform1fv");
    set_proc_address(:**void(&glUniform2fv),               "glUniform2fv");
    set_proc_address(:**void(&glUniform3fv),               "glUniform3fv");
    set_proc_address(:**void(&glUniform4fv),               "glUniform4fv");
    set_proc_address(:**void(&glUniform1iv),               "glUniform1iv");
    set_proc_address(:**void(&glUniform2iv),               "glUniform2iv");
    set_proc_address(:**void(&glUniform3iv),               "glUniform3iv");
    set_proc_address(:**void(&glUniform4iv),               "glUniform4iv");
    set_proc_address(:**void(&glUniformMatrix2fv),         "glUniformMatrix2fv");
    set_proc_address(:**void(&glUniformMatrix3fv),         "glUniformMatrix3fv");
    set_proc_address(:**void(&glUniformMatrix4fv),         "glUniformMatrix4fv");
    set_proc_address(:**void(&glValidateProgram),          "glValidateProgram");
    set_proc_address(:**void(&glVertexAttrib1d),           "glVertexAttrib1d");
    set_proc_address(:**void(&glVertexAttrib1dv),          "glVertexAttrib1dv");
    set_proc_address(:**void(&glVertexAttrib1f),           "glVertexAttrib1f");
    set_proc_address(:**void(&glVertexAttrib1fv),          "glVertexAttrib1fv");
    set_proc_address(:**void(&glVertexAttrib1s),           "glVertexAttrib1s");
    set_proc_address(:**void(&glVertexAttrib1sv),          "glVertexAttrib1sv");
    set_proc_address(:**void(&glVertexAttrib2d),           "glVertexAttrib2d");
    set_proc_address(:**void(&glVertexAttrib2dv),          "glVertexAttrib2dv");
    set_proc_address(:**void(&glVertexAttrib2f),           "glVertexAttrib2f");
    set_proc_address(:**void(&glVertexAttrib2fv),          "glVertexAttrib2fv");
    set_proc_address(:**void(&glVertexAttrib2s),           "glVertexAttrib2s");
    set_proc_address(:**void(&glVertexAttrib2sv),          "glVertexAttrib2sv");
    set_proc_address(:**void(&glVertexAttrib3d),           "glVertexAttrib3d");
    set_proc_address(:**void(&glVertexAttrib3dv),          "glVertexAttrib3dv");
    set_proc_address(:**void(&glVertexAttrib3f),           "glVertexAttrib3f");
    set_proc_address(:**void(&glVertexAttrib3fv),          "glVertexAttrib3fv");
    set_proc_address(:**void(&glVertexAttrib3s),           "glVertexAttrib3s");
    set_proc_address(:**void(&glVertexAttrib3sv),          "glVertexAttrib3sv");
    set_proc_address(:**void(&glVertexAttrib4Nbv),         "glVertexAttrib4Nbv");
    set_proc_address(:**void(&glVertexAttrib4Niv),         "glVertexAttrib4Niv");
    set_proc_address(:**void(&glVertexAttrib4Nsv),         "glVertexAttrib4Nsv");
    set_proc_address(:**void(&glVertexAttrib4Nub),         "glVertexAttrib4Nub");
    set_proc_address(:**void(&glVertexAttrib4Nubv),        "glVertexAttrib4Nubv");
    set_proc_address(:**void(&glVertexAttrib4Nuiv),        "glVertexAttrib4Nuiv");
    set_proc_address(:**void(&glVertexAttrib4Nusv),        "glVertexAttrib4Nusv");
    set_proc_address(:**void(&glVertexAttrib4bv),          "glVertexAttrib4bv");
    set_proc_address(:**void(&glVertexAttrib4d),           "glVertexAttrib4d");
    set_proc_address(:**void(&glVertexAttrib4dv),          "glVertexAttrib4dv");
    set_proc_address(:**void(&glVertexAttrib4f),           "glVertexAttrib4f");
    set_proc_address(:**void(&glVertexAttrib4fv),          "glVertexAttrib4fv");
    set_proc_address(:**void(&glVertexAttrib4iv),          "glVertexAttrib4iv");
    set_proc_address(:**void(&glVertexAttrib4s),           "glVertexAttrib4s");
    set_proc_address(:**void(&glVertexAttrib4sv),          "glVertexAttrib4sv");
    set_proc_address(:**void(&glVertexAttrib4ubv),         "glVertexAttrib4ubv");
    set_proc_address(:**void(&glVertexAttrib4uiv),         "glVertexAttrib4uiv");
    set_proc_address(:**void(&glVertexAttrib4usv),         "glVertexAttrib4usv");
    set_proc_address(:**void(&glVertexAttribPointer),      "glVertexAttribPointer");
}


// VERSION_2_1
glUniformMatrix2x3fv: proc(location: i32, count: i32, transpose: bool, value: *f32);
glUniformMatrix3x2fv: proc(location: i32, count: i32, transpose: bool, value: *f32);
glUniformMatrix2x4fv: proc(location: i32, count: i32, transpose: bool, value: *f32);
glUniformMatrix4x2fv: proc(location: i32, count: i32, transpose: bool, value: *f32);
glUniformMatrix3x4fv: proc(location: i32, count: i32, transpose: bool, value: *f32);
glUniformMatrix4x3fv: proc(location: i32, count: i32, transpose: bool, value: *f32);

load_2_1 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glUniformMatrix2x3fv), "glUniformMatrix2x3fv");
    set_proc_address(:**void(&glUniformMatrix3x2fv), "glUniformMatrix3x2fv");
    set_proc_address(:**void(&glUniformMatrix2x4fv), "glUniformMatrix2x4fv");
    set_proc_address(:**void(&glUniformMatrix4x2fv), "glUniformMatrix4x2fv");
    set_proc_address(:**void(&glUniformMatrix3x4fv), "glUniformMatrix3x4fv");
    set_proc_address(:**void(&glUniformMatrix4x3fv), "glUniformMatrix4x3fv");
}


// VERSION_3_0
glColorMaski:                          proc(index: u32, r: bool, g: bool, b: bool, a: bool);
glGetBooleani_v:                       proc(target: u32, index: u32, data: *bool);
glGetIntegeri_v:                       proc(target: u32, index: u32, data: *i32);
glEnablei:                             proc(target: u32, index: u32);
glDisablei:                            proc(target: u32, index: u32);
glIsEnabledi:                          proc(target: u32, index: u32): bool;
glBeginTransformFeedback:              proc(primitiveMode: u32);
glEndTransformFeedback:                proc();
glBindBufferRange:                     proc(target: u32, index: u32, buffer: u32, offset: int, size: int);
glBindBufferBase:                      proc(target: u32, index: u32, buffer: u32);
glTransformFeedbackVaryings:           proc(program: u32, count: i32, varyings: **char, bufferMode: u32);
glGetTransformFeedbackVarying:         proc(program: u32, index: u32, bufSize: i32, length: *i32, size: *i32, type: *u32, name: *u8);
glClampColor:                          proc(target: u32, clamp: u32);
glBeginConditionalRender:              proc(id: u32, mode: u32);
glEndConditionalRender:                proc();
glVertexAttribIPointer:                proc(index: u32, size: i32, type: u32, stride: i32, pointer: uintptr);
glGetVertexAttribIiv:                  proc(index: u32, pname: u32, params: *i32);
glGetVertexAttribIuiv:                 proc(index: u32, pname: u32, params: *u32);
glVertexAttribI1i:                     proc(index: u32, x: i32);
glVertexAttribI2i:                     proc(index: u32, x: i32, y: i32);
glVertexAttribI3i:                     proc(index: u32, x: i32, y: i32, z: i32);
glVertexAttribI4i:                     proc(index: u32, x: i32, y: i32, z: i32, w: i32);
glVertexAttribI1ui:                    proc(index: u32, x: u32);
glVertexAttribI2ui:                    proc(index: u32, x: u32, y: u32);
glVertexAttribI3ui:                    proc(index: u32, x: u32, y: u32, z: u32);
glVertexAttribI4ui:                    proc(index: u32, x: u32, y: u32, z: u32, w: u32);
glVertexAttribI1iv:                    proc(index: u32, v: *i32);
glVertexAttribI2iv:                    proc(index: u32, v: *i32);
glVertexAttribI3iv:                    proc(index: u32, v: *i32);
glVertexAttribI4iv:                    proc(index: u32, v: *i32);
glVertexAttribI1uiv:                   proc(index: u32, v: *u32);
glVertexAttribI2uiv:                   proc(index: u32, v: *u32);
glVertexAttribI3uiv:                   proc(index: u32, v: *u32);
glVertexAttribI4uiv:                   proc(index: u32, v: *u32);
glVertexAttribI4bv:                    proc(index: u32, v: *i8);
glVertexAttribI4sv:                    proc(index: u32, v: *i16);
glVertexAttribI4ubv:                   proc(index: u32, v: *u8);
glVertexAttribI4usv:                   proc(index: u32, v: *u16);
glGetUniformuiv:                       proc(program: u32, location: i32, params: *u32);
glBindFragDataLocation:                proc(program: u32, color: u32, name: *char);
glGetFragDataLocation:                 proc(program: u32, name: *char): i32;
glUniform1ui:                          proc(location: i32, v0: u32);
glUniform2ui:                          proc(location: i32, v0: u32, v1: u32);
glUniform3ui:                          proc(location: i32, v0: u32, v1: u32, v2: u32);
glUniform4ui:                          proc(location: i32, v0: u32, v1: u32, v2: u32, v3: u32);
glUniform1uiv:                         proc(location: i32, count: i32, value: *u32);
glUniform2uiv:                         proc(location: i32, count: i32, value: *u32);
glUniform3uiv:                         proc(location: i32, count: i32, value: *u32);
glUniform4uiv:                         proc(location: i32, count: i32, value: *u32);
glTexParameterIiv:                     proc(target: u32, pname: u32, params: *i32);
glTexParameterIuiv:                    proc(target: u32, pname: u32, params: *u32);
glGetTexParameterIiv:                  proc(target: u32, pname: u32, params: *i32);
glGetTexParameterIuiv:                 proc(target: u32, pname: u32, params: *u32);
glClearBufferiv:                       proc(buffer: u32, drawbuffer: i32, value: *i32);
glClearBufferuiv:                      proc(buffer: u32, drawbuffer: i32, value: *u32);
glClearBufferfv:                       proc(buffer: u32, drawbuffer: i32, value: *f32);
glClearBufferfi:                       proc(buffer: u32, drawbuffer: i32, depth: f32, stencil: i32): *void;
glGetStringi:                          proc(name: u32, index: u32): *char;
glIsRenderbuffer:                      proc(renderbuffer: u32): bool;
glBindRenderbuffer:                    proc(target: u32, renderbuffer: u32);
glDeleteRenderbuffers:                 proc(n: i32, renderbuffers: *u32);
glGenRenderbuffers:                    proc(n: i32, renderbuffers: *u32);
glRenderbufferStorage:                 proc(target: u32, internalformat: u32, width: i32, height: i32);
glGetRenderbufferParameteriv:          proc(target: u32, pname: u32, params: *i32);
glIsFramebuffer:                       proc(framebuffer: u32): bool;
glBindFramebuffer:                     proc(target: u32, framebuffer: u32);
glDeleteFramebuffers:                  proc(n: i32, framebuffers: *u32);
glGenFramebuffers:                     proc(n: i32, framebuffers: *u32);
glCheckFramebufferStatus:              proc(target: u32): u32;
glFramebufferTexture1D:                proc(target: u32, attachment: u32, textarget: u32, texture: u32, level: i32);
glFramebufferTexture2D:                proc(target: u32, attachment: u32, textarget: u32, texture: u32, level: i32);
glFramebufferTexture3D:                proc(target: u32, attachment: u32, textarget: u32, texture: u32, level: i32, zoffset: i32);
glFramebufferRenderbuffer:             proc(target: u32, attachment: u32, renderbuffertarget: u32, renderbuffer: u32);
glGetFramebufferAttachmentParameteriv: proc(target: u32, attachment: u32, pname: u32, params: *i32);
glGenerateMipmap:                      proc(target: u32);
glBlitFramebuffer:                     proc(srcX0: i32, srcY0: i32, srcX1: i32, srcY1: i32, dstX0: i32, dstY0: i32, dstX1: i32, dstY1: i32, mask: u32, filter: u32);
glRenderbufferStorageMultisample:      proc(target: u32, samples: i32, internalformat: u32, width: i32, height: i32);
glFramebufferTextureLayer:             proc(target: u32, attachment: u32, texture: u32, level: i32, layer: i32);
glMapBufferRange:                      proc(target: u32, offset: int, length: int, access: u32): *void;
glFlushMappedBufferRange:              proc(target: u32, offset: int, length: int);
glBindVertexArray:                     proc(array: u32);
glDeleteVertexArrays:                  proc(n: i32, arrays: *u32);
glGenVertexArrays:                     proc(n: i32, arrays: *u32);
glIsVertexArray:                       proc(array: u32): bool;

load_3_0 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glColorMaski),                          "glColorMaski");
    set_proc_address(:**void(&glGetBooleani_v),                       "glGetBooleani_v");
    set_proc_address(:**void(&glGetIntegeri_v),                       "glGetIntegeri_v");
    set_proc_address(:**void(&glEnablei),                             "glEnablei");
    set_proc_address(:**void(&glDisablei),                            "glDisablei");
    set_proc_address(:**void(&glIsEnabledi),                          "glIsEnabledi");
    set_proc_address(:**void(&glBeginTransformFeedback),              "glBeginTransformFeedback");
    set_proc_address(:**void(&glEndTransformFeedback),                "glEndTransformFeedback");
    set_proc_address(:**void(&glBindBufferRange),                     "glBindBufferRange");
    set_proc_address(:**void(&glBindBufferBase),                      "glBindBufferBase");
    set_proc_address(:**void(&glTransformFeedbackVaryings),           "glTransformFeedbackVaryings");
    set_proc_address(:**void(&glGetTransformFeedbackVarying),         "glGetTransformFeedbackVarying");
    set_proc_address(:**void(&glClampColor),                          "glClampColor");
    set_proc_address(:**void(&glBeginConditionalRender),              "glBeginConditionalRender");
    set_proc_address(:**void(&glEndConditionalRender),                "glEndConditionalRender");
    set_proc_address(:**void(&glVertexAttribIPointer),                "glVertexAttribIPointer");
    set_proc_address(:**void(&glGetVertexAttribIiv),                  "glGetVertexAttribIiv");
    set_proc_address(:**void(&glGetVertexAttribIuiv),                 "glGetVertexAttribIuiv");
    set_proc_address(:**void(&glVertexAttribI1i),                     "glVertexAttribI1i");
    set_proc_address(:**void(&glVertexAttribI2i),                     "glVertexAttribI2i");
    set_proc_address(:**void(&glVertexAttribI3i),                     "glVertexAttribI3i");
    set_proc_address(:**void(&glVertexAttribI4i),                     "glVertexAttribI4i");
    set_proc_address(:**void(&glVertexAttribI1ui),                    "glVertexAttribI1ui");
    set_proc_address(:**void(&glVertexAttribI2ui),                    "glVertexAttribI2ui");
    set_proc_address(:**void(&glVertexAttribI3ui),                    "glVertexAttribI3ui");
    set_proc_address(:**void(&glVertexAttribI4ui),                    "glVertexAttribI4ui");
    set_proc_address(:**void(&glVertexAttribI1iv),                    "glVertexAttribI1iv");
    set_proc_address(:**void(&glVertexAttribI2iv),                    "glVertexAttribI2iv");
    set_proc_address(:**void(&glVertexAttribI3iv),                    "glVertexAttribI3iv");
    set_proc_address(:**void(&glVertexAttribI4iv),                    "glVertexAttribI4iv");
    set_proc_address(:**void(&glVertexAttribI1uiv),                   "glVertexAttribI1uiv");
    set_proc_address(:**void(&glVertexAttribI2uiv),                   "glVertexAttribI2uiv");
    set_proc_address(:**void(&glVertexAttribI3uiv),                   "glVertexAttribI3uiv");
    set_proc_address(:**void(&glVertexAttribI4uiv),                   "glVertexAttribI4uiv");
    set_proc_address(:**void(&glVertexAttribI4bv),                    "glVertexAttribI4bv");
    set_proc_address(:**void(&glVertexAttribI4sv),                    "glVertexAttribI4sv");
    set_proc_address(:**void(&glVertexAttribI4ubv),                   "glVertexAttribI4ubv");
    set_proc_address(:**void(&glVertexAttribI4usv),                   "glVertexAttribI4usv");
    set_proc_address(:**void(&glGetUniformuiv),                       "glGetUniformuiv");
    set_proc_address(:**void(&glBindFragDataLocation),                "glBindFragDataLocation");
    set_proc_address(:**void(&glGetFragDataLocation),                 "glGetFragDataLocation");
    set_proc_address(:**void(&glUniform1ui),                          "glUniform1ui");
    set_proc_address(:**void(&glUniform2ui),                          "glUniform2ui");
    set_proc_address(:**void(&glUniform3ui),                          "glUniform3ui");
    set_proc_address(:**void(&glUniform4ui),                          "glUniform4ui");
    set_proc_address(:**void(&glUniform1uiv),                         "glUniform1uiv");
    set_proc_address(:**void(&glUniform2uiv),                         "glUniform2uiv");
    set_proc_address(:**void(&glUniform3uiv),                         "glUniform3uiv");
    set_proc_address(:**void(&glUniform4uiv),                         "glUniform4uiv");
    set_proc_address(:**void(&glTexParameterIiv),                     "glTexParameterIiv");
    set_proc_address(:**void(&glTexParameterIuiv),                    "glTexParameterIuiv");
    set_proc_address(:**void(&glGetTexParameterIiv),                  "glGetTexParameterIiv");
    set_proc_address(:**void(&glGetTexParameterIuiv),                 "glGetTexParameterIuiv");
    set_proc_address(:**void(&glClearBufferiv),                       "glClearBufferiv");
    set_proc_address(:**void(&glClearBufferuiv),                      "glClearBufferuiv");
    set_proc_address(:**void(&glClearBufferfv),                       "glClearBufferfv");
    set_proc_address(:**void(&glClearBufferfi),                       "glClearBufferfi");
    set_proc_address(:**void(&glGetStringi),                          "glGetStringi");
    set_proc_address(:**void(&glIsRenderbuffer),                      "glIsRenderbuffer");
    set_proc_address(:**void(&glBindRenderbuffer),                    "glBindRenderbuffer");
    set_proc_address(:**void(&glDeleteRenderbuffers),                 "glDeleteRenderbuffers");
    set_proc_address(:**void(&glGenRenderbuffers),                    "glGenRenderbuffers");
    set_proc_address(:**void(&glRenderbufferStorage),                 "glRenderbufferStorage");
    set_proc_address(:**void(&glGetRenderbufferParameteriv),          "glGetRenderbufferParameteriv");
    set_proc_address(:**void(&glIsFramebuffer),                       "glIsFramebuffer");
    set_proc_address(:**void(&glBindFramebuffer),                     "glBindFramebuffer");
    set_proc_address(:**void(&glDeleteFramebuffers),                  "glDeleteFramebuffers");
    set_proc_address(:**void(&glGenFramebuffers),                     "glGenFramebuffers");
    set_proc_address(:**void(&glCheckFramebufferStatus),              "glCheckFramebufferStatus");
    set_proc_address(:**void(&glFramebufferTexture1D),                "glFramebufferTexture1D");
    set_proc_address(:**void(&glFramebufferTexture2D),                "glFramebufferTexture2D");
    set_proc_address(:**void(&glFramebufferTexture3D),                "glFramebufferTexture3D");
    set_proc_address(:**void(&glFramebufferRenderbuffer),             "glFramebufferRenderbuffer");
    set_proc_address(:**void(&glGetFramebufferAttachmentParameteriv), "glGetFramebufferAttachmentParameteriv");
    set_proc_address(:**void(&glGenerateMipmap),                      "glGenerateMipmap");
    set_proc_address(:**void(&glBlitFramebuffer),                     "glBlitFramebuffer");
    set_proc_address(:**void(&glRenderbufferStorageMultisample),      "glRenderbufferStorageMultisample");
    set_proc_address(:**void(&glFramebufferTextureLayer),             "glFramebufferTextureLayer");
    set_proc_address(:**void(&glMapBufferRange),                      "glMapBufferRange");
    set_proc_address(:**void(&glFlushMappedBufferRange),              "glFlushMappedBufferRange");
    set_proc_address(:**void(&glBindVertexArray),                     "glBindVertexArray");
    set_proc_address(:**void(&glDeleteVertexArrays),                  "glDeleteVertexArrays");
    set_proc_address(:**void(&glGenVertexArrays),                     "glGenVertexArrays");
    set_proc_address(:**void(&glIsVertexArray),                       "glIsVertexArray");
}


// VERSION_3_1
glDrawArraysInstanced:       proc(mode: u32, first: i32, count: i32, instancecount: i32);
glDrawElementsInstanced:     proc(mode: u32, count: i32, type: u32, indices: *void, instancecount: i32);
glTexBuffer:                 proc(target: u32, internalformat: u32, buffer: u32);
glPrimitiveRestartIndex:     proc(index: u32);
glCopyBufferSubData:         proc(readTarget: u32, writeTarget: u32, readOffset: int, writeOffset: int, size: int);
glGetUniformIndices:         proc(program: u32, uniformCount: i32, uniformNames: **char, uniformIndices: *u32);
glGetActiveUniformsiv:       proc(program: u32, uniformCount: i32, uniformIndices: *u32, pname: u32, params: *i32);
glGetActiveUniformName:      proc(program: u32, uniformIndex: u32, bufSize: i32, length: *i32, uniformName: *u8);
glGetUniformBlockIndex:      proc(program: u32, uniformBlockName: *char): u32;
glGetActiveUniformBlockiv:   proc(program: u32, uniformBlockIndex: u32, pname: u32, params: *i32);
glGetActiveUniformBlockName: proc(program: u32, uniformBlockIndex: u32, bufSize: i32, length: *i32, uniformBlockName: *u8);
glUniformBlockBinding:       proc(program: u32, uniformBlockIndex: u32, uniformBlockBinding: u32);

load_3_1 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glDrawArraysInstanced),       "glDrawArraysInstanced");
    set_proc_address(:**void(&glDrawElementsInstanced),     "glDrawElementsInstanced");
    set_proc_address(:**void(&glTexBuffer),                 "glTexBuffer");
    set_proc_address(:**void(&glPrimitiveRestartIndex),     "glPrimitiveRestartIndex");
    set_proc_address(:**void(&glCopyBufferSubData),         "glCopyBufferSubData");
    set_proc_address(:**void(&glGetUniformIndices),         "glGetUniformIndices");
    set_proc_address(:**void(&glGetActiveUniformsiv),       "glGetActiveUniformsiv");
    set_proc_address(:**void(&glGetActiveUniformName),      "glGetActiveUniformName");
    set_proc_address(:**void(&glGetUniformBlockIndex),      "glGetUniformBlockIndex");
    set_proc_address(:**void(&glGetActiveUniformBlockiv),   "glGetActiveUniformBlockiv");
    set_proc_address(:**void(&glGetActiveUniformBlockName), "glGetActiveUniformBlockName");
    set_proc_address(:**void(&glUniformBlockBinding),       "glUniformBlockBinding");
}


// VERSION_3_2
glDrawElementsBaseVertex:          proc(mode: u32, count: i32, type: u32, indices: *void, basevertex: i32);
glDrawRangeElementsBaseVertex:     proc(mode: u32, start: u32, end: u32, count: i32, type: u32, indices: *void, basevertex: i32);
glDrawElementsInstancedBaseVertex: proc(mode: u32, count: i32, type: u32, indices: *void, instancecount: i32, basevertex: i32);
glMultiDrawElementsBaseVertex:     proc(mode: u32, count: *i32, type: u32, indices: **void, drawcount: i32, basevertex: *i32);
glProvokingVertex:                 proc(mode: u32);
glFenceSync:                       proc(condition: u32, flags: u32): sync_t;
glIsSync:                          proc(sync: sync_t): bool;
glDeleteSync:                      proc(sync: sync_t);
glClientWaitSync:                  proc(sync: sync_t, flags: u32, timeout: u64): u32;
glWaitSync:                        proc(sync: sync_t, flags: u32, timeout: u64);
glGetInteger64v:                   proc(pname: u32, data: *i64);
glGetSynciv:                       proc(sync: sync_t, pname: u32, bufSize: i32, length: *i32, values: *i32);
glGetInteger64i_v:                 proc(target: u32, index: u32, data: *i64);
glGetBufferParameteri64v:          proc(target: u32, pname: u32, params: *i64);
glFramebufferTexture:              proc(target: u32, attachment: u32, texture: u32, level: i32);
glTexImage2DMultisample:           proc(target: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: bool);
glTexImage3DMultisample:           proc(target: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: bool);
glGetMultisamplefv:                proc(pname: u32, index: u32, val: *f32);
glSampleMaski:                     proc(maskNumber: u32, mask: u32);

load_3_2 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glDrawElementsBaseVertex),          "glDrawElementsBaseVertex");
    set_proc_address(:**void(&glDrawRangeElementsBaseVertex),     "glDrawRangeElementsBaseVertex");
    set_proc_address(:**void(&glDrawElementsInstancedBaseVertex), "glDrawElementsInstancedBaseVertex");
    set_proc_address(:**void(&glMultiDrawElementsBaseVertex),     "glMultiDrawElementsBaseVertex");
    set_proc_address(:**void(&glProvokingVertex),                 "glProvokingVertex");
    set_proc_address(:**void(&glFenceSync),                       "glFenceSync");
    set_proc_address(:**void(&glIsSync),                          "glIsSync");
    set_proc_address(:**void(&glDeleteSync),                      "glDeleteSync");
    set_proc_address(:**void(&glClientWaitSync),                  "glClientWaitSync");
    set_proc_address(:**void(&glWaitSync),                        "glWaitSync");
    set_proc_address(:**void(&glGetInteger64v),                   "glGetInteger64v");
    set_proc_address(:**void(&glGetSynciv),                       "glGetSynciv");
    set_proc_address(:**void(&glGetInteger64i_v),                 "glGetInteger64i_v");
    set_proc_address(:**void(&glGetBufferParameteri64v),          "glGetBufferParameteri64v");
    set_proc_address(:**void(&glFramebufferTexture),              "glFramebufferTexture");
    set_proc_address(:**void(&glTexImage2DMultisample),           "glTexImage2DMultisample");
    set_proc_address(:**void(&glTexImage3DMultisample),           "glTexImage3DMultisample");
    set_proc_address(:**void(&glGetMultisamplefv),                "glGetMultisamplefv");
    set_proc_address(:**void(&glSampleMaski),                     "glSampleMaski");
}


// VERSION_3_3
glBindFragDataLocationIndexed: proc(program: u32, colorNumber: u32, index: u32, name: *char);
glGetFragDataIndex:            proc(program: u32, name: *char): i32;
glGenSamplers:                 proc(count: i32, samplers: *u32);
glDeleteSamplers:              proc(count: i32, samplers: *u32);
glIsSampler:                   proc(sampler: u32): bool;
glBindSampler:                 proc(unit: u32, sampler: u32);
glSamplerParameteri:           proc(sampler: u32, pname: u32, param: i32);
glSamplerParameteriv:          proc(sampler: u32, pname: u32, param: *i32);
glSamplerParameterf:           proc(sampler: u32, pname: u32, param: f32);
glSamplerParameterfv:          proc(sampler: u32, pname: u32, param: *f32);
glSamplerParameterIiv:         proc(sampler: u32, pname: u32, param: *i32);
glSamplerParameterIuiv:        proc(sampler: u32, pname: u32, param: *u32);
glGetSamplerParameteriv:       proc(sampler: u32, pname: u32, params: *i32);
glGetSamplerParameterIiv:      proc(sampler: u32, pname: u32, params: *i32);
glGetSamplerParameterfv:       proc(sampler: u32, pname: u32, params: *f32);
glGetSamplerParameterIuiv:     proc(sampler: u32, pname: u32, params: *u32);
glQueryCounter:                proc(id: u32, target: u32);
glGetQueryObjecti64v:          proc(id: u32, pname: u32, params: *i64);
glGetQueryObjectui64v:         proc(id: u32, pname: u32, params: *u64);
glVertexAttribDivisor:         proc(index: u32, divisor: u32);
glVertexAttribP1ui:            proc(index: u32, type: u32, normalized: bool, value: u32);
glVertexAttribP1uiv:           proc(index: u32, type: u32, normalized: bool, value: *u32);
glVertexAttribP2ui:            proc(index: u32, type: u32, normalized: bool, value: u32);
glVertexAttribP2uiv:           proc(index: u32, type: u32, normalized: bool, value: *u32);
glVertexAttribP3ui:            proc(index: u32, type: u32, normalized: bool, value: u32);
glVertexAttribP3uiv:           proc(index: u32, type: u32, normalized: bool, value: *u32);
glVertexAttribP4ui:            proc(index: u32, type: u32, normalized: bool, value: u32);
glVertexAttribP4uiv:           proc(index: u32, type: u32, normalized: bool, value: *u32);
glVertexP2ui:                  proc(type: u32, value: u32);
glVertexP2uiv:                 proc(type: u32, value: *u32);
glVertexP3ui:                  proc(type: u32, value: u32);
glVertexP3uiv:                 proc(type: u32, value: *u32);
glVertexP4ui:                  proc(type: u32, value: u32);
glVertexP4uiv:                 proc(type: u32, value: *u32);
glTexCoordP1ui:                proc(type: u32, coords: u32);
glTexCoordP1uiv:               proc(type: u32, coords: *u32);
glTexCoordP2ui:                proc(type: u32, coords: u32);
glTexCoordP2uiv:               proc(type: u32, coords: *u32);
glTexCoordP3ui:                proc(type: u32, coords: u32);
glTexCoordP3uiv:               proc(type: u32, coords: *u32);
glTexCoordP4ui:                proc(type: u32, coords: u32);
glTexCoordP4uiv:               proc(type: u32, coords: *u32);
glMultiTexCoordP1ui:           proc(texture: u32, type: u32, coords: u32);
glMultiTexCoordP1uiv:          proc(texture: u32, type: u32, coords: *u32);
glMultiTexCoordP2ui:           proc(texture: u32, type: u32, coords: u32);
glMultiTexCoordP2uiv:          proc(texture: u32, type: u32, coords: *u32);
glMultiTexCoordP3ui:           proc(texture: u32, type: u32, coords: u32);
glMultiTexCoordP3uiv:          proc(texture: u32, type: u32, coords: *u32);
glMultiTexCoordP4ui:           proc(texture: u32, type: u32, coords: u32);
glMultiTexCoordP4uiv:          proc(texture: u32, type: u32, coords: *u32);
glNormalP3ui:                  proc(type: u32, coords: u32);
glNormalP3uiv:                 proc(type: u32, coords: *u32);
glColorP3ui:                   proc(type: u32, color: u32);
glColorP3uiv:                  proc(type: u32, color: *u32);
glColorP4ui:                   proc(type: u32, color: u32);
glColorP4uiv:                  proc(type: u32, color: *u32);
glSecondaryColorP3ui:          proc(type: u32, color: u32);
glSecondaryColorP3uiv:         proc(type: u32, color: *u32);

load_3_3 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glBindFragDataLocationIndexed), "glBindFragDataLocationIndexed");
    set_proc_address(:**void(&glGetFragDataIndex),            "glGetFragDataIndex");
    set_proc_address(:**void(&glGenSamplers),                 "glGenSamplers");
    set_proc_address(:**void(&glDeleteSamplers),              "glDeleteSamplers");
    set_proc_address(:**void(&glIsSampler),                   "glIsSampler");
    set_proc_address(:**void(&glBindSampler),                 "glBindSampler");
    set_proc_address(:**void(&glSamplerParameteri),           "glSamplerParameteri");
    set_proc_address(:**void(&glSamplerParameteriv),          "glSamplerParameteriv");
    set_proc_address(:**void(&glSamplerParameterf),           "glSamplerParameterf");
    set_proc_address(:**void(&glSamplerParameterfv),          "glSamplerParameterfv");
    set_proc_address(:**void(&glSamplerParameterIiv),         "glSamplerParameterIiv");
    set_proc_address(:**void(&glSamplerParameterIuiv),        "glSamplerParameterIuiv");
    set_proc_address(:**void(&glGetSamplerParameteriv),       "glGetSamplerParameteriv");
    set_proc_address(:**void(&glGetSamplerParameterIiv),      "glGetSamplerParameterIiv");
    set_proc_address(:**void(&glGetSamplerParameterfv),       "glGetSamplerParameterfv");
    set_proc_address(:**void(&glGetSamplerParameterIuiv),     "glGetSamplerParameterIuiv");
    set_proc_address(:**void(&glQueryCounter),                "glQueryCounter");
    set_proc_address(:**void(&glGetQueryObjecti64v),          "glGetQueryObjecti64v");
    set_proc_address(:**void(&glGetQueryObjectui64v),         "glGetQueryObjectui64v");
    set_proc_address(:**void(&glVertexAttribDivisor),         "glVertexAttribDivisor");
    set_proc_address(:**void(&glVertexAttribP1ui),            "glVertexAttribP1ui");
    set_proc_address(:**void(&glVertexAttribP1uiv),           "glVertexAttribP1uiv");
    set_proc_address(:**void(&glVertexAttribP2ui),            "glVertexAttribP2ui");
    set_proc_address(:**void(&glVertexAttribP2uiv),           "glVertexAttribP2uiv");
    set_proc_address(:**void(&glVertexAttribP3ui),            "glVertexAttribP3ui");
    set_proc_address(:**void(&glVertexAttribP3uiv),           "glVertexAttribP3uiv");
    set_proc_address(:**void(&glVertexAttribP4ui),            "glVertexAttribP4ui");
    set_proc_address(:**void(&glVertexAttribP4uiv),           "glVertexAttribP4uiv");
    set_proc_address(:**void(&glVertexP2ui),                  "glVertexP2ui");
    set_proc_address(:**void(&glVertexP2uiv),                 "glVertexP2uiv");
    set_proc_address(:**void(&glVertexP3ui),                  "glVertexP3ui");
    set_proc_address(:**void(&glVertexP3uiv),                 "glVertexP3uiv");
    set_proc_address(:**void(&glVertexP4ui),                  "glVertexP4ui");
    set_proc_address(:**void(&glVertexP4uiv),                 "glVertexP4uiv");
    set_proc_address(:**void(&glTexCoordP1ui),                "glTexCoordP1ui");
    set_proc_address(:**void(&glTexCoordP1uiv),               "glTexCoordP1uiv");
    set_proc_address(:**void(&glTexCoordP2ui),                "glTexCoordP2ui");
    set_proc_address(:**void(&glTexCoordP2uiv),               "glTexCoordP2uiv");
    set_proc_address(:**void(&glTexCoordP3ui),                "glTexCoordP3ui");
    set_proc_address(:**void(&glTexCoordP3uiv),               "glTexCoordP3uiv");
    set_proc_address(:**void(&glTexCoordP4ui),                "glTexCoordP4ui");
    set_proc_address(:**void(&glTexCoordP4uiv),               "glTexCoordP4uiv");
    set_proc_address(:**void(&glMultiTexCoordP1ui),           "glMultiTexCoordP1ui");
    set_proc_address(:**void(&glMultiTexCoordP1uiv),          "glMultiTexCoordP1uiv");
    set_proc_address(:**void(&glMultiTexCoordP2ui),           "glMultiTexCoordP2ui");
    set_proc_address(:**void(&glMultiTexCoordP2uiv),          "glMultiTexCoordP2uiv");
    set_proc_address(:**void(&glMultiTexCoordP3ui),           "glMultiTexCoordP3ui");
    set_proc_address(:**void(&glMultiTexCoordP3uiv),          "glMultiTexCoordP3uiv");
    set_proc_address(:**void(&glMultiTexCoordP4ui),           "glMultiTexCoordP4ui");
    set_proc_address(:**void(&glMultiTexCoordP4uiv),          "glMultiTexCoordP4uiv");
    set_proc_address(:**void(&glNormalP3ui),                  "glNormalP3ui");
    set_proc_address(:**void(&glNormalP3uiv),                 "glNormalP3uiv");
    set_proc_address(:**void(&glColorP3ui),                   "glColorP3ui");
    set_proc_address(:**void(&glColorP3uiv),                  "glColorP3uiv");
    set_proc_address(:**void(&glColorP4ui),                   "glColorP4ui");
    set_proc_address(:**void(&glColorP4uiv),                  "glColorP4uiv");
    set_proc_address(:**void(&glSecondaryColorP3ui),          "glSecondaryColorP3ui");
    set_proc_address(:**void(&glSecondaryColorP3uiv),         "glSecondaryColorP3uiv");
}


// VERSION_4_0
DrawArraysIndirectCommand :: struct {
    count:         u32;
    instanceCount: u32;
    first:         u32;
    baseInstance:  u32;
}

DrawElementsIndirectCommand :: struct {
    count:         u32;
    instanceCount: u32;
    firstIndex:    u32;
    baseVertex:    u32;
    baseInstance:  u32;
}

glMinSampleShading:               proc(value: f32);
glBlendEquationi:                 proc(buf: u32, mode: u32);
glBlendEquationSeparatei:         proc(buf: u32, modeRGB: u32, modeAlpha: u32);
glBlendFunci:                     proc(buf: u32, src: u32, dst: u32);
glBlendFuncSeparatei:             proc(buf: u32, srcRGB: u32, dstRGB: u32, srcAlpha: u32, dstAlpha: u32);
glDrawArraysIndirect:             proc(mode: u32, indirect: *DrawArraysIndirectCommand);
glDrawElementsIndirect:           proc(mode: u32, type: u32, indirect: *DrawElementsIndirectCommand);
glUniform1d:                      proc(location: i32, x: f64);
glUniform2d:                      proc(location: i32, x: f64, y: f64);
glUniform3d:                      proc(location: i32, x: f64, y: f64, z: f64);
glUniform4d:                      proc(location: i32, x: f64, y: f64, z: f64, w: f64);
glUniform1dv:                     proc(location: i32, count: i32, value: *f64);
glUniform2dv:                     proc(location: i32, count: i32, value: *f64);
glUniform3dv:                     proc(location: i32, count: i32, value: *f64);
glUniform4dv:                     proc(location: i32, count: i32, value: *f64);
glUniformMatrix2dv:               proc(location: i32, count: i32, transpose: bool, value: *f64);
glUniformMatrix3dv:               proc(location: i32, count: i32, transpose: bool, value: *f64);
glUniformMatrix4dv:               proc(location: i32, count: i32, transpose: bool, value: *f64);
glUniformMatrix2x3dv:             proc(location: i32, count: i32, transpose: bool, value: *f64);
glUniformMatrix2x4dv:             proc(location: i32, count: i32, transpose: bool, value: *f64);
glUniformMatrix3x2dv:             proc(location: i32, count: i32, transpose: bool, value: *f64);
glUniformMatrix3x4dv:             proc(location: i32, count: i32, transpose: bool, value: *f64);
glUniformMatrix4x2dv:             proc(location: i32, count: i32, transpose: bool, value: *f64);
glUniformMatrix4x3dv:             proc(location: i32, count: i32, transpose: bool, value: *f64);
glGetUniformdv:                   proc(program: u32, location: i32, params: *f64);
glGetSubroutineUniformLocation:   proc(program: u32, shadertype: u32, name: *char): i32;
glGetSubroutineIndex:             proc(program: u32, shadertype: u32, name: *char): u32;
glGetActiveSubroutineUniformiv:   proc(program: u32, shadertype: u32, index: u32, pname: u32, values: *i32);
glGetActiveSubroutineUniformName: proc(program: u32, shadertype: u32, index: u32, bufsize: i32, length: *i32, name: *u8);
glGetActiveSubroutineName:        proc(program: u32, shadertype: u32, index: u32, bufsize: i32, length: *i32, name: *u8);
glUniformSubroutinesuiv:          proc(shadertype: u32, count: i32, indices: *u32);
glGetUniformSubroutineuiv:        proc(shadertype: u32, location: i32, params: *u32);
glGetProgramStageiv:              proc(program: u32, shadertype: u32, pname: u32, values: *i32);
glPatchParameteri:                proc(pname: u32, value: i32);
glPatchParameterfv:               proc(pname: u32, values: *f32);
glBindTransformFeedback:          proc(target: u32, id: u32);
glDeleteTransformFeedbacks:       proc(n: i32, ids: *u32);
glGenTransformFeedbacks:          proc(n: i32, ids: *u32);
glIsTransformFeedback:            proc(id: u32): bool;
glPauseTransformFeedback:         proc();
glResumeTransformFeedback:        proc();
glDrawTransformFeedback:          proc(mode: u32, id: u32);
glDrawTransformFeedbackStream:    proc(mode: u32, id: u32, stream: u32);
glBeginQueryIndexed:              proc(target: u32, index: u32, id: u32);
glEndQueryIndexed:                proc(target: u32, index: u32);
glGetQueryIndexediv:              proc(target: u32, index: u32, pname: u32, params: *i32);
glGetTextureHandleARB:            proc(texture: u32): u64;
glGetTextureSamplerHandleARB:     proc(texture: u32, sampler: u32): u64;
glGetImageHandleARB:              proc(texture: u32, level: i32, layered: bool, layer: i32, format: u32): u64;
glMakeTextureHandleResidentARB:   proc(handle: u64);
glMakeImageHandleResidentARB:     proc(handle: u64, access: u32);
glMakeTextureHandleNonResidentARB:proc(handle: u64);
glMakeImageHandleNonResidentARB:  proc(handle: u64);

load_4_0 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glMinSampleShading),               "glMinSampleShading");
    set_proc_address(:**void(&glBlendEquationi),                 "glBlendEquationi");
    set_proc_address(:**void(&glBlendEquationSeparatei),         "glBlendEquationSeparatei");
    set_proc_address(:**void(&glBlendFunci),                     "glBlendFunci");
    set_proc_address(:**void(&glBlendFuncSeparatei),             "glBlendFuncSeparatei");
    set_proc_address(:**void(&glDrawArraysIndirect),             "glDrawArraysIndirect");
    set_proc_address(:**void(&glDrawElementsIndirect),           "glDrawElementsIndirect");
    set_proc_address(:**void(&glUniform1d),                      "glUniform1d");
    set_proc_address(:**void(&glUniform2d),                      "glUniform2d");
    set_proc_address(:**void(&glUniform3d),                      "glUniform3d");
    set_proc_address(:**void(&glUniform4d),                      "glUniform4d");
    set_proc_address(:**void(&glUniform1dv),                     "glUniform1dv");
    set_proc_address(:**void(&glUniform2dv),                     "glUniform2dv");
    set_proc_address(:**void(&glUniform3dv),                     "glUniform3dv");
    set_proc_address(:**void(&glUniform4dv),                     "glUniform4dv");
    set_proc_address(:**void(&glUniformMatrix2dv),               "glUniformMatrix2dv");
    set_proc_address(:**void(&glUniformMatrix3dv),               "glUniformMatrix3dv");
    set_proc_address(:**void(&glUniformMatrix4dv),               "glUniformMatrix4dv");
    set_proc_address(:**void(&glUniformMatrix2x3dv),             "glUniformMatrix2x3dv");
    set_proc_address(:**void(&glUniformMatrix2x4dv),             "glUniformMatrix2x4dv");
    set_proc_address(:**void(&glUniformMatrix3x2dv),             "glUniformMatrix3x2dv");
    set_proc_address(:**void(&glUniformMatrix3x4dv),             "glUniformMatrix3x4dv");
    set_proc_address(:**void(&glUniformMatrix4x2dv),             "glUniformMatrix4x2dv");
    set_proc_address(:**void(&glUniformMatrix4x3dv),             "glUniformMatrix4x3dv");
    set_proc_address(:**void(&glGetUniformdv),                   "glGetUniformdv");
    set_proc_address(:**void(&glGetSubroutineUniformLocation),   "glGetSubroutineUniformLocation");
    set_proc_address(:**void(&glGetSubroutineIndex),             "glGetSubroutineIndex");
    set_proc_address(:**void(&glGetActiveSubroutineUniformiv),   "glGetActiveSubroutineUniformiv");
    set_proc_address(:**void(&glGetActiveSubroutineUniformName), "glGetActiveSubroutineUniformName");
    set_proc_address(:**void(&glGetActiveSubroutineName),        "glGetActiveSubroutineName");
    set_proc_address(:**void(&glUniformSubroutinesuiv),          "glUniformSubroutinesuiv");
    set_proc_address(:**void(&glGetUniformSubroutineuiv),        "glGetUniformSubroutineuiv");
    set_proc_address(:**void(&glGetProgramStageiv),              "glGetProgramStageiv");
    set_proc_address(:**void(&glPatchParameteri),                "glPatchParameteri");
    set_proc_address(:**void(&glPatchParameterfv),               "glPatchParameterfv");
    set_proc_address(:**void(&glBindTransformFeedback),          "glBindTransformFeedback");
    set_proc_address(:**void(&glDeleteTransformFeedbacks),       "glDeleteTransformFeedbacks");
    set_proc_address(:**void(&glGenTransformFeedbacks),          "glGenTransformFeedbacks");
    set_proc_address(:**void(&glIsTransformFeedback),            "glIsTransformFeedback");
    set_proc_address(:**void(&glPauseTransformFeedback),         "glPauseTransformFeedback");
    set_proc_address(:**void(&glResumeTransformFeedback),        "glResumeTransformFeedback");
    set_proc_address(:**void(&glDrawTransformFeedback),          "glDrawTransformFeedback");
    set_proc_address(:**void(&glDrawTransformFeedbackStream),    "glDrawTransformFeedbackStream");
    set_proc_address(:**void(&glBeginQueryIndexed),              "glBeginQueryIndexed");
    set_proc_address(:**void(&glEndQueryIndexed),                "glEndQueryIndexed");
    set_proc_address(:**void(&glGetQueryIndexediv),              "glGetQueryIndexediv");

    // Load ARB (architecture review board, vendor specific) extensions that might be available
    set_proc_address(:**void(&glGetTextureHandleARB), "glGetTextureHandleARB");
    if !glGetTextureHandleARB {
        set_proc_address(:**void(&glGetTextureHandleARB), "glGetTextureHandleNV");
    }

    set_proc_address(:**void(&glGetTextureSamplerHandleARB), "glGetTextureSamplerHandleARB");
    if !glGetTextureSamplerHandleARB {
        set_proc_address(:**void(&glGetTextureSamplerHandleARB), "glGetTextureSamplerHandleNV");
    }

    set_proc_address(:**void(&glGetImageHandleARB), "glGetImageHandleARB");
    if !glGetImageHandleARB {
        set_proc_address(:**void(&glGetImageHandleARB), "glGetImageHandleNV");
    }

    set_proc_address(:**void(&glMakeTextureHandleResidentARB), "glMakeTextureHandleResidentARB");
    if !glMakeTextureHandleResidentARB {
        set_proc_address(:**void(&glMakeTextureHandleResidentARB), "glMakeTextureHandleResidentNV");
    }

    set_proc_address(:**void(&glMakeImageHandleResidentARB), "glMakeImageHandleResidentARB");
    if !glMakeImageHandleResidentARB {
        set_proc_address(:**void(&glMakeImageHandleResidentARB), "glMakeImageHandleResidentNV");
    }

    set_proc_address(:**void(&glMakeTextureHandleNonResidentARB), "glMakeTextureHandleNonResidentARB");
    if !glMakeTextureHandleNonResidentARB {
        set_proc_address(:**void(&glMakeTextureHandleNonResidentARB), "glMakeTextureHandleNonResidentNV");
    }

    set_proc_address(:**void(&glMakeImageHandleNonResidentARB), "glMakeImageHandleNonResidentARB");
    if !glMakeImageHandleNonResidentARB {
        set_proc_address(:**void(&glMakeImageHandleNonResidentARB), "glMakeImageHandleNonResidentNV");
    }
}


// VERSION_4_1
glReleaseShaderCompiler:     proc();
glShaderBinary:              proc(count: i32, shaders: *u32, binaryformat: u32, binary: *void, length: i32);
glGetShaderPrecisionFormat:  proc(shadertype: u32, precisiontype: u32, range: *i32, precision: *i32);
glDepthRangef:               proc(n: f32, f: f32);
glClearDepthf:               proc(d: f32);
glGetProgramBinary:          proc(program: u32, bufSize: i32, length: *i32, binaryFormat: *u32, binary: *void);
glProgramBinary:             proc(program: u32, binaryFormat: u32, binary: *void, length: i32);
glProgramParameteri:         proc(program: u32, pname: u32, value: i32);
glUseProgramStages:          proc(pipeline: u32, stages: u32, program: u32);
glActiveShaderProgram:       proc(pipeline: u32, program: u32);
glCreateShaderProgramv:      proc(type: u32, count: i32, strings: **char): u32;
glBindProgramPipeline:       proc(pipeline: u32);
glDeleteProgramPipelines:    proc(n: i32, pipelines: *u32);
glGenProgramPipelines:       proc(n: i32, pipelines: *u32);
glIsProgramPipeline:         proc(pipeline: u32): bool;
glGetProgramPipelineiv:      proc(pipeline: u32, pname: u32, params: *i32);
glProgramUniform1i:          proc(program: u32, location: i32, v0: i32);
glProgramUniform1iv:         proc(program: u32, location: i32, count: i32, value: *i32);
glProgramUniform1f:          proc(program: u32, location: i32, v0: f32);
glProgramUniform1fv:         proc(program: u32, location: i32, count: i32, value: *f32);
glProgramUniform1d:          proc(program: u32, location: i32, v0: f64);
glProgramUniform1dv:         proc(program: u32, location: i32, count: i32, value: *f64);
glProgramUniform1ui:         proc(program: u32, location: i32, v0: u32);
glProgramUniform1uiv:        proc(program: u32, location: i32, count: i32, value: *u32);
glProgramUniform2i:          proc(program: u32, location: i32, v0: i32, v1: i32);
glProgramUniform2iv:         proc(program: u32, location: i32, count: i32, value: *i32);
glProgramUniform2f:          proc(program: u32, location: i32, v0: f32, v1: f32);
glProgramUniform2fv:         proc(program: u32, location: i32, count: i32, value: *f32);
glProgramUniform2d:          proc(program: u32, location: i32, v0: f64, v1: f64);
glProgramUniform2dv:         proc(program: u32, location: i32, count: i32, value: *f64);
glProgramUniform2ui:         proc(program: u32, location: i32, v0: u32, v1: u32);
glProgramUniform2uiv:        proc(program: u32, location: i32, count: i32, value: *u32);
glProgramUniform3i:          proc(program: u32, location: i32, v0: i32, v1: i32, v2: i32);
glProgramUniform3iv:         proc(program: u32, location: i32, count: i32, value: *i32);
glProgramUniform3f:          proc(program: u32, location: i32, v0: f32, v1: f32, v2: f32);
glProgramUniform3fv:         proc(program: u32, location: i32, count: i32, value: *f32);
glProgramUniform3d:          proc(program: u32, location: i32, v0: f64, v1: f64, v2: f64);
glProgramUniform3dv:         proc(program: u32, location: i32, count: i32, value: *f64);
glProgramUniform3ui:         proc(program: u32, location: i32, v0: u32, v1: u32, v2: u32);
glProgramUniform3uiv:        proc(program: u32, location: i32, count: i32, value: *u32);
glProgramUniform4i:          proc(program: u32, location: i32, v0: i32, v1: i32, v2: i32, v3: i32);
glProgramUniform4iv:         proc(program: u32, location: i32, count: i32, value: *i32);
glProgramUniform4f:          proc(program: u32, location: i32, v0: f32, v1: f32, v2: f32, v3: f32);
glProgramUniform4fv:         proc(program: u32, location: i32, count: i32, value: *f32);
glProgramUniform4d:          proc(program: u32, location: i32, v0: f64, v1: f64, v2: f64, v3: f64);
glProgramUniform4dv:         proc(program: u32, location: i32, count: i32, value: *f64);
glProgramUniform4ui:         proc(program: u32, location: i32, v0: u32, v1: u32, v2: u32, v3: u32);
glProgramUniform4uiv:        proc(program: u32, location: i32, count: i32, value: *u32);
glProgramUniformMatrix2fv:   proc(program: u32, location: i32, count: i32, transpose: bool, value: *f32);
glProgramUniformMatrix3fv:   proc(program: u32, location: i32, count: i32, transpose: bool, value: *f32);
glProgramUniformMatrix4fv:   proc(program: u32, location: i32, count: i32, transpose: bool, value: *f32);
glProgramUniformMatrix2dv:   proc(program: u32, location: i32, count: i32, transpose: bool, value: *f64);
glProgramUniformMatrix3dv:   proc(program: u32, location: i32, count: i32, transpose: bool, value: *f64);
glProgramUniformMatrix4dv:   proc(program: u32, location: i32, count: i32, transpose: bool, value: *f64);
glProgramUniformMatrix2x3fv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f32);
glProgramUniformMatrix3x2fv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f32);
glProgramUniformMatrix2x4fv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f32);
glProgramUniformMatrix4x2fv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f32);
glProgramUniformMatrix3x4fv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f32);
glProgramUniformMatrix4x3fv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f32);
glProgramUniformMatrix2x3dv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f64);
glProgramUniformMatrix3x2dv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f64);
glProgramUniformMatrix2x4dv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f64);
glProgramUniformMatrix4x2dv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f64);
glProgramUniformMatrix3x4dv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f64);
glProgramUniformMatrix4x3dv: proc(program: u32, location: i32, count: i32, transpose: bool, value: *f64);
glValidateProgramPipeline:   proc(pipeline: u32);
glGetProgramPipelineInfoLog: proc(pipeline: u32, bufSize: i32, length: *i32, infoLog: *u8);
glVertexAttribL1d:           proc(index: u32, x: f64);
glVertexAttribL2d:           proc(index: u32, x: f64, y: f64);
glVertexAttribL3d:           proc(index: u32, x: f64, y: f64, z: f64);
glVertexAttribL4d:           proc(index: u32, x: f64, y: f64, z: f64, w: f64);
glVertexAttribL1dv:          proc(index: u32, v: *f64);
glVertexAttribL2dv:          proc(index: u32, v: *[2]f64);
glVertexAttribL3dv:          proc(index: u32, v: *[3]f64);
glVertexAttribL4dv:          proc(index: u32, v: *[4]f64);
glVertexAttribLPointer:      proc(index: u32, size: i32, type: u32, stride: i32, pointer: uintptr);
glGetVertexAttribLdv:        proc(index: u32, pname: u32, params: *f64);
glViewportArrayv:            proc(first: u32, count: i32, v: *f32);
glViewportIndexedf:          proc(index: u32, x: f32, y: f32, w: f32, h: f32);
glViewportIndexedfv:         proc(index: u32, v: *[4]f32);
glScissorArrayv:             proc(first: u32, count: i32, v: *i32);
glScissorIndexed:            proc(index: u32, left: i32, bottom: i32, width: i32, height: i32);
glScissorIndexedv:           proc(index: u32, v: *[4]i32);
glDepthRangeArrayv:          proc(first: u32, count: i32, v: *f64);
glDepthRangeIndexed:         proc(index: u32, n: f64, f: f64);
glGetFloati_v:               proc(target: u32, index: u32, data: *f32);
glGetDoublei_v:              proc(target: u32, index: u32, data: *f64);

load_4_1 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glReleaseShaderCompiler),     "glReleaseShaderCompiler");
    set_proc_address(:**void(&glShaderBinary),              "glShaderBinary");
    set_proc_address(:**void(&glGetShaderPrecisionFormat),  "glGetShaderPrecisionFormat");
    set_proc_address(:**void(&glDepthRangef),               "glDepthRangef");
    set_proc_address(:**void(&glClearDepthf),               "glClearDepthf");
    set_proc_address(:**void(&glGetProgramBinary),          "glGetProgramBinary");
    set_proc_address(:**void(&glProgramBinary),             "glProgramBinary");
    set_proc_address(:**void(&glProgramParameteri),         "glProgramParameteri");
    set_proc_address(:**void(&glUseProgramStages),          "glUseProgramStages");
    set_proc_address(:**void(&glActiveShaderProgram),       "glActiveShaderProgram");
    set_proc_address(:**void(&glCreateShaderProgramv),      "glCreateShaderProgramv");
    set_proc_address(:**void(&glBindProgramPipeline),       "glBindProgramPipeline");
    set_proc_address(:**void(&glDeleteProgramPipelines),    "glDeleteProgramPipelines");
    set_proc_address(:**void(&glGenProgramPipelines),       "glGenProgramPipelines");
    set_proc_address(:**void(&glIsProgramPipeline),         "glIsProgramPipeline");
    set_proc_address(:**void(&glGetProgramPipelineiv),      "glGetProgramPipelineiv");
    set_proc_address(:**void(&glProgramUniform1i),          "glProgramUniform1i");
    set_proc_address(:**void(&glProgramUniform1iv),         "glProgramUniform1iv");
    set_proc_address(:**void(&glProgramUniform1f),          "glProgramUniform1f");
    set_proc_address(:**void(&glProgramUniform1fv),         "glProgramUniform1fv");
    set_proc_address(:**void(&glProgramUniform1d),          "glProgramUniform1d");
    set_proc_address(:**void(&glProgramUniform1dv),         "glProgramUniform1dv");
    set_proc_address(:**void(&glProgramUniform1ui),         "glProgramUniform1ui");
    set_proc_address(:**void(&glProgramUniform1uiv),        "glProgramUniform1uiv");
    set_proc_address(:**void(&glProgramUniform2i),          "glProgramUniform2i");
    set_proc_address(:**void(&glProgramUniform2iv),         "glProgramUniform2iv");
    set_proc_address(:**void(&glProgramUniform2f),          "glProgramUniform2f");
    set_proc_address(:**void(&glProgramUniform2fv),         "glProgramUniform2fv");
    set_proc_address(:**void(&glProgramUniform2d),          "glProgramUniform2d");
    set_proc_address(:**void(&glProgramUniform2dv),         "glProgramUniform2dv");
    set_proc_address(:**void(&glProgramUniform2ui),         "glProgramUniform2ui");
    set_proc_address(:**void(&glProgramUniform2uiv),        "glProgramUniform2uiv");
    set_proc_address(:**void(&glProgramUniform3i),          "glProgramUniform3i");
    set_proc_address(:**void(&glProgramUniform3iv),         "glProgramUniform3iv");
    set_proc_address(:**void(&glProgramUniform3f),          "glProgramUniform3f");
    set_proc_address(:**void(&glProgramUniform3fv),         "glProgramUniform3fv");
    set_proc_address(:**void(&glProgramUniform3d),          "glProgramUniform3d");
    set_proc_address(:**void(&glProgramUniform3dv),         "glProgramUniform3dv");
    set_proc_address(:**void(&glProgramUniform3ui),         "glProgramUniform3ui");
    set_proc_address(:**void(&glProgramUniform3uiv),        "glProgramUniform3uiv");
    set_proc_address(:**void(&glProgramUniform4i),          "glProgramUniform4i");
    set_proc_address(:**void(&glProgramUniform4iv),         "glProgramUniform4iv");
    set_proc_address(:**void(&glProgramUniform4f),          "glProgramUniform4f");
    set_proc_address(:**void(&glProgramUniform4fv),         "glProgramUniform4fv");
    set_proc_address(:**void(&glProgramUniform4d),          "glProgramUniform4d");
    set_proc_address(:**void(&glProgramUniform4dv),         "glProgramUniform4dv");
    set_proc_address(:**void(&glProgramUniform4ui),         "glProgramUniform4ui");
    set_proc_address(:**void(&glProgramUniform4uiv),        "glProgramUniform4uiv");
    set_proc_address(:**void(&glProgramUniformMatrix2fv),   "glProgramUniformMatrix2fv");
    set_proc_address(:**void(&glProgramUniformMatrix3fv),   "glProgramUniformMatrix3fv");
    set_proc_address(:**void(&glProgramUniformMatrix4fv),   "glProgramUniformMatrix4fv");
    set_proc_address(:**void(&glProgramUniformMatrix2dv),   "glProgramUniformMatrix2dv");
    set_proc_address(:**void(&glProgramUniformMatrix3dv),   "glProgramUniformMatrix3dv");
    set_proc_address(:**void(&glProgramUniformMatrix4dv),   "glProgramUniformMatrix4dv");
    set_proc_address(:**void(&glProgramUniformMatrix2x3fv), "glProgramUniformMatrix2x3fv");
    set_proc_address(:**void(&glProgramUniformMatrix3x2fv), "glProgramUniformMatrix3x2fv");
    set_proc_address(:**void(&glProgramUniformMatrix2x4fv), "glProgramUniformMatrix2x4fv");
    set_proc_address(:**void(&glProgramUniformMatrix4x2fv), "glProgramUniformMatrix4x2fv");
    set_proc_address(:**void(&glProgramUniformMatrix3x4fv), "glProgramUniformMatrix3x4fv");
    set_proc_address(:**void(&glProgramUniformMatrix4x3fv), "glProgramUniformMatrix4x3fv");
    set_proc_address(:**void(&glProgramUniformMatrix2x3dv), "glProgramUniformMatrix2x3dv");
    set_proc_address(:**void(&glProgramUniformMatrix3x2dv), "glProgramUniformMatrix3x2dv");
    set_proc_address(:**void(&glProgramUniformMatrix2x4dv), "glProgramUniformMatrix2x4dv");
    set_proc_address(:**void(&glProgramUniformMatrix4x2dv), "glProgramUniformMatrix4x2dv");
    set_proc_address(:**void(&glProgramUniformMatrix3x4dv), "glProgramUniformMatrix3x4dv");
    set_proc_address(:**void(&glProgramUniformMatrix4x3dv), "glProgramUniformMatrix4x3dv");
    set_proc_address(:**void(&glValidateProgramPipeline),   "glValidateProgramPipeline");
    set_proc_address(:**void(&glGetProgramPipelineInfoLog), "glGetProgramPipelineInfoLog");
    set_proc_address(:**void(&glVertexAttribL1d),           "glVertexAttribL1d");
    set_proc_address(:**void(&glVertexAttribL2d),           "glVertexAttribL2d");
    set_proc_address(:**void(&glVertexAttribL3d),           "glVertexAttribL3d");
    set_proc_address(:**void(&glVertexAttribL4d),           "glVertexAttribL4d");
    set_proc_address(:**void(&glVertexAttribL1dv),          "glVertexAttribL1dv");
    set_proc_address(:**void(&glVertexAttribL2dv),          "glVertexAttribL2dv");
    set_proc_address(:**void(&glVertexAttribL3dv),          "glVertexAttribL3dv");
    set_proc_address(:**void(&glVertexAttribL4dv),          "glVertexAttribL4dv");
    set_proc_address(:**void(&glVertexAttribLPointer),      "glVertexAttribLPointer");
    set_proc_address(:**void(&glGetVertexAttribLdv),        "glGetVertexAttribLdv");
    set_proc_address(:**void(&glViewportArrayv),            "glViewportArrayv");
    set_proc_address(:**void(&glViewportIndexedf),          "glViewportIndexedf");
    set_proc_address(:**void(&glViewportIndexedfv),         "glViewportIndexedfv");
    set_proc_address(:**void(&glScissorArrayv),             "glScissorArrayv");
    set_proc_address(:**void(&glScissorIndexed),            "glScissorIndexed");
    set_proc_address(:**void(&glScissorIndexedv),           "glScissorIndexedv");
    set_proc_address(:**void(&glDepthRangeArrayv),          "glDepthRangeArrayv");
    set_proc_address(:**void(&glDepthRangeIndexed),         "glDepthRangeIndexed");
    set_proc_address(:**void(&glGetFloati_v),               "glGetFloati_v");
    set_proc_address(:**void(&glGetDoublei_v),              "glGetDoublei_v");
}


// VERSION_4_2
glDrawArraysInstancedBaseInstance:             proc(mode: u32, first: i32, count: i32, instancecount: i32, baseinstance: u32);
glDrawElementsInstancedBaseInstance:           proc(mode: u32, count: i32, type: u32, indices: *void, instancecount: i32, baseinstance: u32);
glDrawElementsInstancedBaseVertexBaseInstance: proc(mode: u32, count: i32, type: u32, indices: *void, instancecount: i32, basevertex: i32, baseinstance: u32);
glGetInternalformativ:                         proc(target: u32, internalformat: u32, pname: u32, bufSize: i32, params: *i32);
glGetActiveAtomicCounterBufferiv:              proc(program: u32, bufferIndex: u32, pname: u32, params: *i32);
glBindImageTexture:                            proc(unit: u32, texture: u32, level: i32, layered: bool, layer: i32, access: u32, format: u32);
glMemoryBarrier:                               proc(barriers: u32);
glTexStorage1D:                                proc(target: u32, levels: i32, internalformat: u32, width: i32);
glTexStorage2D:                                proc(target: u32, levels: i32, internalformat: u32, width: i32, height: i32);
glTexStorage3D:                                proc(target: u32, levels: i32, internalformat: u32, width: i32, height: i32, depth: i32);
glDrawTransformFeedbackInstanced:              proc(mode: u32, id: u32, instancecount: i32);
glDrawTransformFeedbackStreamInstanced:        proc(mode: u32, id: u32, stream: u32, instancecount: i32);

load_4_2 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glDrawArraysInstancedBaseInstance),             "glDrawArraysInstancedBaseInstance");
    set_proc_address(:**void(&glDrawElementsInstancedBaseInstance),           "glDrawElementsInstancedBaseInstance");
    set_proc_address(:**void(&glDrawElementsInstancedBaseVertexBaseInstance), "glDrawElementsInstancedBaseVertexBaseInstance");
    set_proc_address(:**void(&glGetInternalformativ),                         "glGetInternalformativ");
    set_proc_address(:**void(&glGetActiveAtomicCounterBufferiv),              "glGetActiveAtomicCounterBufferiv");
    set_proc_address(:**void(&glBindImageTexture),                            "glBindImageTexture");
    set_proc_address(:**void(&glMemoryBarrier),                               "glMemoryBarrier");
    set_proc_address(:**void(&glTexStorage1D),                                "glTexStorage1D");
    set_proc_address(:**void(&glTexStorage2D),                                "glTexStorage2D");
    set_proc_address(:**void(&glTexStorage3D),                                "glTexStorage3D");
    set_proc_address(:**void(&glDrawTransformFeedbackInstanced),              "glDrawTransformFeedbackInstanced");
    set_proc_address(:**void(&glDrawTransformFeedbackStreamInstanced),        "glDrawTransformFeedbackStreamInstanced");
}

// VERSION_4_3
DispatchIndirectCommand :: struct {
    num_groups_x: u32;
    num_groups_y: u32;
    num_groups_z: u32;
}

glClearBufferData:                 proc(target: u32, internalformat: u32, format: u32, type: u32, data: *void);
glClearBufferSubData:              proc(target: u32, internalformat: u32, offset: int, size: int, format: u32, type: u32, data: *void);
glDispatchCompute:                 proc(num_groups_x: u32, num_groups_y: u32, num_groups_z: u32);
glDispatchComputeIndirect:         proc(indirect: *DispatchIndirectCommand);
glCopyImageSubData:                proc(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);
glFramebufferParameteri:           proc(target: u32, pname: u32, param: i32);
glGetFramebufferParameteriv:       proc(target: u32, pname: u32, params: *i32);
glGetInternalformati64v:           proc(target: u32, internalformat: u32, pname: u32, bufSize: i32, params: *i64);
glInvalidateTexSubImage:           proc(texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32);
glInvalidateTexImage:              proc(texture: u32, level: i32);
glInvalidateBufferSubData:         proc(buffer: u32, offset: int, length: int);
glInvalidateBufferData:            proc(buffer: u32);
glInvalidateFramebuffer:           proc(target: u32, numAttachments: i32, attachments: *u32);
glInvalidateSubFramebuffer:        proc(target: u32, numAttachments: i32, attachments: *u32, x: i32, y: i32, width: i32, height: i32);
glMultiDrawArraysIndirect:         proc(mode: u32, indirect: *DrawArraysIndirectCommand, drawcount: i32, stride: i32);
glMultiDrawElementsIndirect:       proc(mode: u32, type: u32, indirect: *DrawElementsIndirectCommand, drawcount: i32, stride: i32);
glGetProgramInterfaceiv:           proc(program: u32, programInterface: u32, pname: u32, params: *i32);
glGetProgramResourceIndex:         proc(program: u32, programInterface: u32, name: *char): u32;
glGetProgramResourceName:          proc(program: u32, programInterface: u32, index: u32, bufSize: i32, length: *i32, name: *u8);
glGetProgramResourceiv:            proc(program: u32, programInterface: u32, index: u32, propCount: i32, props: *u32, bufSize: i32, length: *i32, params: *i32);
glGetProgramResourceLocation:      proc(program: u32, programInterface: u32, name: *char): i32;
glGetProgramResourceLocationIndex: proc(program: u32, programInterface: u32, name: *char): i32;
glShaderStorageBlockBinding:       proc(program: u32, storageBlockIndex: u32, storageBlockBinding: u32);
glTexBufferRange:                  proc(target: u32, internalformat: u32, buffer: u32, offset: int, size: int);
glTexStorage2DMultisample:         proc(target: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: bool);
glTexStorage3DMultisample:         proc(target: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: bool);
glTextureView:                     proc(texture: u32, target: u32, origtexture: u32, internalformat: u32, minlevel: u32, numlevels: u32, minlayer: u32, numlayers: u32);
glBindVertexBuffer:                proc(bindingindex: u32, buffer: u32, offset: int, stride: i32);
glVertexAttribFormat:              proc(attribindex: u32, size: i32, type: u32, normalized: bool, relativeoffset: u32);
glVertexAttribIFormat:             proc(attribindex: u32, size: i32, type: u32, relativeoffset: u32);
glVertexAttribLFormat:             proc(attribindex: u32, size: i32, type: u32, relativeoffset: u32);
glVertexAttribBinding:             proc(attribindex: u32, bindingindex: u32);
glVertexBindingDivisor:            proc(bindingindex: u32, divisor: u32);
glDebugMessageControl:             proc(source: u32, type: u32, severity: u32, count: i32, ids: *u32, enabled: bool);
glDebugMessageInsert:              proc(source: u32, type: u32, id: u32, severity: u32, length: i32, message: *char);
glDebugMessageCallback:            proc(callback: debug_proc_t, userParam: *void);
glGetDebugMessageLog:              proc(count: u32, bufSize: i32, sources: *u32, types: *u32, ids: *u32, severities: *u32, lengths: *i32, messageLog: *u8): u32;
glPushDebugGroup:                  proc(source: u32, id: u32, length: i32, message: *char);
glPopDebugGroup:                   proc();
glObjectLabel:                     proc(identifier: u32, name: u32, length: i32, label: *char);
glGetObjectLabel:                  proc(identifier: u32, name: u32, bufSize: i32, length: *i32, label: *u8);
glObjectPtrLabel:                  proc(ptr: *void, length: i32, label: *char);
glGetObjectPtrLabel:               proc(ptr: *void, bufSize: i32, length: *i32, label: *u8);

load_4_3 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glClearBufferData),                 "glClearBufferData");
    set_proc_address(:**void(&glClearBufferSubData),              "glClearBufferSubData");
    set_proc_address(:**void(&glDispatchCompute),                 "glDispatchCompute");
    set_proc_address(:**void(&glDispatchComputeIndirect),         "glDispatchComputeIndirect");
    set_proc_address(:**void(&glCopyImageSubData),                "glCopyImageSubData");
    set_proc_address(:**void(&glFramebufferParameteri),           "glFramebufferParameteri");
    set_proc_address(:**void(&glGetFramebufferParameteriv),       "glGetFramebufferParameteriv");
    set_proc_address(:**void(&glGetInternalformati64v),           "glGetInternalformati64v");
    set_proc_address(:**void(&glInvalidateTexSubImage),           "glInvalidateTexSubImage");
    set_proc_address(:**void(&glInvalidateTexImage),              "glInvalidateTexImage");
    set_proc_address(:**void(&glInvalidateBufferSubData),         "glInvalidateBufferSubData");
    set_proc_address(:**void(&glInvalidateBufferData),            "glInvalidateBufferData");
    set_proc_address(:**void(&glInvalidateFramebuffer),           "glInvalidateFramebuffer");
    set_proc_address(:**void(&glInvalidateSubFramebuffer),        "glInvalidateSubFramebuffer");
    set_proc_address(:**void(&glMultiDrawArraysIndirect),         "glMultiDrawArraysIndirect");
    set_proc_address(:**void(&glMultiDrawElementsIndirect),       "glMultiDrawElementsIndirect");
    set_proc_address(:**void(&glGetProgramInterfaceiv),           "glGetProgramInterfaceiv");
    set_proc_address(:**void(&glGetProgramResourceIndex),         "glGetProgramResourceIndex");
    set_proc_address(:**void(&glGetProgramResourceName),          "glGetProgramResourceName");
    set_proc_address(:**void(&glGetProgramResourceiv),            "glGetProgramResourceiv");
    set_proc_address(:**void(&glGetProgramResourceLocation),      "glGetProgramResourceLocation");
    set_proc_address(:**void(&glGetProgramResourceLocationIndex), "glGetProgramResourceLocationIndex");
    set_proc_address(:**void(&glShaderStorageBlockBinding),       "glShaderStorageBlockBinding");
    set_proc_address(:**void(&glTexBufferRange),                  "glTexBufferRange");
    set_proc_address(:**void(&glTexStorage2DMultisample),         "glTexStorage2DMultisample");
    set_proc_address(:**void(&glTexStorage3DMultisample),         "glTexStorage3DMultisample");
    set_proc_address(:**void(&glTextureView),                     "glTextureView");
    set_proc_address(:**void(&glBindVertexBuffer),                "glBindVertexBuffer");
    set_proc_address(:**void(&glVertexAttribFormat),              "glVertexAttribFormat");
    set_proc_address(:**void(&glVertexAttribIFormat),             "glVertexAttribIFormat");
    set_proc_address(:**void(&glVertexAttribLFormat),             "glVertexAttribLFormat");
    set_proc_address(:**void(&glVertexAttribBinding),             "glVertexAttribBinding");
    set_proc_address(:**void(&glVertexBindingDivisor),            "glVertexBindingDivisor");
    set_proc_address(:**void(&glDebugMessageControl),             "glDebugMessageControl");
    set_proc_address(:**void(&glDebugMessageInsert),              "glDebugMessageInsert");
    set_proc_address(:**void(&glDebugMessageCallback),            "glDebugMessageCallback");
    set_proc_address(:**void(&glGetDebugMessageLog),              "glGetDebugMessageLog");
    set_proc_address(:**void(&glPushDebugGroup),                  "glPushDebugGroup");
    set_proc_address(:**void(&glPopDebugGroup),                   "glPopDebugGroup");
    set_proc_address(:**void(&glObjectLabel),                     "glObjectLabel");
    set_proc_address(:**void(&glGetObjectLabel),                  "glGetObjectLabel");
    set_proc_address(:**void(&glObjectPtrLabel),                  "glObjectPtrLabel");
    set_proc_address(:**void(&glGetObjectPtrLabel),               "glGetObjectPtrLabel");
}

// VERSION_4_4
glBufferStorage:     proc(target: u32, size: int, data: *void, flags: u32);
glClearTexImage:     proc(texture: u32, level: i32, format: u32, type: u32, data: *void);
glClearTexSubImage:  proc(texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, data: *void);
glBindBuffersBase:   proc(target: u32, first: u32, count: i32, buffers: *u32);
glBindBuffersRange:  proc(target: u32, first: u32, count: i32, buffers: *u32, offsets: *uintptr, sizes: *int);
glBindTextures:      proc(first: u32, count: i32, textures: *u32);
glBindSamplers:      proc(first: u32, count: i32, samplers: *u32);
glBindImageTextures: proc(first: u32, count: i32, textures: *u32);
glBindVertexBuffers: proc(first: u32, count: i32, buffers: *u32, offsets: *uintptr, strides: *i32);

load_4_4 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glBufferStorage),     "glBufferStorage");
    set_proc_address(:**void(&glClearTexImage),     "glClearTexImage");
    set_proc_address(:**void(&glClearTexSubImage),  "glClearTexSubImage");
    set_proc_address(:**void(&glBindBuffersBase),   "glBindBuffersBase");
    set_proc_address(:**void(&glBindBuffersRange),  "glBindBuffersRange");
    set_proc_address(:**void(&glBindTextures),      "glBindTextures");
    set_proc_address(:**void(&glBindSamplers),      "glBindSamplers");
    set_proc_address(:**void(&glBindImageTextures), "glBindImageTextures");
    set_proc_address(:**void(&glBindVertexBuffers), "glBindVertexBuffers");
}

// VERSION_4_5
glClipControl:                              proc(origin: u32, depth: u32);
glCreateTransformFeedbacks:                 proc(n: i32, ids: *u32);
glTransformFeedbackBufferBase:              proc(xfb: u32, index: u32, buffer: u32);
glTransformFeedbackBufferRange:             proc(xfb: u32, index: u32, buffer: u32, offset: int, size: int);
glGetTransformFeedbackiv:                   proc(xfb: u32, pname: u32, param: *i32);
glGetTransformFeedbacki_v:                  proc(xfb: u32, pname: u32, index: u32, param: *i32);
glGetTransformFeedbacki64_v:                proc(xfb: u32, pname: u32, index: u32, param: *i64);
glCreateBuffers:                            proc(n: i32, buffers: *u32);
glNamedBufferStorage:                       proc(buffer: u32, size: int, data: *void, flags: u32);
glNamedBufferData:                          proc(buffer: u32, size: int, data: *void, usage: u32);
glNamedBufferSubData:                       proc(buffer: u32, offset: int, size: int, data: *void);
glCopyNamedBufferSubData:                   proc(readBuffer: u32, writeBuffer: u32, readOffset: int, writeOffset: int, size: int);
glClearNamedBufferData:                     proc(buffer: u32, internalformat: u32, format: u32, type: u32, data: *void);
glClearNamedBufferSubData:                  proc(buffer: u32, internalformat: u32, offset: int, size: int, format: u32, type: u32, data: *void);
glMapNamedBuffer:                           proc(buffer: u32, access: u32): *void;
glMapNamedBufferRange:                      proc(buffer: u32, offset: int, length: int, access: u32): *void;
glUnmapNamedBuffer:                         proc(buffer: u32): bool;
glFlushMappedNamedBufferRange:              proc(buffer: u32, offset: int, length: int);
glGetNamedBufferParameteriv:                proc(buffer: u32, pname: u32, params: *i32);
glGetNamedBufferParameteri64v:              proc(buffer: u32, pname: u32, params: *i64);
glGetNamedBufferPointerv:                   proc(buffer: u32, pname: u32, params: **void);
glGetNamedBufferSubData:                    proc(buffer: u32, offset: int, size: int, data: *void);
glCreateFramebuffers:                       proc(n: i32, framebuffers: *u32);
glNamedFramebufferRenderbuffer:             proc(framebuffer: u32, attachment: u32, renderbuffertarget: u32, renderbuffer: u32);
glNamedFramebufferParameteri:               proc(framebuffer: u32, pname: u32, param: i32);
glNamedFramebufferTexture:                  proc(framebuffer: u32, attachment: u32, texture: u32, level: i32);
glNamedFramebufferTextureLayer:             proc(framebuffer: u32, attachment: u32, texture: u32, level: i32, layer: i32);
glNamedFramebufferDrawBuffer:               proc(framebuffer: u32, buf: u32);
glNamedFramebufferDrawBuffers:              proc(framebuffer: u32, n: i32, bufs: *u32);
glNamedFramebufferReadBuffer:               proc(framebuffer: u32, src: u32);
glInvalidateNamedFramebufferData:           proc(framebuffer: u32, numAttachments: i32, attachments: *u32);
glInvalidateNamedFramebufferSubData:        proc(framebuffer: u32, numAttachments: i32, attachments: *u32, x: i32, y: i32, width: i32, height: i32);
glClearNamedFramebufferiv:                  proc(framebuffer: u32, buffer: u32, drawbuffer: i32, value: *i32);
glClearNamedFramebufferuiv:                 proc(framebuffer: u32, buffer: u32, drawbuffer: i32, value: *u32);
glClearNamedFramebufferfv:                  proc(framebuffer: u32, buffer: u32, drawbuffer: i32, value: *f32);
glClearNamedFramebufferfi:                  proc(framebuffer: u32, buffer: u32, drawbuffer: i32, depth: f32, stencil: i32);
glBlitNamedFramebuffer:                     proc(readFramebuffer: u32, drawFramebuffer: u32, srcX0: i32, srcY0: i32, srcX1: i32, srcY1: i32, dstX0: i32, dstY0: i32, dstX1: i32, dstY1: i32, mask: u32, filter: u32);
glCheckNamedFramebufferStatus:              proc(framebuffer: u32, target: u32): u32;
glGetNamedFramebufferParameteriv:           proc(framebuffer: u32, pname: u32, param: *i32);
glGetNamedFramebufferAttachmentParameteriv: proc(framebuffer: u32, attachment: u32, pname: u32, params: *i32);
glCreateRenderbuffers:                      proc(n: i32, renderbuffers: *u32);
glNamedRenderbufferStorage:                 proc(renderbuffer: u32, internalformat: u32, width: i32, height: i32);
glNamedRenderbufferStorageMultisample:      proc(renderbuffer: u32, samples: i32, internalformat: u32, width: i32, height: i32);
glGetNamedRenderbufferParameteriv:          proc(renderbuffer: u32, pname: u32, params: *i32);
glCreateTextures:                           proc(target: u32, n: i32, textures: *u32);
glTextureBuffer:                            proc(texture: u32, internalformat: u32, buffer: u32);
glTextureBufferRange:                       proc(texture: u32, internalformat: u32, buffer: u32, offset: int, size: int);
glTextureStorage1D:                         proc(texture: u32, levels: i32, internalformat: u32, width: i32);
glTextureStorage2D:                         proc(texture: u32, levels: i32, internalformat: u32, width: i32, height: i32);
glTextureStorage3D:                         proc(texture: u32, levels: i32, internalformat: u32, width: i32, height: i32, depth: i32);
glTextureStorage2DMultisample:              proc(texture: u32, samples: i32, internalformat: u32, width: i32, height: i32, fixedsamplelocations: bool);
glTextureStorage3DMultisample:              proc(texture: u32, samples: i32, internalformat: u32, width: i32, height: i32, depth: i32, fixedsamplelocations: bool);
glTextureSubImage1D:                        proc(texture: u32, level: i32, xoffset: i32, width: i32, format: u32, type: u32, pixels: *void);
glTextureSubImage2D:                        proc(texture: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, type: u32, pixels: *void);
glTextureSubImage3D:                        proc(texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, pixels: *void);
glCompressedTextureSubImage1D:              proc(texture: u32, level: i32, xoffset: i32, width: i32, format: u32, imageSize: i32, data: *void);
glCompressedTextureSubImage2D:              proc(texture: u32, level: i32, xoffset: i32, yoffset: i32, width: i32, height: i32, format: u32, imageSize: i32, data: *void);
glCompressedTextureSubImage3D:              proc(texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, imageSize: i32, data: *void);
glCopyTextureSubImage1D:                    proc(texture: u32, level: i32, xoffset: i32, x: i32, y: i32, width: i32);
glCopyTextureSubImage2D:                    proc(texture: u32, level: i32, xoffset: i32, yoffset: i32, x: i32, y: i32, width: i32, height: i32);
glCopyTextureSubImage3D:                    proc(texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, x: i32, y: i32, width: i32, height: i32);
glTextureParameterf:                        proc(texture: u32, pname: u32, param: f32);
glTextureParameterfv:                       proc(texture: u32, pname: u32, param: *f32);
glTextureParameteri:                        proc(texture: u32, pname: u32, param: i32);
glTextureParameterIiv:                      proc(texture: u32, pname: u32, params: *i32);
glTextureParameterIuiv:                     proc(texture: u32, pname: u32, params: *u32);
glTextureParameteriv:                       proc(texture: u32, pname: u32, param: *i32);
glGenerateTextureMipmap:                    proc(texture: u32);
glBindTextureUnit:                          proc(unit: u32, texture: u32);
glGetTextureImage:                          proc(texture: u32, level: i32, format: u32, type: u32, bufSize: i32, pixels: *void);
glGetCompressedTextureImage:                proc(texture: u32, level: i32, bufSize: i32, pixels: *void);
glGetTextureLevelParameterfv:               proc(texture: u32, level: i32, pname: u32, params: *f32);
glGetTextureLevelParameteriv:               proc(texture: u32, level: i32, pname: u32, params: *i32);
glGetTextureParameterfv:                    proc(texture: u32, pname: u32, params: *f32);
glGetTextureParameterIiv:                   proc(texture: u32, pname: u32, params: *i32);
glGetTextureParameterIuiv:                  proc(texture: u32, pname: u32, params: *u32);
glGetTextureParameteriv:                    proc(texture: u32, pname: u32, params: *i32);
glCreateVertexArrays:                       proc(n: i32, arrays: *u32);
glDisableVertexArrayAttrib:                 proc(vaobj: u32, index: u32);
glEnableVertexArrayAttrib:                  proc(vaobj: u32, index: u32);
glVertexArrayElementBuffer:                 proc(vaobj: u32, buffer: u32);
glVertexArrayVertexBuffer:                  proc(vaobj: u32, bindingindex: u32, buffer: u32, offset: int, stride: i32);
glVertexArrayVertexBuffers:                 proc(vaobj: u32, first: u32, count: i32, buffers: *u32, offsets: *uintptr, strides: *i32);
glVertexArrayAttribBinding:                 proc(vaobj: u32, attribindex: u32, bindingindex: u32);
glVertexArrayAttribFormat:                  proc(vaobj: u32, attribindex: u32, size: i32, type: u32, normalized: bool, relativeoffset: u32);
glVertexArrayAttribIFormat:                 proc(vaobj: u32, attribindex: u32, size: i32, type: u32, relativeoffset: u32);
glVertexArrayAttribLFormat:                 proc(vaobj: u32, attribindex: u32, size: i32, type: u32, relativeoffset: u32);
glVertexArrayBindingDivisor:                proc(vaobj: u32, bindingindex: u32, divisor: u32);
glGetVertexArrayiv:                         proc(vaobj: u32, pname: u32, param: *i32);
glGetVertexArrayIndexediv:                  proc(vaobj: u32, index: u32, pname: u32, param: *i32);
glGetVertexArrayIndexed64iv:                proc(vaobj: u32, index: u32, pname: u32, param: *i64);
glCreateSamplers:                           proc(n: i32, samplers: *u32);
glCreateProgramPipelines:                   proc(n: i32, pipelines: *u32);
glCreateQueries:                            proc(target: u32, n: i32, ids: *u32);
glGetQueryBufferObjecti64v:                 proc(id: u32, buffer: u32, pname: u32, offset: int);
glGetQueryBufferObjectiv:                   proc(id: u32, buffer: u32, pname: u32, offset: int);
glGetQueryBufferObjectui64v:                proc(id: u32, buffer: u32, pname: u32, offset: int);
glGetQueryBufferObjectuiv:                  proc(id: u32, buffer: u32, pname: u32, offset: int);
glMemoryBarrierByRegion:                    proc(barriers: u32);
glGetTextureSubImage:                       proc(texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, format: u32, type: u32, bufSize: i32, pixels: *void);
glGetCompressedTextureSubImage:             proc(texture: u32, level: i32, xoffset: i32, yoffset: i32, zoffset: i32, width: i32, height: i32, depth: i32, bufSize: i32, pixels: *void);
glGetGraphicsResetStatus:                   proc(): u32;
glGetnCompressedTexImage:                   proc(target: u32, lod: i32, bufSize: i32, pixels: *void);
glGetnTexImage:                             proc(target: u32, level: i32, format: u32, type: u32, bufSize: i32, pixels: *void);
glGetnUniformdv:                            proc(program: u32, location: i32, bufSize: i32, params: *f64);
glGetnUniformfv:                            proc(program: u32, location: i32, bufSize: i32, params: *f32);
glGetnUniformiv:                            proc(program: u32, location: i32, bufSize: i32, params: *i32);
glGetnUniformuiv:                           proc(program: u32, location: i32, bufSize: i32, params: *u32);
glReadnPixels:                              proc(x: i32, y: i32, width: i32, height: i32, format: u32, type: u32, bufSize: i32, data: *void);
glGetnMapdv:                                proc(target: u32, query: u32, bufSize: i32, v: *f64);
glGetnMapfv:                                proc(target: u32, query: u32, bufSize: i32, v: *f32);
glGetnMapiv:                                proc(target: u32, query: u32, bufSize: i32, v: *i32);
glGetnPixelMapusv:                          proc(map_: u32, bufSize: i32, values: *u16);
glGetnPixelMapfv:                           proc(map_: u32, bufSize: i32, values: *f32);
glGetnPixelMapuiv:                          proc(map_: u32, bufSize: i32, values: *u32);
glGetnPolygonStipple:                       proc(bufSize: i32, pattern: *u8);
glGetnColorTable:                           proc(target: u32, format: u32, type: u32, bufSize: i32, table: *void);
glGetnConvolutionFilter:                    proc(target: u32, format: u32, type: u32, bufSize: i32, image: *void);
glGetnSeparableFilter:                      proc(target: u32, format: u32, type: u32, rowBufSize: i32, row: *void, columnBufSize: i32, column: *void, span: *void);
glGetnHistogram:                            proc(target: u32, reset: bool, format: u32, type: u32, bufSize: i32, values: *void);
glGetnMinmax:                               proc(target: u32, reset: bool, format: u32, type: u32, bufSize: i32, values: *void);
glTextureBarrier:                           proc();
glGetUnsignedBytevEXT:                      proc(pname: u32, data: *u8);
glTexPageCommitmentARB:                     proc(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(:**void(&glClipControl),                              "glClipControl");
    set_proc_address(:**void(&glCreateTransformFeedbacks),                 "glCreateTransformFeedbacks");
    set_proc_address(:**void(&glTransformFeedbackBufferBase),              "glTransformFeedbackBufferBase");
    set_proc_address(:**void(&glTransformFeedbackBufferRange),             "glTransformFeedbackBufferRange");
    set_proc_address(:**void(&glGetTransformFeedbackiv),                   "glGetTransformFeedbackiv");
    set_proc_address(:**void(&glGetTransformFeedbacki_v),                  "glGetTransformFeedbacki_v");
    set_proc_address(:**void(&glGetTransformFeedbacki64_v),                "glGetTransformFeedbacki64_v");
    set_proc_address(:**void(&glCreateBuffers),                            "glCreateBuffers");
    set_proc_address(:**void(&glNamedBufferStorage),                       "glNamedBufferStorage");
    set_proc_address(:**void(&glNamedBufferData),                          "glNamedBufferData");
    set_proc_address(:**void(&glNamedBufferSubData),                       "glNamedBufferSubData");
    set_proc_address(:**void(&glCopyNamedBufferSubData),                   "glCopyNamedBufferSubData");
    set_proc_address(:**void(&glClearNamedBufferData),                     "glClearNamedBufferData");
    set_proc_address(:**void(&glClearNamedBufferSubData),                  "glClearNamedBufferSubData");
    set_proc_address(:**void(&glMapNamedBuffer),                           "glMapNamedBuffer");
    set_proc_address(:**void(&glMapNamedBufferRange),                      "glMapNamedBufferRange");
    set_proc_address(:**void(&glUnmapNamedBuffer),                         "glUnmapNamedBuffer");
    set_proc_address(:**void(&glFlushMappedNamedBufferRange),              "glFlushMappedNamedBufferRange");
    set_proc_address(:**void(&glGetNamedBufferParameteriv),                "glGetNamedBufferParameteriv");
    set_proc_address(:**void(&glGetNamedBufferParameteri64v),              "glGetNamedBufferParameteri64v");
    set_proc_address(:**void(&glGetNamedBufferPointerv),                   "glGetNamedBufferPointerv");
    set_proc_address(:**void(&glGetNamedBufferSubData),                    "glGetNamedBufferSubData");
    set_proc_address(:**void(&glCreateFramebuffers),                       "glCreateFramebuffers");
    set_proc_address(:**void(&glNamedFramebufferRenderbuffer),             "glNamedFramebufferRenderbuffer");
    set_proc_address(:**void(&glNamedFramebufferParameteri),               "glNamedFramebufferParameteri");
    set_proc_address(:**void(&glNamedFramebufferTexture),                  "glNamedFramebufferTexture");
    set_proc_address(:**void(&glNamedFramebufferTextureLayer),             "glNamedFramebufferTextureLayer");
    set_proc_address(:**void(&glNamedFramebufferDrawBuffer),               "glNamedFramebufferDrawBuffer");
    set_proc_address(:**void(&glNamedFramebufferDrawBuffers),              "glNamedFramebufferDrawBuffers");
    set_proc_address(:**void(&glNamedFramebufferReadBuffer),               "glNamedFramebufferReadBuffer");
    set_proc_address(:**void(&glInvalidateNamedFramebufferData),           "glInvalidateNamedFramebufferData");
    set_proc_address(:**void(&glInvalidateNamedFramebufferSubData),        "glInvalidateNamedFramebufferSubData");
    set_proc_address(:**void(&glClearNamedFramebufferiv),                  "glClearNamedFramebufferiv");
    set_proc_address(:**void(&glClearNamedFramebufferuiv),                 "glClearNamedFramebufferuiv");
    set_proc_address(:**void(&glClearNamedFramebufferfv),                  "glClearNamedFramebufferfv");
    set_proc_address(:**void(&glClearNamedFramebufferfi),                  "glClearNamedFramebufferfi");
    set_proc_address(:**void(&glBlitNamedFramebuffer),                     "glBlitNamedFramebuffer");
    set_proc_address(:**void(&glCheckNamedFramebufferStatus),              "glCheckNamedFramebufferStatus");
    set_proc_address(:**void(&glGetNamedFramebufferParameteriv),           "glGetNamedFramebufferParameteriv");
    set_proc_address(:**void(&glGetNamedFramebufferAttachmentParameteriv), "glGetNamedFramebufferAttachmentParameteriv");
    set_proc_address(:**void(&glCreateRenderbuffers),                      "glCreateRenderbuffers");
    set_proc_address(:**void(&glNamedRenderbufferStorage),                 "glNamedRenderbufferStorage");
    set_proc_address(:**void(&glNamedRenderbufferStorageMultisample),      "glNamedRenderbufferStorageMultisample");
    set_proc_address(:**void(&glGetNamedRenderbufferParameteriv),          "glGetNamedRenderbufferParameteriv");
    set_proc_address(:**void(&glCreateTextures),                           "glCreateTextures");
    set_proc_address(:**void(&glTextureBuffer),                            "glTextureBuffer");
    set_proc_address(:**void(&glTextureBufferRange),                       "glTextureBufferRange");
    set_proc_address(:**void(&glTextureStorage1D),                         "glTextureStorage1D");
    set_proc_address(:**void(&glTextureStorage2D),                         "glTextureStorage2D");
    set_proc_address(:**void(&glTextureStorage3D),                         "glTextureStorage3D");
    set_proc_address(:**void(&glTextureStorage2DMultisample),              "glTextureStorage2DMultisample");
    set_proc_address(:**void(&glTextureStorage3DMultisample),              "glTextureStorage3DMultisample");
    set_proc_address(:**void(&glTextureSubImage1D),                        "glTextureSubImage1D");
    set_proc_address(:**void(&glTextureSubImage2D),                        "glTextureSubImage2D");
    set_proc_address(:**void(&glTextureSubImage3D),                        "glTextureSubImage3D");
    set_proc_address(:**void(&glCompressedTextureSubImage1D),              "glCompressedTextureSubImage1D");
    set_proc_address(:**void(&glCompressedTextureSubImage2D),              "glCompressedTextureSubImage2D");
    set_proc_address(:**void(&glCompressedTextureSubImage3D),              "glCompressedTextureSubImage3D");
    set_proc_address(:**void(&glCopyTextureSubImage1D),                    "glCopyTextureSubImage1D");
    set_proc_address(:**void(&glCopyTextureSubImage2D),                    "glCopyTextureSubImage2D");
    set_proc_address(:**void(&glCopyTextureSubImage3D),                    "glCopyTextureSubImage3D");
    set_proc_address(:**void(&glTextureParameterf),                        "glTextureParameterf");
    set_proc_address(:**void(&glTextureParameterfv),                       "glTextureParameterfv");
    set_proc_address(:**void(&glTextureParameteri),                        "glTextureParameteri");
    set_proc_address(:**void(&glTextureParameterIiv),                      "glTextureParameterIiv");
    set_proc_address(:**void(&glTextureParameterIuiv),                     "glTextureParameterIuiv");
    set_proc_address(:**void(&glTextureParameteriv),                       "glTextureParameteriv");
    set_proc_address(:**void(&glGenerateTextureMipmap),                    "glGenerateTextureMipmap");
    set_proc_address(:**void(&glBindTextureUnit),                          "glBindTextureUnit");
    set_proc_address(:**void(&glGetTextureImage),                          "glGetTextureImage");
    set_proc_address(:**void(&glGetCompressedTextureImage),                "glGetCompressedTextureImage");
    set_proc_address(:**void(&glGetTextureLevelParameterfv),               "glGetTextureLevelParameterfv");
    set_proc_address(:**void(&glGetTextureLevelParameteriv),               "glGetTextureLevelParameteriv");
    set_proc_address(:**void(&glGetTextureParameterfv),                    "glGetTextureParameterfv");
    set_proc_address(:**void(&glGetTextureParameterIiv),                   "glGetTextureParameterIiv");
    set_proc_address(:**void(&glGetTextureParameterIuiv),                  "glGetTextureParameterIuiv");
    set_proc_address(:**void(&glGetTextureParameteriv),                    "glGetTextureParameteriv");
    set_proc_address(:**void(&glCreateVertexArrays),                       "glCreateVertexArrays");
    set_proc_address(:**void(&glDisableVertexArrayAttrib),                 "glDisableVertexArrayAttrib");
    set_proc_address(:**void(&glEnableVertexArrayAttrib),                  "glEnableVertexArrayAttrib");
    set_proc_address(:**void(&glVertexArrayElementBuffer),                 "glVertexArrayElementBuffer");
    set_proc_address(:**void(&glVertexArrayVertexBuffer),                  "glVertexArrayVertexBuffer");
    set_proc_address(:**void(&glVertexArrayVertexBuffers),                 "glVertexArrayVertexBuffers");
    set_proc_address(:**void(&glVertexArrayAttribBinding),                 "glVertexArrayAttribBinding");
    set_proc_address(:**void(&glVertexArrayAttribFormat),                  "glVertexArrayAttribFormat");
    set_proc_address(:**void(&glVertexArrayAttribIFormat),                 "glVertexArrayAttribIFormat");
    set_proc_address(:**void(&glVertexArrayAttribLFormat),                 "glVertexArrayAttribLFormat");
    set_proc_address(:**void(&glVertexArrayBindingDivisor),                "glVertexArrayBindingDivisor");
    set_proc_address(:**void(&glGetVertexArrayiv),                         "glGetVertexArrayiv");
    set_proc_address(:**void(&glGetVertexArrayIndexediv),                  "glGetVertexArrayIndexediv");
    set_proc_address(:**void(&glGetVertexArrayIndexed64iv),                "glGetVertexArrayIndexed64iv");
    set_proc_address(:**void(&glCreateSamplers),                           "glCreateSamplers");
    set_proc_address(:**void(&glCreateProgramPipelines),                   "glCreateProgramPipelines");
    set_proc_address(:**void(&glCreateQueries),                            "glCreateQueries");
    set_proc_address(:**void(&glGetQueryBufferObjecti64v),                 "glGetQueryBufferObjecti64v");
    set_proc_address(:**void(&glGetQueryBufferObjectiv),                   "glGetQueryBufferObjectiv");
    set_proc_address(:**void(&glGetQueryBufferObjectui64v),                "glGetQueryBufferObjectui64v");
    set_proc_address(:**void(&glGetQueryBufferObjectuiv),                  "glGetQueryBufferObjectuiv");
    set_proc_address(:**void(&glMemoryBarrierByRegion),                    "glMemoryBarrierByRegion");
    set_proc_address(:**void(&glGetTextureSubImage),                       "glGetTextureSubImage");
    set_proc_address(:**void(&glGetCompressedTextureSubImage),             "glGetCompressedTextureSubImage");
    set_proc_address(:**void(&glGetGraphicsResetStatus),                   "glGetGraphicsResetStatus");
    set_proc_address(:**void(&glGetnCompressedTexImage),                   "glGetnCompressedTexImage");
    set_proc_address(:**void(&glGetnTexImage),                             "glGetnTexImage");
    set_proc_address(:**void(&glGetnUniformdv),                            "glGetnUniformdv");
    set_proc_address(:**void(&glGetnUniformfv),                            "glGetnUniformfv");
    set_proc_address(:**void(&glGetnUniformiv),                            "glGetnUniformiv");
    set_proc_address(:**void(&glGetnUniformuiv),                           "glGetnUniformuiv");
    set_proc_address(:**void(&glReadnPixels),                              "glReadnPixels");
    set_proc_address(:**void(&glGetnMapdv),                                "glGetnMapdv");
    set_proc_address(:**void(&glGetnMapfv),                                "glGetnMapfv");
    set_proc_address(:**void(&glGetnMapiv),                                "glGetnMapiv");
    set_proc_address(:**void(&glGetnPixelMapfv),                           "glGetnPixelMapfv");
    set_proc_address(:**void(&glGetnPixelMapuiv),                          "glGetnPixelMapuiv");
    set_proc_address(:**void(&glGetnPixelMapusv),                          "glGetnPixelMapusv");
    set_proc_address(:**void(&glGetnPolygonStipple),                       "glGetnPolygonStipple");
    set_proc_address(:**void(&glGetnColorTable),                           "glGetnColorTable");
    set_proc_address(:**void(&glGetnConvolutionFilter),                    "glGetnConvolutionFilter");
    set_proc_address(:**void(&glGetnSeparableFilter),                      "glGetnSeparableFilter");
    set_proc_address(:**void(&glGetnHistogram),                            "glGetnHistogram");
    set_proc_address(:**void(&glGetnMinmax),                               "glGetnMinmax");
    set_proc_address(:**void(&glTextureBarrier),                           "glTextureBarrier");
    set_proc_address(:**void(&glGetUnsignedBytevEXT),                      "glGetUnsignedBytevEXT");
    set_proc_address(:**void(&glTexPageCommitmentARB),                     "glTexPageCommitmentARB");
}

// VERSION_4_6
glSpecializeShader:               proc(shader: u32, pEntryPoint: *char, numSpecializationConstants: u32, pConstantIndex: *u32, pConstantValue: *u32);
glMultiDrawArraysIndirectCount:   proc(mode: i32, indirect: *DrawArraysIndirectCommand, drawcount: i32, maxdrawcount: i32, stride: i32);
glMultiDrawElementsIndirectCount: proc(mode: i32, type: i32, indirect: *DrawElementsIndirectCommand, drawcount: i32, maxdrawcount: i32, stride: i32);
glPolygonOffsetClamp:             proc(factor: f32, units: f32, clamp: f32);

load_4_6 :: proc(set_proc_address: Set_Proc_Address_Type) {
    set_proc_address(:**void(&glSpecializeShader),               "glSpecializeShader");
    set_proc_address(:**void(&glMultiDrawArraysIndirectCount),   "glMultiDrawArraysIndirectCount");
    set_proc_address(:**void(&glMultiDrawElementsIndirectCount), "glMultiDrawElementsIndirectCount");
    set_proc_address(:**void(&glPolygonOffsetClamp),             "glPolygonOffsetClamp");
}
