#[
    OpenGL loader generated by glad 0.1.34 on Wed Oct 27 17:55:56 2021.

    Language/Generator: Nim
    Specification: gl
    APIs: gl=3.3
    Profile: compatibility
    Extensions:
        GL_ARB_multisample,
        GL_EXT_framebuffer_multisample,
        GL_EXT_texture_filter_anisotropic
    Loader: False
    Local files: True
    Omit khrplatform: False
    Reproducible: False

    Commandline:
        --profile="compatibility" --api="gl=3.3" --generator="nim" --spec="gl" --no-loader --local-files --extensions="GL_ARB_multisample,GL_EXT_framebuffer_multisample,GL_EXT_texture_filter_anisotropic"
    Online:
        https://glad.dav1d.de/#profile=compatibility&language=nim&specification=gl&api=gl%3D3.3&extensions=GL_ARB_multisample&extensions=GL_EXT_framebuffer_multisample&extensions=GL_EXT_texture_filter_anisotropic
]#

import strutils

var glVersionMajor, glVersionMinor: int

# Types
type
  ClContext* = distinct pointer
  ClEvent* = distinct pointer
  GLVULKANPROCNV* = pointer
  GLbitfield* = distinct uint32
  GLboolean* = bool
  GLbyte* = int8
  GLchar* = char
  GLcharARB* = char
  GLclampd* = float64
  GLclampf* = float32
  GLclampx* = int32
  GLdouble* = float64
  GLeglClientBufferEXT* = pointer
  GLeglImageOES* = distinct pointer
  GLenum* = distinct uint32
  GLfixed* = int32
  GLfloat* = float32
  GLhalf* = uint16
  GLhalfARB* = uint16
  GLhalfNV* = uint16
  GLhandleARB* = uint32
  GLint* = int32
  GLint64* = int64
  GLint64EXT* = int64
  GLintptr* = cint
  GLintptrARB* = cint
  GLshort* = int16
  GLsizei* = int32
  GLsizeiptr* = cint
  GLsizeiptrARB* = cint
  GLsync* = distinct pointer
  GLubyte* = uint8
  GLuint* = uint32
  GLuint64* = uint64
  GLuint64EXT* = uint64
  GLushort* = uint16
  GLvdpauSurfaceNV* = int32
  GLvoid* = pointer

  GLdebugProc* = proc (
    source: GLenum,
    typ: GLenum,
    id: GLuint,
    severity: GLenum,
    length: GLsizei,
    message: ptr GLchar,
    userParam: pointer) {.stdcall.}

  GLdebugProcArb* = proc (
    source: GLenum,
    typ: GLenum,
    id: GLuint,
    severity: GLenum,
    len: GLsizei,
    message: ptr GLchar,
    userParam: pointer) {.stdcall.}

  GLdebugProcAmd* = proc (
    id: GLuint,
    category: GLenum,
    severity: GLenum,
    len: GLsizei,
    message: ptr GLchar,
    userParam: pointer) {.stdcall.}

  GLdebugProcKhr* = proc (
    source, typ: GLenum,
    id: GLuint,
    severity: GLenum,
    length: GLsizei,
    message: ptr GLchar,
    userParam: pointer) {.stdcall.}


# Enums

proc `==`*(a, b: GLenum): bool {.borrow.}
proc `==`*(a, b: GLbitfield): bool {.borrow.}
proc `or`*(a, b: GLbitfield): GLbitfield {.borrow.}
proc hash*(x: GLenum): int = x.int

const
  GL_FALSE* = 0
  GL_INVALID_INDEX* = 0xFFFFFFFF'u32
  GL_NONE* = 0
  GL_NONE_OES* = 0
  GL_NO_ERROR* = 0
  GL_ONE* = 1
  GL_TIMEOUT_IGNORED* = 0xFFFFFFFFFFFFFFFF'u64
  GL_TIMEOUT_IGNORED_APPLE* = 0xFFFFFFFFFFFFFFFF'u64
  GL_TRUE* = 1
  GL_VERSION_ES_CL_1_0* = 1
  GL_VERSION_ES_CL_1_1* = 1
  GL_VERSION_ES_CM_1_1* = 1
  GL_ZERO* = 0

  GL_DEPTH_BUFFER_BIT* = 0x00000100.GLbitfield
  GL_STENCIL_BUFFER_BIT* = 0x00000400.GLbitfield
  GL_COLOR_BUFFER_BIT* = 0x00004000.GLbitfield
  GL_POINTS* = 0x0000.GLenum
  GL_LINES* = 0x0001.GLenum
  GL_LINE_LOOP* = 0x0002.GLenum
  GL_LINE_STRIP* = 0x0003.GLenum
  GL_TRIANGLES* = 0x0004.GLenum
  GL_TRIANGLE_STRIP* = 0x0005.GLenum
  GL_TRIANGLE_FAN* = 0x0006.GLenum
  GL_QUADS* = 0x0007.GLenum
  GL_NEVER* = 0x0200.GLenum
  GL_LESS* = 0x0201.GLenum
  GL_EQUAL* = 0x0202.GLenum
  GL_LEQUAL* = 0x0203.GLenum
  GL_GREATER* = 0x0204.GLenum
  GL_NOTEQUAL* = 0x0205.GLenum
  GL_GEQUAL* = 0x0206.GLenum
  GL_ALWAYS* = 0x0207.GLenum
  GL_SRC_COLOR* = 0x0300.GLenum
  GL_ONE_MINUS_SRC_COLOR* = 0x0301.GLenum
  GL_SRC_ALPHA* = 0x0302.GLenum
  GL_ONE_MINUS_SRC_ALPHA* = 0x0303.GLenum
  GL_DST_ALPHA* = 0x0304.GLenum
  GL_ONE_MINUS_DST_ALPHA* = 0x0305.GLenum
  GL_DST_COLOR* = 0x0306.GLenum
  GL_ONE_MINUS_DST_COLOR* = 0x0307.GLenum
  GL_SRC_ALPHA_SATURATE* = 0x0308.GLenum
  GL_FRONT_LEFT* = 0x0400.GLenum
  GL_FRONT_RIGHT* = 0x0401.GLenum
  GL_BACK_LEFT* = 0x0402.GLenum
  GL_BACK_RIGHT* = 0x0403.GLenum
  GL_FRONT* = 0x0404.GLenum
  GL_BACK* = 0x0405.GLenum
  GL_LEFT* = 0x0406.GLenum
  GL_RIGHT* = 0x0407.GLenum
  GL_FRONT_AND_BACK* = 0x0408.GLenum
  GL_INVALID_ENUM* = 0x0500.GLenum
  GL_INVALID_VALUE* = 0x0501.GLenum
  GL_INVALID_OPERATION* = 0x0502.GLenum
  GL_OUT_OF_MEMORY* = 0x0505.GLenum
  GL_CW* = 0x0900.GLenum
  GL_CCW* = 0x0901.GLenum
  GL_POINT_SIZE* = 0x0B11.GLenum
  GL_POINT_SIZE_RANGE* = 0x0B12.GLenum
  GL_POINT_SIZE_GRANULARITY* = 0x0B13.GLenum
  GL_LINE_SMOOTH* = 0x0B20.GLenum
  GL_LINE_WIDTH* = 0x0B21.GLenum
  GL_LINE_WIDTH_RANGE* = 0x0B22.GLenum
  GL_LINE_WIDTH_GRANULARITY* = 0x0B23.GLenum
  GL_POLYGON_MODE* = 0x0B40.GLenum
  GL_POLYGON_SMOOTH* = 0x0B41.GLenum
  GL_CULL_FACE* = 0x0B44.GLenum
  GL_CULL_FACE_MODE* = 0x0B45.GLenum
  GL_FRONT_FACE* = 0x0B46.GLenum
  GL_DEPTH_RANGE* = 0x0B70.GLenum
  GL_DEPTH_TEST* = 0x0B71.GLenum
  GL_DEPTH_WRITEMASK* = 0x0B72.GLenum
  GL_DEPTH_CLEAR_VALUE* = 0x0B73.GLenum
  GL_DEPTH_FUNC* = 0x0B74.GLenum
  GL_STENCIL_TEST* = 0x0B90.GLenum
  GL_STENCIL_CLEAR_VALUE* = 0x0B91.GLenum
  GL_STENCIL_FUNC* = 0x0B92.GLenum
  GL_STENCIL_VALUE_MASK* = 0x0B93.GLenum
  GL_STENCIL_FAIL* = 0x0B94.GLenum
  GL_STENCIL_PASS_DEPTH_FAIL* = 0x0B95.GLenum
  GL_STENCIL_PASS_DEPTH_PASS* = 0x0B96.GLenum
  GL_STENCIL_REF* = 0x0B97.GLenum
  GL_STENCIL_WRITEMASK* = 0x0B98.GLenum
  GL_VIEWPORT* = 0x0BA2.GLenum
  GL_DITHER* = 0x0BD0.GLenum
  GL_BLEND_DST* = 0x0BE0.GLenum
  GL_BLEND_SRC* = 0x0BE1.GLenum
  GL_BLEND* = 0x0BE2.GLenum
  GL_LOGIC_OP_MODE* = 0x0BF0.GLenum
  GL_DRAW_BUFFER* = 0x0C01.GLenum
  GL_READ_BUFFER* = 0x0C02.GLenum
  GL_SCISSOR_BOX* = 0x0C10.GLenum
  GL_SCISSOR_TEST* = 0x0C11.GLenum
  GL_COLOR_CLEAR_VALUE* = 0x0C22.GLenum
  GL_COLOR_WRITEMASK* = 0x0C23.GLenum
  GL_DOUBLEBUFFER* = 0x0C32.GLenum
  GL_STEREO* = 0x0C33.GLenum
  GL_LINE_SMOOTH_HINT* = 0x0C52.GLenum
  GL_POLYGON_SMOOTH_HINT* = 0x0C53.GLenum
  GL_UNPACK_SWAP_BYTES* = 0x0CF0.GLenum
  GL_UNPACK_LSB_FIRST* = 0x0CF1.GLenum
  GL_UNPACK_ROW_LENGTH* = 0x0CF2.GLenum
  GL_UNPACK_SKIP_ROWS* = 0x0CF3.GLenum
  GL_UNPACK_SKIP_PIXELS* = 0x0CF4.GLenum
  GL_UNPACK_ALIGNMENT* = 0x0CF5.GLenum
  GL_PACK_SWAP_BYTES* = 0x0D00.GLenum
  GL_PACK_LSB_FIRST* = 0x0D01.GLenum
  GL_PACK_ROW_LENGTH* = 0x0D02.GLenum
  GL_PACK_SKIP_ROWS* = 0x0D03.GLenum
  GL_PACK_SKIP_PIXELS* = 0x0D04.GLenum
  GL_PACK_ALIGNMENT* = 0x0D05.GLenum
  GL_MAX_TEXTURE_SIZE* = 0x0D33.GLenum
  GL_MAX_VIEWPORT_DIMS* = 0x0D3A.GLenum
  GL_SUBPIXEL_BITS* = 0x0D50.GLbitfield
  GL_TEXTURE_1D* = 0x0DE0.GLenum
  GL_TEXTURE_2D* = 0x0DE1.GLenum
  GL_TEXTURE_WIDTH* = 0x1000.GLenum
  GL_TEXTURE_HEIGHT* = 0x1001.GLenum
  GL_TEXTURE_BORDER_COLOR* = 0x1004.GLenum
  GL_DONT_CARE* = 0x1100.GLenum
  GL_FASTEST* = 0x1101.GLenum
  GL_NICEST* = 0x1102.GLenum
  cGL_BYTE* = 0x1400.GLenum
  GL_UNSIGNED_BYTE* = 0x1401.GLenum
  cGL_SHORT* = 0x1402.GLenum
  GL_UNSIGNED_SHORT* = 0x1403.GLenum
  cGL_INT* = 0x1404.GLenum
  GL_UNSIGNED_INT* = 0x1405.GLenum
  cGL_FLOAT* = 0x1406.GLenum
  GL_STACK_OVERFLOW* = 0x0503.GLenum
  GL_STACK_UNDERFLOW* = 0x0504.GLenum
  GL_CLEAR* = 0x1500.GLenum
  GL_AND* = 0x1501.GLenum
  GL_AND_REVERSE* = 0x1502.GLenum
  GL_COPY* = 0x1503.GLenum
  GL_AND_INVERTED* = 0x1504.GLenum
  GL_NOOP* = 0x1505.GLenum
  GL_XOR* = 0x1506.GLenum
  GL_OR* = 0x1507.GLenum
  GL_NOR* = 0x1508.GLenum
  GL_EQUIV* = 0x1509.GLenum
  GL_INVERT* = 0x150A.GLenum
  GL_OR_REVERSE* = 0x150B.GLenum
  GL_COPY_INVERTED* = 0x150C.GLenum
  GL_OR_INVERTED* = 0x150D.GLenum
  GL_NAND* = 0x150E.GLenum
  GL_SET* = 0x150F.GLenum
  GL_TEXTURE* = 0x1702.GLenum
  GL_COLOR* = 0x1800.GLenum
  GL_DEPTH* = 0x1801.GLenum
  GL_STENCIL* = 0x1802.GLenum
  GL_STENCIL_INDEX* = 0x1901.GLenum
  GL_DEPTH_COMPONENT* = 0x1902.GLenum
  GL_RED* = 0x1903.GLenum
  GL_GREEN* = 0x1904.GLenum
  GL_BLUE* = 0x1905.GLenum
  GL_ALPHA* = 0x1906.GLenum
  GL_RGB* = 0x1907.GLenum
  GL_RGBA* = 0x1908.GLenum
  GL_POINT* = 0x1B00.GLenum
  GL_LINE* = 0x1B01.GLenum
  GL_FILL* = 0x1B02.GLenum
  GL_KEEP* = 0x1E00.GLenum
  GL_REPLACE* = 0x1E01.GLenum
  GL_INCR* = 0x1E02.GLenum
  GL_DECR* = 0x1E03.GLenum
  GL_VENDOR* = 0x1F00.GLenum
  GL_RENDERER* = 0x1F01.GLenum
  GL_VERSION* = 0x1F02.GLenum
  GL_EXTENSIONS* = 0x1F03.GLenum
  GL_NEAREST* = 0x2600.GLenum
  GL_LINEAR* = 0x2601.GLenum
  GL_NEAREST_MIPMAP_NEAREST* = 0x2700.GLenum
  GL_LINEAR_MIPMAP_NEAREST* = 0x2701.GLenum
  GL_NEAREST_MIPMAP_LINEAR* = 0x2702.GLenum
  GL_LINEAR_MIPMAP_LINEAR* = 0x2703.GLenum
  GL_TEXTURE_MAG_FILTER* = 0x2800.GLenum
  GL_TEXTURE_MIN_FILTER* = 0x2801.GLenum
  GL_TEXTURE_WRAP_S* = 0x2802.GLenum
  GL_TEXTURE_WRAP_T* = 0x2803.GLenum
  GL_REPEAT* = 0x2901.GLenum
  GL_CURRENT_BIT* = 0x00000001.GLbitfield
  GL_POINT_BIT* = 0x00000002.GLbitfield
  GL_LINE_BIT* = 0x00000004.GLbitfield
  GL_POLYGON_BIT* = 0x00000008.GLbitfield
  GL_POLYGON_STIPPLE_BIT* = 0x00000010.GLbitfield
  GL_PIXEL_MODE_BIT* = 0x00000020.GLbitfield
  GL_LIGHTING_BIT* = 0x00000040.GLbitfield
  GL_FOG_BIT* = 0x00000080.GLbitfield
  GL_ACCUM_BUFFER_BIT* = 0x00000200.GLbitfield
  GL_VIEWPORT_BIT* = 0x00000800.GLbitfield
  GL_TRANSFORM_BIT* = 0x00001000.GLbitfield
  GL_ENABLE_BIT* = 0x00002000.GLbitfield
  GL_HINT_BIT* = 0x00008000.GLbitfield
  GL_EVAL_BIT* = 0x00010000.GLbitfield
  GL_LIST_BIT* = 0x00020000.GLbitfield
  GL_TEXTURE_BIT* = 0x00040000.GLbitfield
  GL_SCISSOR_BIT* = 0x00080000.GLbitfield
  GL_ALL_ATTRIB_BITS* = 0xFFFFFFFF.GLbitfield
  GL_QUAD_STRIP* = 0x0008.GLenum
  GL_POLYGON* = 0x0009.GLenum
  GL_ACCUM* = 0x0100.GLenum
  GL_LOAD* = 0x0101.GLenum
  GL_RETURN* = 0x0102.GLenum
  GL_MULT* = 0x0103.GLenum
  GL_ADD* = 0x0104.GLenum
  GL_AUX0* = 0x0409.GLenum
  GL_AUX1* = 0x040A.GLenum
  GL_AUX2* = 0x040B.GLenum
  GL_AUX3* = 0x040C.GLenum
  GL_2D* = 0x0600.GLenum
  GL_3D* = 0x0601.GLenum
  GL_3D_COLOR* = 0x0602.GLenum
  GL_3D_COLOR_TEXTURE* = 0x0603.GLenum
  GL_4D_COLOR_TEXTURE* = 0x0604.GLenum
  GL_PASS_THROUGH_TOKEN* = 0x0700.GLenum
  GL_POINT_TOKEN* = 0x0701.GLenum
  GL_LINE_TOKEN* = 0x0702.GLenum
  GL_POLYGON_TOKEN* = 0x0703.GLenum
  GL_BITMAP_TOKEN* = 0x0704.GLbitfield
  GL_DRAW_PIXEL_TOKEN* = 0x0705.GLenum
  GL_COPY_PIXEL_TOKEN* = 0x0706.GLenum
  GL_LINE_RESET_TOKEN* = 0x0707.GLenum
  GL_EXP* = 0x0800.GLenum
  GL_EXP2* = 0x0801.GLenum
  GL_COEFF* = 0x0A00.GLenum
  GL_ORDER* = 0x0A01.GLenum
  GL_DOMAIN* = 0x0A02.GLenum
  GL_PIXEL_MAP_I_TO_I* = 0x0C70.GLenum
  GL_PIXEL_MAP_S_TO_S* = 0x0C71.GLenum
  GL_PIXEL_MAP_I_TO_R* = 0x0C72.GLenum
  GL_PIXEL_MAP_I_TO_G* = 0x0C73.GLenum
  GL_PIXEL_MAP_I_TO_B* = 0x0C74.GLenum
  GL_PIXEL_MAP_I_TO_A* = 0x0C75.GLenum
  GL_PIXEL_MAP_R_TO_R* = 0x0C76.GLenum
  GL_PIXEL_MAP_G_TO_G* = 0x0C77.GLenum
  GL_PIXEL_MAP_B_TO_B* = 0x0C78.GLenum
  GL_PIXEL_MAP_A_TO_A* = 0x0C79.GLenum
  GL_CURRENT_COLOR* = 0x0B00.GLenum
  GL_CURRENT_INDEX* = 0x0B01.GLenum
  GL_CURRENT_NORMAL* = 0x0B02.GLenum
  GL_CURRENT_TEXTURE_COORDS* = 0x0B03.GLenum
  GL_CURRENT_RASTER_COLOR* = 0x0B04.GLenum
  GL_CURRENT_RASTER_INDEX* = 0x0B05.GLenum
  GL_CURRENT_RASTER_TEXTURE_COORDS* = 0x0B06.GLenum
  GL_CURRENT_RASTER_POSITION* = 0x0B07.GLenum
  GL_CURRENT_RASTER_POSITION_VALID* = 0x0B08.GLenum
  GL_CURRENT_RASTER_DISTANCE* = 0x0B09.GLenum
  GL_POINT_SMOOTH* = 0x0B10.GLenum
  GL_LINE_STIPPLE* = 0x0B24.GLenum
  GL_LINE_STIPPLE_PATTERN* = 0x0B25.GLenum
  GL_LINE_STIPPLE_REPEAT* = 0x0B26.GLenum
  GL_LIST_MODE* = 0x0B30.GLenum
  GL_MAX_LIST_NESTING* = 0x0B31.GLenum
  GL_LIST_BASE* = 0x0B32.GLenum
  GL_LIST_INDEX* = 0x0B33.GLenum
  GL_POLYGON_STIPPLE* = 0x0B42.GLenum
  GL_EDGE_FLAG* = 0x0B43.GLenum
  GL_LIGHTING* = 0x0B50.GLenum
  GL_LIGHT_MODEL_LOCAL_VIEWER* = 0x0B51.GLenum
  GL_LIGHT_MODEL_TWO_SIDE* = 0x0B52.GLenum
  GL_LIGHT_MODEL_AMBIENT* = 0x0B53.GLenum
  GL_SHADE_MODEL* = 0x0B54.GLenum
  GL_COLOR_MATERIAL_FACE* = 0x0B55.GLenum
  GL_COLOR_MATERIAL_PARAMETER* = 0x0B56.GLenum
  GL_COLOR_MATERIAL* = 0x0B57.GLenum
  GL_FOG* = 0x0B60.GLenum
  GL_FOG_INDEX* = 0x0B61.GLenum
  GL_FOG_DENSITY* = 0x0B62.GLenum
  GL_FOG_START* = 0x0B63.GLenum
  GL_FOG_END* = 0x0B64.GLenum
  GL_FOG_MODE* = 0x0B65.GLenum
  GL_FOG_COLOR* = 0x0B66.GLenum
  GL_ACCUM_CLEAR_VALUE* = 0x0B80.GLenum
  GL_MATRIX_MODE* = 0x0BA0.GLenum
  GL_NORMALIZE* = 0x0BA1.GLenum
  GL_MODELVIEW_STACK_DEPTH* = 0x0BA3.GLenum
  GL_PROJECTION_STACK_DEPTH* = 0x0BA4.GLenum
  GL_TEXTURE_STACK_DEPTH* = 0x0BA5.GLenum
  GL_MODELVIEW_MATRIX* = 0x0BA6.GLenum
  GL_PROJECTION_MATRIX* = 0x0BA7.GLenum
  GL_TEXTURE_MATRIX* = 0x0BA8.GLenum
  GL_ATTRIB_STACK_DEPTH* = 0x0BB0.GLenum
  GL_ALPHA_TEST* = 0x0BC0.GLenum
  GL_ALPHA_TEST_FUNC* = 0x0BC1.GLenum
  GL_ALPHA_TEST_REF* = 0x0BC2.GLenum
  GL_LOGIC_OP* = 0x0BF1.GLenum
  GL_AUX_BUFFERS* = 0x0C00.GLenum
  GL_INDEX_CLEAR_VALUE* = 0x0C20.GLenum
  GL_INDEX_WRITEMASK* = 0x0C21.GLenum
  GL_INDEX_MODE* = 0x0C30.GLenum
  GL_RGBA_MODE* = 0x0C31.GLenum
  GL_RENDER_MODE* = 0x0C40.GLenum
  GL_PERSPECTIVE_CORRECTION_HINT* = 0x0C50.GLenum
  GL_POINT_SMOOTH_HINT* = 0x0C51.GLenum
  GL_FOG_HINT* = 0x0C54.GLenum
  GL_TEXTURE_GEN_S* = 0x0C60.GLenum
  GL_TEXTURE_GEN_T* = 0x0C61.GLenum
  GL_TEXTURE_GEN_R* = 0x0C62.GLenum
  GL_TEXTURE_GEN_Q* = 0x0C63.GLenum
  GL_PIXEL_MAP_I_TO_I_SIZE* = 0x0CB0.GLenum
  GL_PIXEL_MAP_S_TO_S_SIZE* = 0x0CB1.GLenum
  GL_PIXEL_MAP_I_TO_R_SIZE* = 0x0CB2.GLenum
  GL_PIXEL_MAP_I_TO_G_SIZE* = 0x0CB3.GLenum
  GL_PIXEL_MAP_I_TO_B_SIZE* = 0x0CB4.GLenum
  GL_PIXEL_MAP_I_TO_A_SIZE* = 0x0CB5.GLenum
  GL_PIXEL_MAP_R_TO_R_SIZE* = 0x0CB6.GLenum
  GL_PIXEL_MAP_G_TO_G_SIZE* = 0x0CB7.GLenum
  GL_PIXEL_MAP_B_TO_B_SIZE* = 0x0CB8.GLenum
  GL_PIXEL_MAP_A_TO_A_SIZE* = 0x0CB9.GLenum
  GL_MAP_COLOR* = 0x0D10.GLenum
  GL_MAP_STENCIL* = 0x0D11.GLenum
  GL_INDEX_SHIFT* = 0x0D12.GLenum
  GL_INDEX_OFFSET* = 0x0D13.GLenum
  GL_RED_SCALE* = 0x0D14.GLenum
  GL_RED_BIAS* = 0x0D15.GLenum
  GL_ZOOM_X* = 0x0D16.GLenum
  GL_ZOOM_Y* = 0x0D17.GLenum
  GL_GREEN_SCALE* = 0x0D18.GLenum
  GL_GREEN_BIAS* = 0x0D19.GLenum
  GL_BLUE_SCALE* = 0x0D1A.GLenum
  GL_BLUE_BIAS* = 0x0D1B.GLenum
  GL_ALPHA_SCALE* = 0x0D1C.GLenum
  GL_ALPHA_BIAS* = 0x0D1D.GLenum
  GL_DEPTH_SCALE* = 0x0D1E.GLenum
  GL_DEPTH_BIAS* = 0x0D1F.GLenum
  GL_MAX_EVAL_ORDER* = 0x0D30.GLenum
  GL_MAX_LIGHTS* = 0x0D31.GLenum
  GL_MAX_CLIP_PLANES* = 0x0D32.GLenum
  GL_MAX_PIXEL_MAP_TABLE* = 0x0D34.GLenum
  GL_MAX_ATTRIB_STACK_DEPTH* = 0x0D35.GLenum
  GL_MAX_MODELVIEW_STACK_DEPTH* = 0x0D36.GLenum
  GL_MAX_NAME_STACK_DEPTH* = 0x0D37.GLenum
  GL_MAX_PROJECTION_STACK_DEPTH* = 0x0D38.GLenum
  GL_MAX_TEXTURE_STACK_DEPTH* = 0x0D39.GLenum
  GL_INDEX_BITS* = 0x0D51.GLbitfield
  GL_RED_BITS* = 0x0D52.GLbitfield
  GL_GREEN_BITS* = 0x0D53.GLbitfield
  GL_BLUE_BITS* = 0x0D54.GLbitfield
  GL_ALPHA_BITS* = 0x0D55.GLbitfield
  GL_DEPTH_BITS* = 0x0D56.GLbitfield
  GL_STENCIL_BITS* = 0x0D57.GLbitfield
  GL_ACCUM_RED_BITS* = 0x0D58.GLbitfield
  GL_ACCUM_GREEN_BITS* = 0x0D59.GLbitfield
  GL_ACCUM_BLUE_BITS* = 0x0D5A.GLbitfield
  GL_ACCUM_ALPHA_BITS* = 0x0D5B.GLbitfield
  GL_NAME_STACK_DEPTH* = 0x0D70.GLenum
  GL_AUTO_NORMAL* = 0x0D80.GLenum
  GL_MAP1_COLOR_4* = 0x0D90.GLenum
  GL_MAP1_INDEX* = 0x0D91.GLenum
  GL_MAP1_NORMAL* = 0x0D92.GLenum
  GL_MAP1_TEXTURE_COORD_1* = 0x0D93.GLenum
  GL_MAP1_TEXTURE_COORD_2* = 0x0D94.GLenum
  GL_MAP1_TEXTURE_COORD_3* = 0x0D95.GLenum
  GL_MAP1_TEXTURE_COORD_4* = 0x0D96.GLenum
  GL_MAP1_VERTEX_3* = 0x0D97.GLenum
  GL_MAP1_VERTEX_4* = 0x0D98.GLenum
  GL_MAP2_COLOR_4* = 0x0DB0.GLenum
  GL_MAP2_INDEX* = 0x0DB1.GLenum
  GL_MAP2_NORMAL* = 0x0DB2.GLenum
  GL_MAP2_TEXTURE_COORD_1* = 0x0DB3.GLenum
  GL_MAP2_TEXTURE_COORD_2* = 0x0DB4.GLenum
  GL_MAP2_TEXTURE_COORD_3* = 0x0DB5.GLenum
  GL_MAP2_TEXTURE_COORD_4* = 0x0DB6.GLenum
  GL_MAP2_VERTEX_3* = 0x0DB7.GLenum
  GL_MAP2_VERTEX_4* = 0x0DB8.GLenum
  GL_MAP1_GRID_DOMAIN* = 0x0DD0.GLenum
  GL_MAP1_GRID_SEGMENTS* = 0x0DD1.GLenum
  GL_MAP2_GRID_DOMAIN* = 0x0DD2.GLenum
  GL_MAP2_GRID_SEGMENTS* = 0x0DD3.GLenum
  GL_TEXTURE_COMPONENTS* = 0x1003.GLenum
  GL_TEXTURE_BORDER* = 0x1005.GLenum
  GL_AMBIENT* = 0x1200.GLenum
  GL_DIFFUSE* = 0x1201.GLenum
  GL_SPECULAR* = 0x1202.GLenum
  GL_POSITION* = 0x1203.GLenum
  GL_SPOT_DIRECTION* = 0x1204.GLenum
  GL_SPOT_EXPONENT* = 0x1205.GLenum
  GL_SPOT_CUTOFF* = 0x1206.GLenum
  GL_CONSTANT_ATTENUATION* = 0x1207.GLenum
  GL_LINEAR_ATTENUATION* = 0x1208.GLenum
  GL_QUADRATIC_ATTENUATION* = 0x1209.GLenum
  GL_COMPILE* = 0x1300.GLenum
  GL_COMPILE_AND_EXECUTE* = 0x1301.GLenum
  GL_2_BYTES* = 0x1407.GLenum
  GL_3_BYTES* = 0x1408.GLenum
  GL_4_BYTES* = 0x1409.GLenum
  GL_EMISSION* = 0x1600.GLenum
  GL_SHININESS* = 0x1601.GLenum
  GL_AMBIENT_AND_DIFFUSE* = 0x1602.GLenum
  GL_COLOR_INDEXES* = 0x1603.GLenum
  GL_MODELVIEW* = 0x1700.GLenum
  GL_PROJECTION* = 0x1701.GLenum
  GL_COLOR_INDEX* = 0x1900.GLenum
  GL_LUMINANCE* = 0x1909.GLenum
  GL_LUMINANCE_ALPHA* = 0x190A.GLenum
  GL_BITMAP* = 0x1A00.GLbitfield
  GL_RENDER* = 0x1C00.GLenum
  GL_FEEDBACK* = 0x1C01.GLenum
  GL_SELECT* = 0x1C02.GLenum
  GL_FLAT* = 0x1D00.GLenum
  GL_SMOOTH* = 0x1D01.GLenum
  GL_S* = 0x2000.GLenum
  GL_T* = 0x2001.GLenum
  GL_R* = 0x2002.GLenum
  GL_Q* = 0x2003.GLenum
  GL_MODULATE* = 0x2100.GLenum
  GL_DECAL* = 0x2101.GLenum
  GL_TEXTURE_ENV_MODE* = 0x2200.GLenum
  GL_TEXTURE_ENV_COLOR* = 0x2201.GLenum
  GL_TEXTURE_ENV* = 0x2300.GLenum
  GL_EYE_LINEAR* = 0x2400.GLenum
  GL_OBJECT_LINEAR* = 0x2401.GLenum
  GL_SPHERE_MAP* = 0x2402.GLenum
  GL_TEXTURE_GEN_MODE* = 0x2500.GLenum
  GL_OBJECT_PLANE* = 0x2501.GLenum
  GL_EYE_PLANE* = 0x2502.GLenum
  GL_CLAMP* = 0x2900.GLenum
  GL_CLIP_PLANE0* = 0x3000.GLenum
  GL_CLIP_PLANE1* = 0x3001.GLenum
  GL_CLIP_PLANE2* = 0x3002.GLenum
  GL_CLIP_PLANE3* = 0x3003.GLenum
  GL_CLIP_PLANE4* = 0x3004.GLenum
  GL_CLIP_PLANE5* = 0x3005.GLenum
  GL_LIGHT0* = 0x4000.GLenum
  GL_LIGHT1* = 0x4001.GLenum
  GL_LIGHT2* = 0x4002.GLenum
  GL_LIGHT3* = 0x4003.GLenum
  GL_LIGHT4* = 0x4004.GLenum
  GL_LIGHT5* = 0x4005.GLenum
  GL_LIGHT6* = 0x4006.GLenum
  GL_LIGHT7* = 0x4007.GLenum
  GL_COLOR_LOGIC_OP* = 0x0BF2.GLenum
  GL_POLYGON_OFFSET_UNITS* = 0x2A00.GLenum
  GL_POLYGON_OFFSET_POINT* = 0x2A01.GLenum
  GL_POLYGON_OFFSET_LINE* = 0x2A02.GLenum
  GL_POLYGON_OFFSET_FILL* = 0x8037.GLenum
  GL_POLYGON_OFFSET_FACTOR* = 0x8038.GLenum
  GL_TEXTURE_BINDING_1D* = 0x8068.GLenum
  GL_TEXTURE_BINDING_2D* = 0x8069.GLenum
  GL_TEXTURE_INTERNAL_FORMAT* = 0x1003.GLenum
  GL_TEXTURE_RED_SIZE* = 0x805C.GLenum
  GL_TEXTURE_GREEN_SIZE* = 0x805D.GLenum
  GL_TEXTURE_BLUE_SIZE* = 0x805E.GLenum
  GL_TEXTURE_ALPHA_SIZE* = 0x805F.GLenum
  cGL_DOUBLE* = 0x140A.GLenum
  GL_PROXY_TEXTURE_1D* = 0x8063.GLenum
  GL_PROXY_TEXTURE_2D* = 0x8064.GLenum
  GL_R3_G3_B2* = 0x2A10.GLenum
  GL_RGB4* = 0x804F.GLenum
  GL_RGB5* = 0x8050.GLenum
  GL_RGB8* = 0x8051.GLenum
  GL_RGB10* = 0x8052.GLenum
  GL_RGB12* = 0x8053.GLenum
  GL_RGB16* = 0x8054.GLenum
  GL_RGBA2* = 0x8055.GLenum
  GL_RGBA4* = 0x8056.GLenum
  GL_RGB5_A1* = 0x8057.GLenum
  GL_RGBA8* = 0x8058.GLenum
  GL_RGB10_A2* = 0x8059.GLenum
  GL_RGBA12* = 0x805A.GLenum
  GL_RGBA16* = 0x805B.GLenum
  GL_CLIENT_PIXEL_STORE_BIT* = 0x00000001.GLbitfield
  GL_CLIENT_VERTEX_ARRAY_BIT* = 0x00000002.GLbitfield
  GL_CLIENT_ALL_ATTRIB_BITS* = 0xFFFFFFFF.GLbitfield
  GL_VERTEX_ARRAY_POINTER* = 0x808E.GLenum
  GL_NORMAL_ARRAY_POINTER* = 0x808F.GLenum
  GL_COLOR_ARRAY_POINTER* = 0x8090.GLenum
  GL_INDEX_ARRAY_POINTER* = 0x8091.GLenum
  GL_TEXTURE_COORD_ARRAY_POINTER* = 0x8092.GLenum
  GL_EDGE_FLAG_ARRAY_POINTER* = 0x8093.GLenum
  GL_FEEDBACK_BUFFER_POINTER* = 0x0DF0.GLenum
  GL_SELECTION_BUFFER_POINTER* = 0x0DF3.GLenum
  GL_CLIENT_ATTRIB_STACK_DEPTH* = 0x0BB1.GLenum
  GL_INDEX_LOGIC_OP* = 0x0BF1.GLenum
  GL_MAX_CLIENT_ATTRIB_STACK_DEPTH* = 0x0D3B.GLenum
  GL_FEEDBACK_BUFFER_SIZE* = 0x0DF1.GLenum
  GL_FEEDBACK_BUFFER_TYPE* = 0x0DF2.GLenum
  GL_SELECTION_BUFFER_SIZE* = 0x0DF4.GLenum
  GL_VERTEX_ARRAY* = 0x8074.GLenum
  GL_NORMAL_ARRAY* = 0x8075.GLenum
  GL_COLOR_ARRAY* = 0x8076.GLenum
  GL_INDEX_ARRAY* = 0x8077.GLenum
  GL_TEXTURE_COORD_ARRAY* = 0x8078.GLenum
  GL_EDGE_FLAG_ARRAY* = 0x8079.GLenum
  GL_VERTEX_ARRAY_SIZE* = 0x807A.GLenum
  GL_VERTEX_ARRAY_TYPE* = 0x807B.GLenum
  GL_VERTEX_ARRAY_STRIDE* = 0x807C.GLenum
  GL_NORMAL_ARRAY_TYPE* = 0x807E.GLenum
  GL_NORMAL_ARRAY_STRIDE* = 0x807F.GLenum
  GL_COLOR_ARRAY_SIZE* = 0x8081.GLenum
  GL_COLOR_ARRAY_TYPE* = 0x8082.GLenum
  GL_COLOR_ARRAY_STRIDE* = 0x8083.GLenum
  GL_INDEX_ARRAY_TYPE* = 0x8085.GLenum
  GL_INDEX_ARRAY_STRIDE* = 0x8086.GLenum
  GL_TEXTURE_COORD_ARRAY_SIZE* = 0x8088.GLenum
  GL_TEXTURE_COORD_ARRAY_TYPE* = 0x8089.GLenum
  GL_TEXTURE_COORD_ARRAY_STRIDE* = 0x808A.GLenum
  GL_EDGE_FLAG_ARRAY_STRIDE* = 0x808C.GLenum
  GL_TEXTURE_LUMINANCE_SIZE* = 0x8060.GLenum
  GL_TEXTURE_INTENSITY_SIZE* = 0x8061.GLenum
  GL_TEXTURE_PRIORITY* = 0x8066.GLenum
  GL_TEXTURE_RESIDENT* = 0x8067.GLenum
  GL_ALPHA4* = 0x803B.GLenum
  GL_ALPHA8* = 0x803C.GLenum
  GL_ALPHA12* = 0x803D.GLenum
  GL_ALPHA16* = 0x803E.GLenum
  GL_LUMINANCE4* = 0x803F.GLenum
  GL_LUMINANCE8* = 0x8040.GLenum
  GL_LUMINANCE12* = 0x8041.GLenum
  GL_LUMINANCE16* = 0x8042.GLenum
  GL_LUMINANCE4_ALPHA4* = 0x8043.GLenum
  GL_LUMINANCE6_ALPHA2* = 0x8044.GLenum
  GL_LUMINANCE8_ALPHA8* = 0x8045.GLenum
  GL_LUMINANCE12_ALPHA4* = 0x8046.GLenum
  GL_LUMINANCE12_ALPHA12* = 0x8047.GLenum
  GL_LUMINANCE16_ALPHA16* = 0x8048.GLenum
  GL_INTENSITY* = 0x8049.GLenum
  GL_INTENSITY4* = 0x804A.GLenum
  GL_INTENSITY8* = 0x804B.GLenum
  GL_INTENSITY12* = 0x804C.GLenum
  GL_INTENSITY16* = 0x804D.GLenum
  GL_V2F* = 0x2A20.GLenum
  GL_V3F* = 0x2A21.GLenum
  GL_C4UB_V2F* = 0x2A22.GLenum
  GL_C4UB_V3F* = 0x2A23.GLenum
  GL_C3F_V3F* = 0x2A24.GLenum
  GL_N3F_V3F* = 0x2A25.GLenum
  GL_C4F_N3F_V3F* = 0x2A26.GLenum
  GL_T2F_V3F* = 0x2A27.GLenum
  GL_T4F_V4F* = 0x2A28.GLenum
  GL_T2F_C4UB_V3F* = 0x2A29.GLenum
  GL_T2F_C3F_V3F* = 0x2A2A.GLenum
  GL_T2F_N3F_V3F* = 0x2A2B.GLenum
  GL_T2F_C4F_N3F_V3F* = 0x2A2C.GLenum
  GL_T4F_C4F_N3F_V4F* = 0x2A2D.GLenum
  GL_UNSIGNED_BYTE_3_3_2* = 0x8032.GLenum
  GL_UNSIGNED_SHORT_4_4_4_4* = 0x8033.GLenum
  GL_UNSIGNED_SHORT_5_5_5_1* = 0x8034.GLenum
  GL_UNSIGNED_INT_8_8_8_8* = 0x8035.GLenum
  GL_UNSIGNED_INT_10_10_10_2* = 0x8036.GLenum
  GL_TEXTURE_BINDING_3D* = 0x806A.GLenum
  GL_PACK_SKIP_IMAGES* = 0x806B.GLenum
  GL_PACK_IMAGE_HEIGHT* = 0x806C.GLenum
  GL_UNPACK_SKIP_IMAGES* = 0x806D.GLenum
  GL_UNPACK_IMAGE_HEIGHT* = 0x806E.GLenum
  GL_TEXTURE_3D* = 0x806F.GLenum
  GL_PROXY_TEXTURE_3D* = 0x8070.GLenum
  GL_TEXTURE_DEPTH* = 0x8071.GLenum
  GL_TEXTURE_WRAP_R* = 0x8072.GLenum
  GL_MAX_3D_TEXTURE_SIZE* = 0x8073.GLenum
  GL_UNSIGNED_BYTE_2_3_3_REV* = 0x8362.GLenum
  GL_UNSIGNED_SHORT_5_6_5* = 0x8363.GLenum
  GL_UNSIGNED_SHORT_5_6_5_REV* = 0x8364.GLenum
  GL_UNSIGNED_SHORT_4_4_4_4_REV* = 0x8365.GLenum
  GL_UNSIGNED_SHORT_1_5_5_5_REV* = 0x8366.GLenum
  GL_UNSIGNED_INT_8_8_8_8_REV* = 0x8367.GLenum
  GL_UNSIGNED_INT_2_10_10_10_REV* = 0x8368.GLenum
  GL_BGR* = 0x80E0.GLenum
  GL_BGRA* = 0x80E1.GLenum
  GL_MAX_ELEMENTS_VERTICES* = 0x80E8.GLenum
  GL_MAX_ELEMENTS_INDICES* = 0x80E9.GLenum
  GL_CLAMP_TO_EDGE* = 0x812F.GLenum
  GL_TEXTURE_MIN_LOD* = 0x813A.GLenum
  GL_TEXTURE_MAX_LOD* = 0x813B.GLenum
  GL_TEXTURE_BASE_LEVEL* = 0x813C.GLenum
  GL_TEXTURE_MAX_LEVEL* = 0x813D.GLenum
  GL_SMOOTH_POINT_SIZE_RANGE* = 0x0B12.GLenum
  GL_SMOOTH_POINT_SIZE_GRANULARITY* = 0x0B13.GLenum
  GL_SMOOTH_LINE_WIDTH_RANGE* = 0x0B22.GLenum
  GL_SMOOTH_LINE_WIDTH_GRANULARITY* = 0x0B23.GLenum
  GL_ALIASED_LINE_WIDTH_RANGE* = 0x846E.GLenum
  GL_RESCALE_NORMAL* = 0x803A.GLenum
  GL_LIGHT_MODEL_COLOR_CONTROL* = 0x81F8.GLenum
  GL_SINGLE_COLOR* = 0x81F9.GLenum
  GL_SEPARATE_SPECULAR_COLOR* = 0x81FA.GLenum
  GL_ALIASED_POINT_SIZE_RANGE* = 0x846D.GLenum
  GL_TEXTURE0* = 0x84C0.GLenum
  GL_TEXTURE1* = 0x84C1.GLenum
  GL_TEXTURE2* = 0x84C2.GLenum
  GL_TEXTURE3* = 0x84C3.GLenum
  GL_TEXTURE4* = 0x84C4.GLenum
  GL_TEXTURE5* = 0x84C5.GLenum
  GL_TEXTURE6* = 0x84C6.GLenum
  GL_TEXTURE7* = 0x84C7.GLenum
  GL_TEXTURE8* = 0x84C8.GLenum
  GL_TEXTURE9* = 0x84C9.GLenum
  GL_TEXTURE10* = 0x84CA.GLenum
  GL_TEXTURE11* = 0x84CB.GLenum
  GL_TEXTURE12* = 0x84CC.GLenum
  GL_TEXTURE13* = 0x84CD.GLenum
  GL_TEXTURE14* = 0x84CE.GLenum
  GL_TEXTURE15* = 0x84CF.GLenum
  GL_TEXTURE16* = 0x84D0.GLenum
  GL_TEXTURE17* = 0x84D1.GLenum
  GL_TEXTURE18* = 0x84D2.GLenum
  GL_TEXTURE19* = 0x84D3.GLenum
  GL_TEXTURE20* = 0x84D4.GLenum
  GL_TEXTURE21* = 0x84D5.GLenum
  GL_TEXTURE22* = 0x84D6.GLenum
  GL_TEXTURE23* = 0x84D7.GLenum
  GL_TEXTURE24* = 0x84D8.GLenum
  GL_TEXTURE25* = 0x84D9.GLenum
  GL_TEXTURE26* = 0x84DA.GLenum
  GL_TEXTURE27* = 0x84DB.GLenum
  GL_TEXTURE28* = 0x84DC.GLenum
  GL_TEXTURE29* = 0x84DD.GLenum
  GL_TEXTURE30* = 0x84DE.GLenum
  GL_TEXTURE31* = 0x84DF.GLenum
  GL_ACTIVE_TEXTURE* = 0x84E0.GLenum
  GL_MULTISAMPLE* = 0x809D.GLenum
  GL_SAMPLE_ALPHA_TO_COVERAGE* = 0x809E.GLenum
  GL_SAMPLE_ALPHA_TO_ONE* = 0x809F.GLenum
  GL_SAMPLE_COVERAGE* = 0x80A0.GLenum
  GL_SAMPLE_BUFFERS* = 0x80A8.GLenum
  GL_SAMPLES* = 0x80A9.GLenum
  GL_SAMPLE_COVERAGE_VALUE* = 0x80AA.GLenum
  GL_SAMPLE_COVERAGE_INVERT* = 0x80AB.GLenum
  GL_TEXTURE_CUBE_MAP* = 0x8513.GLenum
  GL_TEXTURE_BINDING_CUBE_MAP* = 0x8514.GLenum
  GL_TEXTURE_CUBE_MAP_POSITIVE_X* = 0x8515.GLenum
  GL_TEXTURE_CUBE_MAP_NEGATIVE_X* = 0x8516.GLenum
  GL_TEXTURE_CUBE_MAP_POSITIVE_Y* = 0x8517.GLenum
  GL_TEXTURE_CUBE_MAP_NEGATIVE_Y* = 0x8518.GLenum
  GL_TEXTURE_CUBE_MAP_POSITIVE_Z* = 0x8519.GLenum
  GL_TEXTURE_CUBE_MAP_NEGATIVE_Z* = 0x851A.GLenum
  GL_PROXY_TEXTURE_CUBE_MAP* = 0x851B.GLenum
  GL_MAX_CUBE_MAP_TEXTURE_SIZE* = 0x851C.GLenum
  GL_COMPRESSED_RGB* = 0x84ED.GLenum
  GL_COMPRESSED_RGBA* = 0x84EE.GLenum
  GL_TEXTURE_COMPRESSION_HINT* = 0x84EF.GLenum
  GL_TEXTURE_COMPRESSED_IMAGE_SIZE* = 0x86A0.GLenum
  GL_TEXTURE_COMPRESSED* = 0x86A1.GLenum
  GL_NUM_COMPRESSED_TEXTURE_FORMATS* = 0x86A2.GLenum
  GL_COMPRESSED_TEXTURE_FORMATS* = 0x86A3.GLenum
  GL_CLAMP_TO_BORDER* = 0x812D.GLenum
  GL_CLIENT_ACTIVE_TEXTURE* = 0x84E1.GLenum
  GL_MAX_TEXTURE_UNITS* = 0x84E2.GLenum
  GL_TRANSPOSE_MODELVIEW_MATRIX* = 0x84E3.GLenum
  GL_TRANSPOSE_PROJECTION_MATRIX* = 0x84E4.GLenum
  GL_TRANSPOSE_TEXTURE_MATRIX* = 0x84E5.GLenum
  GL_TRANSPOSE_COLOR_MATRIX* = 0x84E6.GLenum
  GL_MULTISAMPLE_BIT* = 0x20000000.GLbitfield
  GL_NORMAL_MAP* = 0x8511.GLenum
  GL_REFLECTION_MAP* = 0x8512.GLenum
  GL_COMPRESSED_ALPHA* = 0x84E9.GLenum
  GL_COMPRESSED_LUMINANCE* = 0x84EA.GLenum
  GL_COMPRESSED_LUMINANCE_ALPHA* = 0x84EB.GLenum
  GL_COMPRESSED_INTENSITY* = 0x84EC.GLenum
  GL_COMBINE* = 0x8570.GLenum
  GL_COMBINE_RGB* = 0x8571.GLenum
  GL_COMBINE_ALPHA* = 0x8572.GLenum
  GL_SOURCE0_RGB* = 0x8580.GLenum
  GL_SOURCE1_RGB* = 0x8581.GLenum
  GL_SOURCE2_RGB* = 0x8582.GLenum
  GL_SOURCE0_ALPHA* = 0x8588.GLenum
  GL_SOURCE1_ALPHA* = 0x8589.GLenum
  GL_SOURCE2_ALPHA* = 0x858A.GLenum
  GL_OPERAND0_RGB* = 0x8590.GLenum
  GL_OPERAND1_RGB* = 0x8591.GLenum
  GL_OPERAND2_RGB* = 0x8592.GLenum
  GL_OPERAND0_ALPHA* = 0x8598.GLenum
  GL_OPERAND1_ALPHA* = 0x8599.GLenum
  GL_OPERAND2_ALPHA* = 0x859A.GLenum
  GL_RGB_SCALE* = 0x8573.GLenum
  GL_ADD_SIGNED* = 0x8574.GLenum
  GL_INTERPOLATE* = 0x8575.GLenum
  GL_SUBTRACT* = 0x84E7.GLenum
  GL_CONSTANT* = 0x8576.GLenum
  GL_PRIMARY_COLOR* = 0x8577.GLenum
  GL_PREVIOUS* = 0x8578.GLenum
  GL_DOT3_RGB* = 0x86AE.GLenum
  GL_DOT3_RGBA* = 0x86AF.GLenum
  GL_BLEND_DST_RGB* = 0x80C8.GLenum
  GL_BLEND_SRC_RGB* = 0x80C9.GLenum
  GL_BLEND_DST_ALPHA* = 0x80CA.GLenum
  GL_BLEND_SRC_ALPHA* = 0x80CB.GLenum
  GL_POINT_FADE_THRESHOLD_SIZE* = 0x8128.GLenum
  GL_DEPTH_COMPONENT16* = 0x81A5.GLenum
  GL_DEPTH_COMPONENT24* = 0x81A6.GLenum
  GL_DEPTH_COMPONENT32* = 0x81A7.GLenum
  GL_MIRRORED_REPEAT* = 0x8370.GLenum
  GL_MAX_TEXTURE_LOD_BIAS* = 0x84FD.GLenum
  GL_TEXTURE_LOD_BIAS* = 0x8501.GLenum
  GL_INCR_WRAP* = 0x8507.GLenum
  GL_DECR_WRAP* = 0x8508.GLenum
  GL_TEXTURE_DEPTH_SIZE* = 0x884A.GLenum
  GL_TEXTURE_COMPARE_MODE* = 0x884C.GLenum
  GL_TEXTURE_COMPARE_FUNC* = 0x884D.GLenum
  GL_POINT_SIZE_MIN* = 0x8126.GLenum
  GL_POINT_SIZE_MAX* = 0x8127.GLenum
  GL_POINT_DISTANCE_ATTENUATION* = 0x8129.GLenum
  GL_GENERATE_MIPMAP* = 0x8191.GLenum
  GL_GENERATE_MIPMAP_HINT* = 0x8192.GLenum
  GL_FOG_COORDINATE_SOURCE* = 0x8450.GLenum
  GL_FOG_COORDINATE* = 0x8451.GLenum
  GL_FRAGMENT_DEPTH* = 0x8452.GLenum
  GL_CURRENT_FOG_COORDINATE* = 0x8453.GLenum
  GL_FOG_COORDINATE_ARRAY_TYPE* = 0x8454.GLenum
  GL_FOG_COORDINATE_ARRAY_STRIDE* = 0x8455.GLenum
  GL_FOG_COORDINATE_ARRAY_POINTER* = 0x8456.GLenum
  GL_FOG_COORDINATE_ARRAY* = 0x8457.GLenum
  GL_COLOR_SUM* = 0x8458.GLenum
  GL_CURRENT_SECONDARY_COLOR* = 0x8459.GLenum
  GL_SECONDARY_COLOR_ARRAY_SIZE* = 0x845A.GLenum
  GL_SECONDARY_COLOR_ARRAY_TYPE* = 0x845B.GLenum
  GL_SECONDARY_COLOR_ARRAY_STRIDE* = 0x845C.GLenum
  GL_SECONDARY_COLOR_ARRAY_POINTER* = 0x845D.GLenum
  GL_SECONDARY_COLOR_ARRAY* = 0x845E.GLenum
  GL_TEXTURE_FILTER_CONTROL* = 0x8500.GLenum
  GL_DEPTH_TEXTURE_MODE* = 0x884B.GLenum
  GL_COMPARE_R_TO_TEXTURE* = 0x884E.GLenum
  GL_BLEND_COLOR* = 0x8005.GLenum
  GL_BLEND_EQUATION* = 0x8009.GLenum
  GL_CONSTANT_COLOR* = 0x8001.GLenum
  GL_ONE_MINUS_CONSTANT_COLOR* = 0x8002.GLenum
  GL_CONSTANT_ALPHA* = 0x8003.GLenum
  GL_ONE_MINUS_CONSTANT_ALPHA* = 0x8004.GLenum
  GL_FUNC_ADD* = 0x8006.GLenum
  GL_FUNC_REVERSE_SUBTRACT* = 0x800B.GLenum
  GL_FUNC_SUBTRACT* = 0x800A.GLenum
  GL_MIN* = 0x8007.GLenum
  GL_MAX* = 0x8008.GLenum
  GL_BUFFER_SIZE* = 0x8764.GLenum
  GL_BUFFER_USAGE* = 0x8765.GLenum
  GL_QUERY_COUNTER_BITS* = 0x8864.GLbitfield
  GL_CURRENT_QUERY* = 0x8865.GLenum
  GL_QUERY_RESULT* = 0x8866.GLenum
  GL_QUERY_RESULT_AVAILABLE* = 0x8867.GLenum
  GL_ARRAY_BUFFER* = 0x8892.GLenum
  GL_ELEMENT_ARRAY_BUFFER* = 0x8893.GLenum
  GL_ARRAY_BUFFER_BINDING* = 0x8894.GLenum
  GL_ELEMENT_ARRAY_BUFFER_BINDING* = 0x8895.GLenum
  GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING* = 0x889F.GLenum
  GL_READ_ONLY* = 0x88B8.GLenum
  GL_WRITE_ONLY* = 0x88B9.GLenum
  GL_READ_WRITE* = 0x88BA.GLenum
  GL_BUFFER_ACCESS* = 0x88BB.GLenum
  GL_BUFFER_MAPPED* = 0x88BC.GLenum
  GL_BUFFER_MAP_POINTER* = 0x88BD.GLenum
  GL_STREAM_DRAW* = 0x88E0.GLenum
  GL_STREAM_READ* = 0x88E1.GLenum
  GL_STREAM_COPY* = 0x88E2.GLenum
  GL_STATIC_DRAW* = 0x88E4.GLenum
  GL_STATIC_READ* = 0x88E5.GLenum
  GL_STATIC_COPY* = 0x88E6.GLenum
  GL_DYNAMIC_DRAW* = 0x88E8.GLenum
  GL_DYNAMIC_READ* = 0x88E9.GLenum
  GL_DYNAMIC_COPY* = 0x88EA.GLenum
  GL_SAMPLES_PASSED* = 0x8914.GLenum
  GL_SRC1_ALPHA* = 0x8589.GLenum
  GL_VERTEX_ARRAY_BUFFER_BINDING* = 0x8896.GLenum
  GL_NORMAL_ARRAY_BUFFER_BINDING* = 0x8897.GLenum
  GL_COLOR_ARRAY_BUFFER_BINDING* = 0x8898.GLenum
  GL_INDEX_ARRAY_BUFFER_BINDING* = 0x8899.GLenum
  GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING* = 0x889A.GLenum
  GL_EDGE_FLAG_ARRAY_BUFFER_BINDING* = 0x889B.GLenum
  GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING* = 0x889C.GLenum
  GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING* = 0x889D.GLenum
  GL_WEIGHT_ARRAY_BUFFER_BINDING* = 0x889E.GLenum
  GL_FOG_COORD_SRC* = 0x8450.GLenum
  GL_FOG_COORD* = 0x8451.GLenum
  GL_CURRENT_FOG_COORD* = 0x8453.GLenum
  GL_FOG_COORD_ARRAY_TYPE* = 0x8454.GLenum
  GL_FOG_COORD_ARRAY_STRIDE* = 0x8455.GLenum
  GL_FOG_COORD_ARRAY_POINTER* = 0x8456.GLenum
  GL_FOG_COORD_ARRAY* = 0x8457.GLenum
  GL_FOG_COORD_ARRAY_BUFFER_BINDING* = 0x889D.GLenum
  GL_SRC0_RGB* = 0x8580.GLenum
  GL_SRC1_RGB* = 0x8581.GLenum
  GL_SRC2_RGB* = 0x8582.GLenum
  GL_SRC0_ALPHA* = 0x8588.GLenum
  GL_SRC2_ALPHA* = 0x858A.GLenum
  GL_BLEND_EQUATION_RGB* = 0x8009.GLenum
  GL_VERTEX_ATTRIB_ARRAY_ENABLED* = 0x8622.GLenum
  GL_VERTEX_ATTRIB_ARRAY_SIZE* = 0x8623.GLenum
  GL_VERTEX_ATTRIB_ARRAY_STRIDE* = 0x8624.GLenum
  GL_VERTEX_ATTRIB_ARRAY_TYPE* = 0x8625.GLenum
  GL_CURRENT_VERTEX_ATTRIB* = 0x8626.GLenum
  GL_VERTEX_PROGRAM_POINT_SIZE* = 0x8642.GLenum
  GL_VERTEX_ATTRIB_ARRAY_POINTER* = 0x8645.GLenum
  GL_STENCIL_BACK_FUNC* = 0x8800.GLenum
  GL_STENCIL_BACK_FAIL* = 0x8801.GLenum
  GL_STENCIL_BACK_PASS_DEPTH_FAIL* = 0x8802.GLenum
  GL_STENCIL_BACK_PASS_DEPTH_PASS* = 0x8803.GLenum
  GL_MAX_DRAW_BUFFERS* = 0x8824.GLenum
  GL_DRAW_BUFFER0* = 0x8825.GLenum
  GL_DRAW_BUFFER1* = 0x8826.GLenum
  GL_DRAW_BUFFER2* = 0x8827.GLenum
  GL_DRAW_BUFFER3* = 0x8828.GLenum
  GL_DRAW_BUFFER4* = 0x8829.GLenum
  GL_DRAW_BUFFER5* = 0x882A.GLenum
  GL_DRAW_BUFFER6* = 0x882B.GLenum
  GL_DRAW_BUFFER7* = 0x882C.GLenum
  GL_DRAW_BUFFER8* = 0x882D.GLenum
  GL_DRAW_BUFFER9* = 0x882E.GLenum
  GL_DRAW_BUFFER10* = 0x882F.GLenum
  GL_DRAW_BUFFER11* = 0x8830.GLenum
  GL_DRAW_BUFFER12* = 0x8831.GLenum
  GL_DRAW_BUFFER13* = 0x8832.GLenum
  GL_DRAW_BUFFER14* = 0x8833.GLenum
  GL_DRAW_BUFFER15* = 0x8834.GLenum
  GL_BLEND_EQUATION_ALPHA* = 0x883D.GLenum
  GL_MAX_VERTEX_ATTRIBS* = 0x8869.GLenum
  GL_VERTEX_ATTRIB_ARRAY_NORMALIZED* = 0x886A.GLenum
  GL_MAX_TEXTURE_IMAGE_UNITS* = 0x8872.GLenum
  GL_FRAGMENT_SHADER* = 0x8B30.GLenum
  GL_VERTEX_SHADER* = 0x8B31.GLenum
  GL_MAX_FRAGMENT_UNIFORM_COMPONENTS* = 0x8B49.GLenum
  GL_MAX_VERTEX_UNIFORM_COMPONENTS* = 0x8B4A.GLenum
  GL_MAX_VARYING_FLOATS* = 0x8B4B.GLenum
  GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS* = 0x8B4C.GLenum
  GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS* = 0x8B4D.GLenum
  GL_SHADER_TYPE* = 0x8B4F.GLenum
  GL_FLOAT_VEC2* = 0x8B50.GLenum
  GL_FLOAT_VEC3* = 0x8B51.GLenum
  GL_FLOAT_VEC4* = 0x8B52.GLenum
  GL_INT_VEC2* = 0x8B53.GLenum
  GL_INT_VEC3* = 0x8B54.GLenum
  GL_INT_VEC4* = 0x8B55.GLenum
  GL_BOOL* = 0x8B56.GLenum
  GL_BOOL_VEC2* = 0x8B57.GLenum
  GL_BOOL_VEC3* = 0x8B58.GLenum
  GL_BOOL_VEC4* = 0x8B59.GLenum
  GL_FLOAT_MAT2* = 0x8B5A.GLenum
  GL_FLOAT_MAT3* = 0x8B5B.GLenum
  GL_FLOAT_MAT4* = 0x8B5C.GLenum
  GL_SAMPLER_1D* = 0x8B5D.GLenum
  GL_SAMPLER_2D* = 0x8B5E.GLenum
  GL_SAMPLER_3D* = 0x8B5F.GLenum
  GL_SAMPLER_CUBE* = 0x8B60.GLenum
  GL_SAMPLER_1D_SHADOW* = 0x8B61.GLenum
  GL_SAMPLER_2D_SHADOW* = 0x8B62.GLenum
  GL_DELETE_STATUS* = 0x8B80.GLenum
  GL_COMPILE_STATUS* = 0x8B81.GLenum
  GL_LINK_STATUS* = 0x8B82.GLenum
  GL_VALIDATE_STATUS* = 0x8B83.GLenum
  GL_INFO_LOG_LENGTH* = 0x8B84.GLenum
  GL_ATTACHED_SHADERS* = 0x8B85.GLenum
  GL_ACTIVE_UNIFORMS* = 0x8B86.GLenum
  GL_ACTIVE_UNIFORM_MAX_LENGTH* = 0x8B87.GLenum
  GL_SHADER_SOURCE_LENGTH* = 0x8B88.GLenum
  GL_ACTIVE_ATTRIBUTES* = 0x8B89.GLenum
  GL_ACTIVE_ATTRIBUTE_MAX_LENGTH* = 0x8B8A.GLenum
  GL_FRAGMENT_SHADER_DERIVATIVE_HINT* = 0x8B8B.GLenum
  GL_SHADING_LANGUAGE_VERSION* = 0x8B8C.GLenum
  GL_CURRENT_PROGRAM* = 0x8B8D.GLenum
  GL_POINT_SPRITE_COORD_ORIGIN* = 0x8CA0.GLenum
  GL_LOWER_LEFT* = 0x8CA1.GLenum
  GL_UPPER_LEFT* = 0x8CA2.GLenum
  GL_STENCIL_BACK_REF* = 0x8CA3.GLenum
  GL_STENCIL_BACK_VALUE_MASK* = 0x8CA4.GLenum
  GL_STENCIL_BACK_WRITEMASK* = 0x8CA5.GLenum
  GL_VERTEX_PROGRAM_TWO_SIDE* = 0x8643.GLenum
  GL_POINT_SPRITE* = 0x8861.GLenum
  GL_COORD_REPLACE* = 0x8862.GLenum
  GL_MAX_TEXTURE_COORDS* = 0x8871.GLenum
  GL_PIXEL_PACK_BUFFER* = 0x88EB.GLenum
  GL_PIXEL_UNPACK_BUFFER* = 0x88EC.GLenum
  GL_PIXEL_PACK_BUFFER_BINDING* = 0x88ED.GLenum
  GL_PIXEL_UNPACK_BUFFER_BINDING* = 0x88EF.GLenum
  GL_FLOAT_MAT2x3* = 0x8B65.GLenum
  GL_FLOAT_MAT2x4* = 0x8B66.GLenum
  GL_FLOAT_MAT3x2* = 0x8B67.GLenum
  GL_FLOAT_MAT3x4* = 0x8B68.GLenum
  GL_FLOAT_MAT4x2* = 0x8B69.GLenum
  GL_FLOAT_MAT4x3* = 0x8B6A.GLenum
  GL_SRGB* = 0x8C40.GLenum
  GL_SRGB8* = 0x8C41.GLenum
  GL_SRGB_ALPHA* = 0x8C42.GLenum
  GL_SRGB8_ALPHA8* = 0x8C43.GLenum
  GL_COMPRESSED_SRGB* = 0x8C48.GLenum
  GL_COMPRESSED_SRGB_ALPHA* = 0x8C49.GLenum
  GL_CURRENT_RASTER_SECONDARY_COLOR* = 0x845F.GLenum
  GL_SLUMINANCE_ALPHA* = 0x8C44.GLenum
  GL_SLUMINANCE8_ALPHA8* = 0x8C45.GLenum
  GL_SLUMINANCE* = 0x8C46.GLenum
  GL_SLUMINANCE8* = 0x8C47.GLenum
  GL_COMPRESSED_SLUMINANCE* = 0x8C4A.GLenum
  GL_COMPRESSED_SLUMINANCE_ALPHA* = 0x8C4B.GLenum
  GL_COMPARE_REF_TO_TEXTURE* = 0x884E.GLenum
  GL_CLIP_DISTANCE0* = 0x3000.GLenum
  GL_CLIP_DISTANCE1* = 0x3001.GLenum
  GL_CLIP_DISTANCE2* = 0x3002.GLenum
  GL_CLIP_DISTANCE3* = 0x3003.GLenum
  GL_CLIP_DISTANCE4* = 0x3004.GLenum
  GL_CLIP_DISTANCE5* = 0x3005.GLenum
  GL_CLIP_DISTANCE6* = 0x3006.GLenum
  GL_CLIP_DISTANCE7* = 0x3007.GLenum
  GL_MAX_CLIP_DISTANCES* = 0x0D32.GLenum
  GL_MAJOR_VERSION* = 0x821B.GLenum
  GL_MINOR_VERSION* = 0x821C.GLenum
  GL_NUM_EXTENSIONS* = 0x821D.GLenum
  GL_CONTEXT_FLAGS* = 0x821E.GLenum
  GL_COMPRESSED_RED* = 0x8225.GLenum
  GL_COMPRESSED_RG* = 0x8226.GLenum
  GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT* = 0x00000001.GLbitfield
  GL_RGBA32F* = 0x8814.GLenum
  GL_RGB32F* = 0x8815.GLenum
  GL_RGBA16F* = 0x881A.GLenum
  GL_RGB16F* = 0x881B.GLenum
  GL_VERTEX_ATTRIB_ARRAY_INTEGER* = 0x88FD.GLenum
  GL_MAX_ARRAY_TEXTURE_LAYERS* = 0x88FF.GLenum
  GL_MIN_PROGRAM_TEXEL_OFFSET* = 0x8904.GLenum
  GL_MAX_PROGRAM_TEXEL_OFFSET* = 0x8905.GLenum
  GL_CLAMP_READ_COLOR* = 0x891C.GLenum
  GL_FIXED_ONLY* = 0x891D.GLenum
  GL_MAX_VARYING_COMPONENTS* = 0x8B4B.GLenum
  GL_TEXTURE_1D_ARRAY* = 0x8C18.GLenum
  GL_PROXY_TEXTURE_1D_ARRAY* = 0x8C19.GLenum
  GL_TEXTURE_2D_ARRAY* = 0x8C1A.GLenum
  GL_PROXY_TEXTURE_2D_ARRAY* = 0x8C1B.GLenum
  GL_TEXTURE_BINDING_1D_ARRAY* = 0x8C1C.GLenum
  GL_TEXTURE_BINDING_2D_ARRAY* = 0x8C1D.GLenum
  GL_R11F_G11F_B10F* = 0x8C3A.GLenum
  GL_UNSIGNED_INT_10F_11F_11F_REV* = 0x8C3B.GLenum
  GL_RGB9_E5* = 0x8C3D.GLenum
  GL_UNSIGNED_INT_5_9_9_9_REV* = 0x8C3E.GLenum
  GL_TEXTURE_SHARED_SIZE* = 0x8C3F.GLenum
  GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH* = 0x8C76.GLenum
  GL_TRANSFORM_FEEDBACK_BUFFER_MODE* = 0x8C7F.GLenum
  GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS* = 0x8C80.GLenum
  GL_TRANSFORM_FEEDBACK_VARYINGS* = 0x8C83.GLenum
  GL_TRANSFORM_FEEDBACK_BUFFER_START* = 0x8C84.GLenum
  GL_TRANSFORM_FEEDBACK_BUFFER_SIZE* = 0x8C85.GLenum
  GL_PRIMITIVES_GENERATED* = 0x8C87.GLenum
  GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN* = 0x8C88.GLenum
  GL_RASTERIZER_DISCARD* = 0x8C89.GLenum
  GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS* = 0x8C8A.GLenum
  GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS* = 0x8C8B.GLenum
  GL_INTERLEAVED_ATTRIBS* = 0x8C8C.GLenum
  GL_SEPARATE_ATTRIBS* = 0x8C8D.GLenum
  GL_TRANSFORM_FEEDBACK_BUFFER* = 0x8C8E.GLenum
  GL_TRANSFORM_FEEDBACK_BUFFER_BINDING* = 0x8C8F.GLenum
  GL_RGBA32UI* = 0x8D70.GLenum
  GL_RGB32UI* = 0x8D71.GLenum
  GL_RGBA16UI* = 0x8D76.GLenum
  GL_RGB16UI* = 0x8D77.GLenum
  GL_RGBA8UI* = 0x8D7C.GLenum
  GL_RGB8UI* = 0x8D7D.GLenum
  GL_RGBA32I* = 0x8D82.GLenum
  GL_RGB32I* = 0x8D83.GLenum
  GL_RGBA16I* = 0x8D88.GLenum
  GL_RGB16I* = 0x8D89.GLenum
  GL_RGBA8I* = 0x8D8E.GLenum
  GL_RGB8I* = 0x8D8F.GLenum
  GL_RED_INTEGER* = 0x8D94.GLenum
  GL_GREEN_INTEGER* = 0x8D95.GLenum
  GL_BLUE_INTEGER* = 0x8D96.GLenum
  GL_RGB_INTEGER* = 0x8D98.GLenum
  GL_RGBA_INTEGER* = 0x8D99.GLenum
  GL_BGR_INTEGER* = 0x8D9A.GLenum
  GL_BGRA_INTEGER* = 0x8D9B.GLenum
  GL_SAMPLER_1D_ARRAY* = 0x8DC0.GLenum
  GL_SAMPLER_2D_ARRAY* = 0x8DC1.GLenum
  GL_SAMPLER_1D_ARRAY_SHADOW* = 0x8DC3.GLenum
  GL_SAMPLER_2D_ARRAY_SHADOW* = 0x8DC4.GLenum
  GL_SAMPLER_CUBE_SHADOW* = 0x8DC5.GLenum
  GL_UNSIGNED_INT_VEC2* = 0x8DC6.GLenum
  GL_UNSIGNED_INT_VEC3* = 0x8DC7.GLenum
  GL_UNSIGNED_INT_VEC4* = 0x8DC8.GLenum
  GL_INT_SAMPLER_1D* = 0x8DC9.GLenum
  GL_INT_SAMPLER_2D* = 0x8DCA.GLenum
  GL_INT_SAMPLER_3D* = 0x8DCB.GLenum
  GL_INT_SAMPLER_CUBE* = 0x8DCC.GLenum
  GL_INT_SAMPLER_1D_ARRAY* = 0x8DCE.GLenum
  GL_INT_SAMPLER_2D_ARRAY* = 0x8DCF.GLenum
  GL_UNSIGNED_INT_SAMPLER_1D* = 0x8DD1.GLenum
  GL_UNSIGNED_INT_SAMPLER_2D* = 0x8DD2.GLenum
  GL_UNSIGNED_INT_SAMPLER_3D* = 0x8DD3.GLenum
  GL_UNSIGNED_INT_SAMPLER_CUBE* = 0x8DD4.GLenum
  GL_UNSIGNED_INT_SAMPLER_1D_ARRAY* = 0x8DD6.GLenum
  GL_UNSIGNED_INT_SAMPLER_2D_ARRAY* = 0x8DD7.GLenum
  GL_QUERY_WAIT* = 0x8E13.GLenum
  GL_QUERY_NO_WAIT* = 0x8E14.GLenum
  GL_QUERY_BY_REGION_WAIT* = 0x8E15.GLenum
  GL_QUERY_BY_REGION_NO_WAIT* = 0x8E16.GLenum
  GL_BUFFER_ACCESS_FLAGS* = 0x911F.GLenum
  GL_BUFFER_MAP_LENGTH* = 0x9120.GLenum
  GL_BUFFER_MAP_OFFSET* = 0x9121.GLenum
  GL_DEPTH_COMPONENT32F* = 0x8CAC.GLenum
  GL_DEPTH32F_STENCIL8* = 0x8CAD.GLenum
  GL_FLOAT_32_UNSIGNED_INT_24_8_REV* = 0x8DAD.GLenum
  GL_INVALID_FRAMEBUFFER_OPERATION* = 0x0506.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING* = 0x8210.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE* = 0x8211.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE* = 0x8212.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE* = 0x8213.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE* = 0x8214.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE* = 0x8215.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE* = 0x8216.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE* = 0x8217.GLenum
  GL_FRAMEBUFFER_DEFAULT* = 0x8218.GLenum
  GL_FRAMEBUFFER_UNDEFINED* = 0x8219.GLenum
  GL_DEPTH_STENCIL_ATTACHMENT* = 0x821A.GLenum
  GL_MAX_RENDERBUFFER_SIZE* = 0x84E8.GLenum
  GL_DEPTH_STENCIL* = 0x84F9.GLenum
  GL_UNSIGNED_INT_24_8* = 0x84FA.GLenum
  GL_DEPTH24_STENCIL8* = 0x88F0.GLenum
  GL_TEXTURE_STENCIL_SIZE* = 0x88F1.GLenum
  GL_TEXTURE_RED_TYPE* = 0x8C10.GLenum
  GL_TEXTURE_GREEN_TYPE* = 0x8C11.GLenum
  GL_TEXTURE_BLUE_TYPE* = 0x8C12.GLenum
  GL_TEXTURE_ALPHA_TYPE* = 0x8C13.GLenum
  GL_TEXTURE_DEPTH_TYPE* = 0x8C16.GLenum
  GL_UNSIGNED_NORMALIZED* = 0x8C17.GLenum
  GL_FRAMEBUFFER_BINDING* = 0x8CA6.GLenum
  GL_DRAW_FRAMEBUFFER_BINDING* = 0x8CA6.GLenum
  GL_RENDERBUFFER_BINDING* = 0x8CA7.GLenum
  GL_READ_FRAMEBUFFER* = 0x8CA8.GLenum
  GL_DRAW_FRAMEBUFFER* = 0x8CA9.GLenum
  GL_READ_FRAMEBUFFER_BINDING* = 0x8CAA.GLenum
  GL_RENDERBUFFER_SAMPLES* = 0x8CAB.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE* = 0x8CD0.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME* = 0x8CD1.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL* = 0x8CD2.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE* = 0x8CD3.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER* = 0x8CD4.GLenum
  GL_FRAMEBUFFER_COMPLETE* = 0x8CD5.GLenum
  GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT* = 0x8CD6.GLenum
  GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT* = 0x8CD7.GLenum
  GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER* = 0x8CDB.GLenum
  GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER* = 0x8CDC.GLenum
  GL_FRAMEBUFFER_UNSUPPORTED* = 0x8CDD.GLenum
  GL_MAX_COLOR_ATTACHMENTS* = 0x8CDF.GLenum
  GL_COLOR_ATTACHMENT0* = 0x8CE0.GLenum
  GL_COLOR_ATTACHMENT1* = 0x8CE1.GLenum
  GL_COLOR_ATTACHMENT2* = 0x8CE2.GLenum
  GL_COLOR_ATTACHMENT3* = 0x8CE3.GLenum
  GL_COLOR_ATTACHMENT4* = 0x8CE4.GLenum
  GL_COLOR_ATTACHMENT5* = 0x8CE5.GLenum
  GL_COLOR_ATTACHMENT6* = 0x8CE6.GLenum
  GL_COLOR_ATTACHMENT7* = 0x8CE7.GLenum
  GL_COLOR_ATTACHMENT8* = 0x8CE8.GLenum
  GL_COLOR_ATTACHMENT9* = 0x8CE9.GLenum
  GL_COLOR_ATTACHMENT10* = 0x8CEA.GLenum
  GL_COLOR_ATTACHMENT11* = 0x8CEB.GLenum
  GL_COLOR_ATTACHMENT12* = 0x8CEC.GLenum
  GL_COLOR_ATTACHMENT13* = 0x8CED.GLenum
  GL_COLOR_ATTACHMENT14* = 0x8CEE.GLenum
  GL_COLOR_ATTACHMENT15* = 0x8CEF.GLenum
  GL_COLOR_ATTACHMENT16* = 0x8CF0.GLenum
  GL_COLOR_ATTACHMENT17* = 0x8CF1.GLenum
  GL_COLOR_ATTACHMENT18* = 0x8CF2.GLenum
  GL_COLOR_ATTACHMENT19* = 0x8CF3.GLenum
  GL_COLOR_ATTACHMENT20* = 0x8CF4.GLenum
  GL_COLOR_ATTACHMENT21* = 0x8CF5.GLenum
  GL_COLOR_ATTACHMENT22* = 0x8CF6.GLenum
  GL_COLOR_ATTACHMENT23* = 0x8CF7.GLenum
  GL_COLOR_ATTACHMENT24* = 0x8CF8.GLenum
  GL_COLOR_ATTACHMENT25* = 0x8CF9.GLenum
  GL_COLOR_ATTACHMENT26* = 0x8CFA.GLenum
  GL_COLOR_ATTACHMENT27* = 0x8CFB.GLenum
  GL_COLOR_ATTACHMENT28* = 0x8CFC.GLenum
  GL_COLOR_ATTACHMENT29* = 0x8CFD.GLenum
  GL_COLOR_ATTACHMENT30* = 0x8CFE.GLenum
  GL_COLOR_ATTACHMENT31* = 0x8CFF.GLenum
  GL_DEPTH_ATTACHMENT* = 0x8D00.GLenum
  GL_STENCIL_ATTACHMENT* = 0x8D20.GLenum
  GL_FRAMEBUFFER* = 0x8D40.GLenum
  GL_RENDERBUFFER* = 0x8D41.GLenum
  GL_RENDERBUFFER_WIDTH* = 0x8D42.GLenum
  GL_RENDERBUFFER_HEIGHT* = 0x8D43.GLenum
  GL_RENDERBUFFER_INTERNAL_FORMAT* = 0x8D44.GLenum
  GL_STENCIL_INDEX1* = 0x8D46.GLenum
  GL_STENCIL_INDEX4* = 0x8D47.GLenum
  GL_STENCIL_INDEX8* = 0x8D48.GLenum
  GL_STENCIL_INDEX16* = 0x8D49.GLenum
  GL_RENDERBUFFER_RED_SIZE* = 0x8D50.GLenum
  GL_RENDERBUFFER_GREEN_SIZE* = 0x8D51.GLenum
  GL_RENDERBUFFER_BLUE_SIZE* = 0x8D52.GLenum
  GL_RENDERBUFFER_ALPHA_SIZE* = 0x8D53.GLenum
  GL_RENDERBUFFER_DEPTH_SIZE* = 0x8D54.GLenum
  GL_RENDERBUFFER_STENCIL_SIZE* = 0x8D55.GLenum
  GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE* = 0x8D56.GLenum
  GL_MAX_SAMPLES* = 0x8D57.GLenum
  GL_INDEX* = 0x8222.GLenum
  GL_TEXTURE_LUMINANCE_TYPE* = 0x8C14.GLenum
  GL_TEXTURE_INTENSITY_TYPE* = 0x8C15.GLenum
  GL_FRAMEBUFFER_SRGB* = 0x8DB9.GLenum
  GL_HALF_FLOAT* = 0x140B.GLenum
  GL_MAP_READ_BIT* = 0x0001.GLbitfield
  GL_MAP_WRITE_BIT* = 0x0002.GLbitfield
  GL_MAP_INVALIDATE_RANGE_BIT* = 0x0004.GLbitfield
  GL_MAP_INVALIDATE_BUFFER_BIT* = 0x0008.GLbitfield
  GL_MAP_FLUSH_EXPLICIT_BIT* = 0x0010.GLbitfield
  GL_MAP_UNSYNCHRONIZED_BIT* = 0x0020.GLbitfield
  GL_COMPRESSED_RED_RGTC1* = 0x8DBB.GLenum
  GL_COMPRESSED_SIGNED_RED_RGTC1* = 0x8DBC.GLenum
  GL_COMPRESSED_RG_RGTC2* = 0x8DBD.GLenum
  GL_COMPRESSED_SIGNED_RG_RGTC2* = 0x8DBE.GLenum
  GL_RG* = 0x8227.GLenum
  GL_RG_INTEGER* = 0x8228.GLenum
  GL_R8* = 0x8229.GLenum
  GL_R16* = 0x822A.GLenum
  GL_RG8* = 0x822B.GLenum
  GL_RG16* = 0x822C.GLenum
  GL_R16F* = 0x822D.GLenum
  GL_R32F* = 0x822E.GLenum
  GL_RG16F* = 0x822F.GLenum
  GL_RG32F* = 0x8230.GLenum
  GL_R8I* = 0x8231.GLenum
  GL_R8UI* = 0x8232.GLenum
  GL_R16I* = 0x8233.GLenum
  GL_R16UI* = 0x8234.GLenum
  GL_R32I* = 0x8235.GLenum
  GL_R32UI* = 0x8236.GLenum
  GL_RG8I* = 0x8237.GLenum
  GL_RG8UI* = 0x8238.GLenum
  GL_RG16I* = 0x8239.GLenum
  GL_RG16UI* = 0x823A.GLenum
  GL_RG32I* = 0x823B.GLenum
  GL_RG32UI* = 0x823C.GLenum
  GL_VERTEX_ARRAY_BINDING* = 0x85B5.GLenum
  GL_CLAMP_VERTEX_COLOR* = 0x891A.GLenum
  GL_CLAMP_FRAGMENT_COLOR* = 0x891B.GLenum
  GL_ALPHA_INTEGER* = 0x8D97.GLenum
  GL_SAMPLER_2D_RECT* = 0x8B63.GLenum
  GL_SAMPLER_2D_RECT_SHADOW* = 0x8B64.GLenum
  GL_SAMPLER_BUFFER* = 0x8DC2.GLenum
  GL_INT_SAMPLER_2D_RECT* = 0x8DCD.GLenum
  GL_INT_SAMPLER_BUFFER* = 0x8DD0.GLenum
  GL_UNSIGNED_INT_SAMPLER_2D_RECT* = 0x8DD5.GLenum
  GL_UNSIGNED_INT_SAMPLER_BUFFER* = 0x8DD8.GLenum
  GL_TEXTURE_BUFFER* = 0x8C2A.GLenum
  GL_MAX_TEXTURE_BUFFER_SIZE* = 0x8C2B.GLenum
  GL_TEXTURE_BINDING_BUFFER* = 0x8C2C.GLenum
  GL_TEXTURE_BUFFER_DATA_STORE_BINDING* = 0x8C2D.GLenum
  GL_TEXTURE_RECTANGLE* = 0x84F5.GLenum
  GL_TEXTURE_BINDING_RECTANGLE* = 0x84F6.GLenum
  GL_PROXY_TEXTURE_RECTANGLE* = 0x84F7.GLenum
  GL_MAX_RECTANGLE_TEXTURE_SIZE* = 0x84F8.GLenum
  GL_R8_SNORM* = 0x8F94.GLenum
  GL_RG8_SNORM* = 0x8F95.GLenum
  GL_RGB8_SNORM* = 0x8F96.GLenum
  GL_RGBA8_SNORM* = 0x8F97.GLenum
  GL_R16_SNORM* = 0x8F98.GLenum
  GL_RG16_SNORM* = 0x8F99.GLenum
  GL_RGB16_SNORM* = 0x8F9A.GLenum
  GL_RGBA16_SNORM* = 0x8F9B.GLenum
  GL_SIGNED_NORMALIZED* = 0x8F9C.GLenum
  GL_PRIMITIVE_RESTART* = 0x8F9D.GLenum
  GL_PRIMITIVE_RESTART_INDEX* = 0x8F9E.GLenum
  GL_COPY_READ_BUFFER* = 0x8F36.GLenum
  GL_COPY_WRITE_BUFFER* = 0x8F37.GLenum
  GL_UNIFORM_BUFFER* = 0x8A11.GLenum
  GL_UNIFORM_BUFFER_BINDING* = 0x8A28.GLenum
  GL_UNIFORM_BUFFER_START* = 0x8A29.GLenum
  GL_UNIFORM_BUFFER_SIZE* = 0x8A2A.GLenum
  GL_MAX_VERTEX_UNIFORM_BLOCKS* = 0x8A2B.GLenum
  GL_MAX_GEOMETRY_UNIFORM_BLOCKS* = 0x8A2C.GLenum
  GL_MAX_FRAGMENT_UNIFORM_BLOCKS* = 0x8A2D.GLenum
  GL_MAX_COMBINED_UNIFORM_BLOCKS* = 0x8A2E.GLenum
  GL_MAX_UNIFORM_BUFFER_BINDINGS* = 0x8A2F.GLenum
  GL_MAX_UNIFORM_BLOCK_SIZE* = 0x8A30.GLenum
  GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS* = 0x8A31.GLenum
  GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS* = 0x8A32.GLenum
  GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS* = 0x8A33.GLenum
  GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT* = 0x8A34.GLenum
  GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH* = 0x8A35.GLenum
  GL_ACTIVE_UNIFORM_BLOCKS* = 0x8A36.GLenum
  GL_UNIFORM_TYPE* = 0x8A37.GLenum
  GL_UNIFORM_SIZE* = 0x8A38.GLenum
  GL_UNIFORM_NAME_LENGTH* = 0x8A39.GLenum
  GL_UNIFORM_BLOCK_INDEX* = 0x8A3A.GLenum
  GL_UNIFORM_OFFSET* = 0x8A3B.GLenum
  GL_UNIFORM_ARRAY_STRIDE* = 0x8A3C.GLenum
  GL_UNIFORM_MATRIX_STRIDE* = 0x8A3D.GLenum
  GL_UNIFORM_IS_ROW_MAJOR* = 0x8A3E.GLenum
  GL_UNIFORM_BLOCK_BINDING* = 0x8A3F.GLenum
  GL_UNIFORM_BLOCK_DATA_SIZE* = 0x8A40.GLenum
  GL_UNIFORM_BLOCK_NAME_LENGTH* = 0x8A41.GLenum
  GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS* = 0x8A42.GLenum
  GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES* = 0x8A43.GLenum
  GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER* = 0x8A44.GLenum
  GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER* = 0x8A45.GLenum
  GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER* = 0x8A46.GLenum
  GL_CONTEXT_CORE_PROFILE_BIT* = 0x00000001.GLbitfield
  GL_CONTEXT_COMPATIBILITY_PROFILE_BIT* = 0x00000002.GLbitfield
  GL_LINES_ADJACENCY* = 0x000A.GLenum
  GL_LINE_STRIP_ADJACENCY* = 0x000B.GLenum
  GL_TRIANGLES_ADJACENCY* = 0x000C.GLenum
  GL_TRIANGLE_STRIP_ADJACENCY* = 0x000D.GLenum
  GL_PROGRAM_POINT_SIZE* = 0x8642.GLenum
  GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS* = 0x8C29.GLenum
  GL_FRAMEBUFFER_ATTACHMENT_LAYERED* = 0x8DA7.GLenum
  GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS* = 0x8DA8.GLenum
  GL_GEOMETRY_SHADER* = 0x8DD9.GLenum
  GL_GEOMETRY_VERTICES_OUT* = 0x8916.GLenum
  GL_GEOMETRY_INPUT_TYPE* = 0x8917.GLenum
  GL_GEOMETRY_OUTPUT_TYPE* = 0x8918.GLenum
  GL_MAX_GEOMETRY_UNIFORM_COMPONENTS* = 0x8DDF.GLenum
  GL_MAX_GEOMETRY_OUTPUT_VERTICES* = 0x8DE0.GLenum
  GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS* = 0x8DE1.GLenum
  GL_MAX_VERTEX_OUTPUT_COMPONENTS* = 0x9122.GLenum
  GL_MAX_GEOMETRY_INPUT_COMPONENTS* = 0x9123.GLenum
  GL_MAX_GEOMETRY_OUTPUT_COMPONENTS* = 0x9124.GLenum
  GL_MAX_FRAGMENT_INPUT_COMPONENTS* = 0x9125.GLenum
  GL_CONTEXT_PROFILE_MASK* = 0x9126.GLenum
  GL_DEPTH_CLAMP* = 0x864F.GLenum
  GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION* = 0x8E4C.GLenum
  GL_FIRST_VERTEX_CONVENTION* = 0x8E4D.GLenum
  GL_LAST_VERTEX_CONVENTION* = 0x8E4E.GLenum
  GL_PROVOKING_VERTEX* = 0x8E4F.GLenum
  GL_TEXTURE_CUBE_MAP_SEAMLESS* = 0x884F.GLenum
  GL_MAX_SERVER_WAIT_TIMEOUT* = 0x9111.GLenum
  GL_OBJECT_TYPE* = 0x9112.GLenum
  GL_SYNC_CONDITION* = 0x9113.GLenum
  GL_SYNC_STATUS* = 0x9114.GLenum
  GL_SYNC_FLAGS* = 0x9115.GLenum
  GL_SYNC_FENCE* = 0x9116.GLenum
  GL_SYNC_GPU_COMMANDS_COMPLETE* = 0x9117.GLenum
  GL_UNSIGNALED* = 0x9118.GLenum
  GL_SIGNALED* = 0x9119.GLenum
  GL_ALREADY_SIGNALED* = 0x911A.GLenum
  GL_TIMEOUT_EXPIRED* = 0x911B.GLenum
  GL_CONDITION_SATISFIED* = 0x911C.GLenum
  GL_WAIT_FAILED* = 0x911D.GLenum
  GL_SYNC_FLUSH_COMMANDS_BIT* = 0x00000001.GLbitfield
  GL_SAMPLE_POSITION* = 0x8E50.GLenum
  GL_SAMPLE_MASK* = 0x8E51.GLenum
  GL_SAMPLE_MASK_VALUE* = 0x8E52.GLenum
  GL_MAX_SAMPLE_MASK_WORDS* = 0x8E59.GLenum
  GL_TEXTURE_2D_MULTISAMPLE* = 0x9100.GLenum
  GL_PROXY_TEXTURE_2D_MULTISAMPLE* = 0x9101.GLenum
  GL_TEXTURE_2D_MULTISAMPLE_ARRAY* = 0x9102.GLenum
  GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY* = 0x9103.GLenum
  GL_TEXTURE_BINDING_2D_MULTISAMPLE* = 0x9104.GLenum
  GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY* = 0x9105.GLenum
  GL_TEXTURE_SAMPLES* = 0x9106.GLenum
  GL_TEXTURE_FIXED_SAMPLE_LOCATIONS* = 0x9107.GLenum
  GL_SAMPLER_2D_MULTISAMPLE* = 0x9108.GLenum
  GL_INT_SAMPLER_2D_MULTISAMPLE* = 0x9109.GLenum
  GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE* = 0x910A.GLenum
  GL_SAMPLER_2D_MULTISAMPLE_ARRAY* = 0x910B.GLenum
  GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY* = 0x910C.GLenum
  GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY* = 0x910D.GLenum
  GL_MAX_COLOR_TEXTURE_SAMPLES* = 0x910E.GLenum
  GL_MAX_DEPTH_TEXTURE_SAMPLES* = 0x910F.GLenum
  GL_MAX_INTEGER_SAMPLES* = 0x9110.GLenum
  GL_VERTEX_ATTRIB_ARRAY_DIVISOR* = 0x88FE.GLenum
  GL_SRC1_COLOR* = 0x88F9.GLenum
  GL_ONE_MINUS_SRC1_COLOR* = 0x88FA.GLenum
  GL_ONE_MINUS_SRC1_ALPHA* = 0x88FB.GLenum
  GL_MAX_DUAL_SOURCE_DRAW_BUFFERS* = 0x88FC.GLenum
  GL_ANY_SAMPLES_PASSED* = 0x8C2F.GLenum
  GL_SAMPLER_BINDING* = 0x8919.GLenum
  GL_RGB10_A2UI* = 0x906F.GLenum
  GL_TEXTURE_SWIZZLE_R* = 0x8E42.GLenum
  GL_TEXTURE_SWIZZLE_G* = 0x8E43.GLenum
  GL_TEXTURE_SWIZZLE_B* = 0x8E44.GLenum
  GL_TEXTURE_SWIZZLE_A* = 0x8E45.GLenum
  GL_TEXTURE_SWIZZLE_RGBA* = 0x8E46.GLenum
  GL_TIME_ELAPSED* = 0x88BF.GLenum
  GL_TIMESTAMP* = 0x8E28.GLenum
  GL_INT_2_10_10_10_REV* = 0x8D9F.GLenum


# Functions
var
  GLAD_GL_VERSION_1_0*: bool
  GLAD_GL_VERSION_1_1*: bool
  GLAD_GL_VERSION_1_2*: bool
  GLAD_GL_VERSION_1_3*: bool
  GLAD_GL_VERSION_1_4*: bool
  GLAD_GL_VERSION_1_5*: bool
  GLAD_GL_VERSION_2_0*: bool
  GLAD_GL_VERSION_2_1*: bool
  GLAD_GL_VERSION_3_0*: bool
  GLAD_GL_VERSION_3_1*: bool
  GLAD_GL_VERSION_3_2*: bool
  GLAD_GL_VERSION_3_3*: bool

  glCullFace*: proc (mode: GLenum) {.stdcall.}
  glFrontFace*: proc (mode: GLenum) {.stdcall.}
  glHint*: proc (target: GLenum, mode: GLenum) {.stdcall.}
  glLineWidth*: proc (width: GLfloat) {.stdcall.}
  glPointSize*: proc (size: GLfloat) {.stdcall.}
  glPolygonMode*: proc (face: GLenum, mode: GLenum) {.stdcall.}
  glScissor*: proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei) {.stdcall.}
  glTexParameterf*: proc (target: GLenum, pname: GLenum, param: GLfloat) {.stdcall.}
  glTexParameterfv*: proc (target: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glTexParameteri*: proc (target: GLenum, pname: GLenum, param: GLint) {.stdcall.}
  glTexParameteriv*: proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glTexImage1D*: proc (target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, border: GLint, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}
  glTexImage2D*: proc (target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}
  glDrawBuffer*: proc (buf: GLenum) {.stdcall.}
  glClear*: proc (mask: GLbitfield) {.stdcall.}
  glClearColor*: proc (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) {.stdcall.}
  glClearStencil*: proc (s: GLint) {.stdcall.}
  glClearDepth*: proc (depth: GLdouble) {.stdcall.}
  glStencilMask*: proc (mask: GLuint) {.stdcall.}
  glColorMask*: proc (red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean) {.stdcall.}
  glDepthMask*: proc (flag: GLboolean) {.stdcall.}
  glDisable*: proc (cap: GLenum) {.stdcall.}
  glEnable*: proc (cap: GLenum) {.stdcall.}
  glFinish*: proc () {.stdcall.}
  glFlush*: proc () {.stdcall.}
  glBlendFunc*: proc (sfactor: GLenum, dfactor: GLenum) {.stdcall.}
  glLogicOp*: proc (opcode: GLenum) {.stdcall.}
  glStencilFunc*: proc (`func`: GLenum, `ref`: GLint, mask: GLuint) {.stdcall.}
  glStencilOp*: proc (fail: GLenum, zfail: GLenum, zpass: GLenum) {.stdcall.}
  glDepthFunc*: proc (`func`: GLenum) {.stdcall.}
  glPixelStoref*: proc (pname: GLenum, param: GLfloat) {.stdcall.}
  glPixelStorei*: proc (pname: GLenum, param: GLint) {.stdcall.}
  glReadBuffer*: proc (src: GLenum) {.stdcall.}
  glReadPixels*: proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}
  glGetBooleanv*: proc (pname: GLenum, data: ptr GLboolean) {.stdcall.}
  glGetDoublev*: proc (pname: GLenum, data: ptr GLdouble) {.stdcall.}
  glGetError*: proc (): GLenum {.stdcall.}
  glGetFloatv*: proc (pname: GLenum, data: ptr GLfloat) {.stdcall.}
  glGetIntegerv*: proc (pname: GLenum, data: ptr GLint) {.stdcall.}
  glGetString*: proc (name: GLenum): ptr GLubyte {.stdcall.}
  glGetTexImage*: proc (target: GLenum, level: GLint, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}
  glGetTexParameterfv*: proc (target: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glGetTexParameteriv*: proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetTexLevelParameterfv*: proc (target: GLenum, level: GLint, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glGetTexLevelParameteriv*: proc (target: GLenum, level: GLint, pname: GLenum, params: ptr GLint) {.stdcall.}
  glIsEnabled*: proc (cap: GLenum): GLboolean {.stdcall.}
  glDepthRange*: proc (n: GLdouble, f: GLdouble) {.stdcall.}
  glViewport*: proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei) {.stdcall.}
  glNewList*: proc (list: GLuint, mode: GLenum) {.stdcall.}
  glEndList*: proc () {.stdcall.}
  glCallList*: proc (list: GLuint) {.stdcall.}
  glCallLists*: proc (n: GLsizei, `type`: GLenum, lists: pointer) {.stdcall.}
  glDeleteLists*: proc (list: GLuint, range: GLsizei) {.stdcall.}
  glGenLists*: proc (range: GLsizei): GLuint {.stdcall.}
  glListBase*: proc (base: GLuint) {.stdcall.}
  glBegin*: proc (mode: GLenum) {.stdcall.}
  glBitmap*: proc (width: GLsizei, height: GLsizei, xorig: GLfloat, yorig: GLfloat, xmove: GLfloat, ymove: GLfloat, bitmap: ptr GLubyte) {.stdcall.}
  glColor3b*: proc (red: GLbyte, green: GLbyte, blue: GLbyte) {.stdcall.}
  glColor3bv*: proc (v: ptr GLbyte) {.stdcall.}
  glColor3d*: proc (red: GLdouble, green: GLdouble, blue: GLdouble) {.stdcall.}
  glColor3dv*: proc (v: ptr GLdouble) {.stdcall.}
  glColor3f*: proc (red: GLfloat, green: GLfloat, blue: GLfloat) {.stdcall.}
  glColor3fv*: proc (v: ptr GLfloat) {.stdcall.}
  glColor3i*: proc (red: GLint, green: GLint, blue: GLint) {.stdcall.}
  glColor3iv*: proc (v: ptr GLint) {.stdcall.}
  glColor3s*: proc (red: GLshort, green: GLshort, blue: GLshort) {.stdcall.}
  glColor3sv*: proc (v: ptr GLshort) {.stdcall.}
  glColor3ub*: proc (red: GLubyte, green: GLubyte, blue: GLubyte) {.stdcall.}
  glColor3ubv*: proc (v: ptr GLubyte) {.stdcall.}
  glColor3ui*: proc (red: GLuint, green: GLuint, blue: GLuint) {.stdcall.}
  glColor3uiv*: proc (v: ptr GLuint) {.stdcall.}
  glColor3us*: proc (red: GLushort, green: GLushort, blue: GLushort) {.stdcall.}
  glColor3usv*: proc (v: ptr GLushort) {.stdcall.}
  glColor4b*: proc (red: GLbyte, green: GLbyte, blue: GLbyte, alpha: GLbyte) {.stdcall.}
  glColor4bv*: proc (v: ptr GLbyte) {.stdcall.}
  glColor4d*: proc (red: GLdouble, green: GLdouble, blue: GLdouble, alpha: GLdouble) {.stdcall.}
  glColor4dv*: proc (v: ptr GLdouble) {.stdcall.}
  glColor4f*: proc (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) {.stdcall.}
  glColor4fv*: proc (v: ptr GLfloat) {.stdcall.}
  glColor4i*: proc (red: GLint, green: GLint, blue: GLint, alpha: GLint) {.stdcall.}
  glColor4iv*: proc (v: ptr GLint) {.stdcall.}
  glColor4s*: proc (red: GLshort, green: GLshort, blue: GLshort, alpha: GLshort) {.stdcall.}
  glColor4sv*: proc (v: ptr GLshort) {.stdcall.}
  glColor4ub*: proc (red: GLubyte, green: GLubyte, blue: GLubyte, alpha: GLubyte) {.stdcall.}
  glColor4ubv*: proc (v: ptr GLubyte) {.stdcall.}
  glColor4ui*: proc (red: GLuint, green: GLuint, blue: GLuint, alpha: GLuint) {.stdcall.}
  glColor4uiv*: proc (v: ptr GLuint) {.stdcall.}
  glColor4us*: proc (red: GLushort, green: GLushort, blue: GLushort, alpha: GLushort) {.stdcall.}
  glColor4usv*: proc (v: ptr GLushort) {.stdcall.}
  glEdgeFlag*: proc (flag: GLboolean) {.stdcall.}
  glEdgeFlagv*: proc (flag: ptr GLboolean) {.stdcall.}
  glEnd*: proc () {.stdcall.}
  glIndexd*: proc (c: GLdouble) {.stdcall.}
  glIndexdv*: proc (c: ptr GLdouble) {.stdcall.}
  glIndexf*: proc (c: GLfloat) {.stdcall.}
  glIndexfv*: proc (c: ptr GLfloat) {.stdcall.}
  glIndexi*: proc (c: GLint) {.stdcall.}
  glIndexiv*: proc (c: ptr GLint) {.stdcall.}
  glIndexs*: proc (c: GLshort) {.stdcall.}
  glIndexsv*: proc (c: ptr GLshort) {.stdcall.}
  glNormal3b*: proc (nx: GLbyte, ny: GLbyte, nz: GLbyte) {.stdcall.}
  glNormal3bv*: proc (v: ptr GLbyte) {.stdcall.}
  glNormal3d*: proc (nx: GLdouble, ny: GLdouble, nz: GLdouble) {.stdcall.}
  glNormal3dv*: proc (v: ptr GLdouble) {.stdcall.}
  glNormal3f*: proc (nx: GLfloat, ny: GLfloat, nz: GLfloat) {.stdcall.}
  glNormal3fv*: proc (v: ptr GLfloat) {.stdcall.}
  glNormal3i*: proc (nx: GLint, ny: GLint, nz: GLint) {.stdcall.}
  glNormal3iv*: proc (v: ptr GLint) {.stdcall.}
  glNormal3s*: proc (nx: GLshort, ny: GLshort, nz: GLshort) {.stdcall.}
  glNormal3sv*: proc (v: ptr GLshort) {.stdcall.}
  glRasterPos2d*: proc (x: GLdouble, y: GLdouble) {.stdcall.}
  glRasterPos2dv*: proc (v: ptr GLdouble) {.stdcall.}
  glRasterPos2f*: proc (x: GLfloat, y: GLfloat) {.stdcall.}
  glRasterPos2fv*: proc (v: ptr GLfloat) {.stdcall.}
  glRasterPos2i*: proc (x: GLint, y: GLint) {.stdcall.}
  glRasterPos2iv*: proc (v: ptr GLint) {.stdcall.}
  glRasterPos2s*: proc (x: GLshort, y: GLshort) {.stdcall.}
  glRasterPos2sv*: proc (v: ptr GLshort) {.stdcall.}
  glRasterPos3d*: proc (x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}
  glRasterPos3dv*: proc (v: ptr GLdouble) {.stdcall.}
  glRasterPos3f*: proc (x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}
  glRasterPos3fv*: proc (v: ptr GLfloat) {.stdcall.}
  glRasterPos3i*: proc (x: GLint, y: GLint, z: GLint) {.stdcall.}
  glRasterPos3iv*: proc (v: ptr GLint) {.stdcall.}
  glRasterPos3s*: proc (x: GLshort, y: GLshort, z: GLshort) {.stdcall.}
  glRasterPos3sv*: proc (v: ptr GLshort) {.stdcall.}
  glRasterPos4d*: proc (x: GLdouble, y: GLdouble, z: GLdouble, w: GLdouble) {.stdcall.}
  glRasterPos4dv*: proc (v: ptr GLdouble) {.stdcall.}
  glRasterPos4f*: proc (x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) {.stdcall.}
  glRasterPos4fv*: proc (v: ptr GLfloat) {.stdcall.}
  glRasterPos4i*: proc (x: GLint, y: GLint, z: GLint, w: GLint) {.stdcall.}
  glRasterPos4iv*: proc (v: ptr GLint) {.stdcall.}
  glRasterPos4s*: proc (x: GLshort, y: GLshort, z: GLshort, w: GLshort) {.stdcall.}
  glRasterPos4sv*: proc (v: ptr GLshort) {.stdcall.}
  glRectd*: proc (x1: GLdouble, y1: GLdouble, x2: GLdouble, y2: GLdouble) {.stdcall.}
  glRectdv*: proc (v1: ptr GLdouble, v2: ptr GLdouble) {.stdcall.}
  glRectf*: proc (x1: GLfloat, y1: GLfloat, x2: GLfloat, y2: GLfloat) {.stdcall.}
  glRectfv*: proc (v1: ptr GLfloat, v2: ptr GLfloat) {.stdcall.}
  glRecti*: proc (x1: GLint, y1: GLint, x2: GLint, y2: GLint) {.stdcall.}
  glRectiv*: proc (v1: ptr GLint, v2: ptr GLint) {.stdcall.}
  glRects*: proc (x1: GLshort, y1: GLshort, x2: GLshort, y2: GLshort) {.stdcall.}
  glRectsv*: proc (v1: ptr GLshort, v2: ptr GLshort) {.stdcall.}
  glTexCoord1d*: proc (s: GLdouble) {.stdcall.}
  glTexCoord1dv*: proc (v: ptr GLdouble) {.stdcall.}
  glTexCoord1f*: proc (s: GLfloat) {.stdcall.}
  glTexCoord1fv*: proc (v: ptr GLfloat) {.stdcall.}
  glTexCoord1i*: proc (s: GLint) {.stdcall.}
  glTexCoord1iv*: proc (v: ptr GLint) {.stdcall.}
  glTexCoord1s*: proc (s: GLshort) {.stdcall.}
  glTexCoord1sv*: proc (v: ptr GLshort) {.stdcall.}
  glTexCoord2d*: proc (s: GLdouble, t: GLdouble) {.stdcall.}
  glTexCoord2dv*: proc (v: ptr GLdouble) {.stdcall.}
  glTexCoord2f*: proc (s: GLfloat, t: GLfloat) {.stdcall.}
  glTexCoord2fv*: proc (v: ptr GLfloat) {.stdcall.}
  glTexCoord2i*: proc (s: GLint, t: GLint) {.stdcall.}
  glTexCoord2iv*: proc (v: ptr GLint) {.stdcall.}
  glTexCoord2s*: proc (s: GLshort, t: GLshort) {.stdcall.}
  glTexCoord2sv*: proc (v: ptr GLshort) {.stdcall.}
  glTexCoord3d*: proc (s: GLdouble, t: GLdouble, r: GLdouble) {.stdcall.}
  glTexCoord3dv*: proc (v: ptr GLdouble) {.stdcall.}
  glTexCoord3f*: proc (s: GLfloat, t: GLfloat, r: GLfloat) {.stdcall.}
  glTexCoord3fv*: proc (v: ptr GLfloat) {.stdcall.}
  glTexCoord3i*: proc (s: GLint, t: GLint, r: GLint) {.stdcall.}
  glTexCoord3iv*: proc (v: ptr GLint) {.stdcall.}
  glTexCoord3s*: proc (s: GLshort, t: GLshort, r: GLshort) {.stdcall.}
  glTexCoord3sv*: proc (v: ptr GLshort) {.stdcall.}
  glTexCoord4d*: proc (s: GLdouble, t: GLdouble, r: GLdouble, q: GLdouble) {.stdcall.}
  glTexCoord4dv*: proc (v: ptr GLdouble) {.stdcall.}
  glTexCoord4f*: proc (s: GLfloat, t: GLfloat, r: GLfloat, q: GLfloat) {.stdcall.}
  glTexCoord4fv*: proc (v: ptr GLfloat) {.stdcall.}
  glTexCoord4i*: proc (s: GLint, t: GLint, r: GLint, q: GLint) {.stdcall.}
  glTexCoord4iv*: proc (v: ptr GLint) {.stdcall.}
  glTexCoord4s*: proc (s: GLshort, t: GLshort, r: GLshort, q: GLshort) {.stdcall.}
  glTexCoord4sv*: proc (v: ptr GLshort) {.stdcall.}
  glVertex2d*: proc (x: GLdouble, y: GLdouble) {.stdcall.}
  glVertex2dv*: proc (v: ptr GLdouble) {.stdcall.}
  glVertex2f*: proc (x: GLfloat, y: GLfloat) {.stdcall.}
  glVertex2fv*: proc (v: ptr GLfloat) {.stdcall.}
  glVertex2i*: proc (x: GLint, y: GLint) {.stdcall.}
  glVertex2iv*: proc (v: ptr GLint) {.stdcall.}
  glVertex2s*: proc (x: GLshort, y: GLshort) {.stdcall.}
  glVertex2sv*: proc (v: ptr GLshort) {.stdcall.}
  glVertex3d*: proc (x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}
  glVertex3dv*: proc (v: ptr GLdouble) {.stdcall.}
  glVertex3f*: proc (x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}
  glVertex3fv*: proc (v: ptr GLfloat) {.stdcall.}
  glVertex3i*: proc (x: GLint, y: GLint, z: GLint) {.stdcall.}
  glVertex3iv*: proc (v: ptr GLint) {.stdcall.}
  glVertex3s*: proc (x: GLshort, y: GLshort, z: GLshort) {.stdcall.}
  glVertex3sv*: proc (v: ptr GLshort) {.stdcall.}
  glVertex4d*: proc (x: GLdouble, y: GLdouble, z: GLdouble, w: GLdouble) {.stdcall.}
  glVertex4dv*: proc (v: ptr GLdouble) {.stdcall.}
  glVertex4f*: proc (x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) {.stdcall.}
  glVertex4fv*: proc (v: ptr GLfloat) {.stdcall.}
  glVertex4i*: proc (x: GLint, y: GLint, z: GLint, w: GLint) {.stdcall.}
  glVertex4iv*: proc (v: ptr GLint) {.stdcall.}
  glVertex4s*: proc (x: GLshort, y: GLshort, z: GLshort, w: GLshort) {.stdcall.}
  glVertex4sv*: proc (v: ptr GLshort) {.stdcall.}
  glClipPlane*: proc (plane: GLenum, equation: ptr GLdouble) {.stdcall.}
  glColorMaterial*: proc (face: GLenum, mode: GLenum) {.stdcall.}
  glFogf*: proc (pname: GLenum, param: GLfloat) {.stdcall.}
  glFogfv*: proc (pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glFogi*: proc (pname: GLenum, param: GLint) {.stdcall.}
  glFogiv*: proc (pname: GLenum, params: ptr GLint) {.stdcall.}
  glLightf*: proc (light: GLenum, pname: GLenum, param: GLfloat) {.stdcall.}
  glLightfv*: proc (light: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glLighti*: proc (light: GLenum, pname: GLenum, param: GLint) {.stdcall.}
  glLightiv*: proc (light: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glLightModelf*: proc (pname: GLenum, param: GLfloat) {.stdcall.}
  glLightModelfv*: proc (pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glLightModeli*: proc (pname: GLenum, param: GLint) {.stdcall.}
  glLightModeliv*: proc (pname: GLenum, params: ptr GLint) {.stdcall.}
  glLineStipple*: proc (factor: GLint, pattern: GLushort) {.stdcall.}
  glMaterialf*: proc (face: GLenum, pname: GLenum, param: GLfloat) {.stdcall.}
  glMaterialfv*: proc (face: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glMateriali*: proc (face: GLenum, pname: GLenum, param: GLint) {.stdcall.}
  glMaterialiv*: proc (face: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glPolygonStipple*: proc (mask: ptr GLubyte) {.stdcall.}
  glShadeModel*: proc (mode: GLenum) {.stdcall.}
  glTexEnvf*: proc (target: GLenum, pname: GLenum, param: GLfloat) {.stdcall.}
  glTexEnvfv*: proc (target: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glTexEnvi*: proc (target: GLenum, pname: GLenum, param: GLint) {.stdcall.}
  glTexEnviv*: proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glTexGend*: proc (coord: GLenum, pname: GLenum, param: GLdouble) {.stdcall.}
  glTexGendv*: proc (coord: GLenum, pname: GLenum, params: ptr GLdouble) {.stdcall.}
  glTexGenf*: proc (coord: GLenum, pname: GLenum, param: GLfloat) {.stdcall.}
  glTexGenfv*: proc (coord: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glTexGeni*: proc (coord: GLenum, pname: GLenum, param: GLint) {.stdcall.}
  glTexGeniv*: proc (coord: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glFeedbackBuffer*: proc (size: GLsizei, `type`: GLenum, buffer: ptr GLfloat) {.stdcall.}
  glSelectBuffer*: proc (size: GLsizei, buffer: ptr GLuint) {.stdcall.}
  glRenderMode*: proc (mode: GLenum): GLint {.stdcall.}
  glInitNames*: proc () {.stdcall.}
  glLoadName*: proc (name: GLuint) {.stdcall.}
  glPassThrough*: proc (token: GLfloat) {.stdcall.}
  glPopName*: proc () {.stdcall.}
  glPushName*: proc (name: GLuint) {.stdcall.}
  glClearAccum*: proc (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) {.stdcall.}
  glClearIndex*: proc (c: GLfloat) {.stdcall.}
  glIndexMask*: proc (mask: GLuint) {.stdcall.}
  glAccum*: proc (op: GLenum, value: GLfloat) {.stdcall.}
  glPopAttrib*: proc () {.stdcall.}
  glPushAttrib*: proc (mask: GLbitfield) {.stdcall.}
  glMap1d*: proc (target: GLenum, u1: GLdouble, u2: GLdouble, stride: GLint, order: GLint, points: ptr GLdouble) {.stdcall.}
  glMap1f*: proc (target: GLenum, u1: GLfloat, u2: GLfloat, stride: GLint, order: GLint, points: ptr GLfloat) {.stdcall.}
  glMap2d*: proc (target: GLenum, u1: GLdouble, u2: GLdouble, ustride: GLint, uorder: GLint, v1: GLdouble, v2: GLdouble, vstride: GLint, vorder: GLint, points: ptr GLdouble) {.stdcall.}
  glMap2f*: proc (target: GLenum, u1: GLfloat, u2: GLfloat, ustride: GLint, uorder: GLint, v1: GLfloat, v2: GLfloat, vstride: GLint, vorder: GLint, points: ptr GLfloat) {.stdcall.}
  glMapGrid1d*: proc (un: GLint, u1: GLdouble, u2: GLdouble) {.stdcall.}
  glMapGrid1f*: proc (un: GLint, u1: GLfloat, u2: GLfloat) {.stdcall.}
  glMapGrid2d*: proc (un: GLint, u1: GLdouble, u2: GLdouble, vn: GLint, v1: GLdouble, v2: GLdouble) {.stdcall.}
  glMapGrid2f*: proc (un: GLint, u1: GLfloat, u2: GLfloat, vn: GLint, v1: GLfloat, v2: GLfloat) {.stdcall.}
  glEvalCoord1d*: proc (u: GLdouble) {.stdcall.}
  glEvalCoord1dv*: proc (u: ptr GLdouble) {.stdcall.}
  glEvalCoord1f*: proc (u: GLfloat) {.stdcall.}
  glEvalCoord1fv*: proc (u: ptr GLfloat) {.stdcall.}
  glEvalCoord2d*: proc (u: GLdouble, v: GLdouble) {.stdcall.}
  glEvalCoord2dv*: proc (u: ptr GLdouble) {.stdcall.}
  glEvalCoord2f*: proc (u: GLfloat, v: GLfloat) {.stdcall.}
  glEvalCoord2fv*: proc (u: ptr GLfloat) {.stdcall.}
  glEvalMesh1*: proc (mode: GLenum, i1: GLint, i2: GLint) {.stdcall.}
  glEvalPoint1*: proc (i: GLint) {.stdcall.}
  glEvalMesh2*: proc (mode: GLenum, i1: GLint, i2: GLint, j1: GLint, j2: GLint) {.stdcall.}
  glEvalPoint2*: proc (i: GLint, j: GLint) {.stdcall.}
  glAlphaFunc*: proc (`func`: GLenum, `ref`: GLfloat) {.stdcall.}
  glPixelZoom*: proc (xfactor: GLfloat, yfactor: GLfloat) {.stdcall.}
  glPixelTransferf*: proc (pname: GLenum, param: GLfloat) {.stdcall.}
  glPixelTransferi*: proc (pname: GLenum, param: GLint) {.stdcall.}
  glPixelMapfv*: proc (map: GLenum, mapsize: GLsizei, values: ptr GLfloat) {.stdcall.}
  glPixelMapuiv*: proc (map: GLenum, mapsize: GLsizei, values: ptr GLuint) {.stdcall.}
  glPixelMapusv*: proc (map: GLenum, mapsize: GLsizei, values: ptr GLushort) {.stdcall.}
  glCopyPixels*: proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei, `type`: GLenum) {.stdcall.}
  glDrawPixels*: proc (width: GLsizei, height: GLsizei, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}
  glGetClipPlane*: proc (plane: GLenum, equation: ptr GLdouble) {.stdcall.}
  glGetLightfv*: proc (light: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glGetLightiv*: proc (light: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetMapdv*: proc (target: GLenum, query: GLenum, v: ptr GLdouble) {.stdcall.}
  glGetMapfv*: proc (target: GLenum, query: GLenum, v: ptr GLfloat) {.stdcall.}
  glGetMapiv*: proc (target: GLenum, query: GLenum, v: ptr GLint) {.stdcall.}
  glGetMaterialfv*: proc (face: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glGetMaterialiv*: proc (face: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetPixelMapfv*: proc (map: GLenum, values: ptr GLfloat) {.stdcall.}
  glGetPixelMapuiv*: proc (map: GLenum, values: ptr GLuint) {.stdcall.}
  glGetPixelMapusv*: proc (map: GLenum, values: ptr GLushort) {.stdcall.}
  glGetPolygonStipple*: proc (mask: ptr GLubyte) {.stdcall.}
  glGetTexEnvfv*: proc (target: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glGetTexEnviv*: proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetTexGendv*: proc (coord: GLenum, pname: GLenum, params: ptr GLdouble) {.stdcall.}
  glGetTexGenfv*: proc (coord: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glGetTexGeniv*: proc (coord: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glIsList*: proc (list: GLuint): GLboolean {.stdcall.}
  glFrustum*: proc (left: GLdouble, right: GLdouble, bottom: GLdouble, top: GLdouble, zNear: GLdouble, zFar: GLdouble) {.stdcall.}
  glLoadIdentity*: proc () {.stdcall.}
  glLoadMatrixf*: proc (m: ptr GLfloat) {.stdcall.}
  glLoadMatrixd*: proc (m: ptr GLdouble) {.stdcall.}
  glMatrixMode*: proc (mode: GLenum) {.stdcall.}
  glMultMatrixf*: proc (m: ptr GLfloat) {.stdcall.}
  glMultMatrixd*: proc (m: ptr GLdouble) {.stdcall.}
  glOrtho*: proc (left: GLdouble, right: GLdouble, bottom: GLdouble, top: GLdouble, zNear: GLdouble, zFar: GLdouble) {.stdcall.}
  glPopMatrix*: proc () {.stdcall.}
  glPushMatrix*: proc () {.stdcall.}
  glRotated*: proc (angle: GLdouble, x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}
  glRotatef*: proc (angle: GLfloat, x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}
  glScaled*: proc (x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}
  glScalef*: proc (x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}
  glTranslated*: proc (x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}
  glTranslatef*: proc (x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}
  glDrawArrays*: proc (mode: GLenum, first: GLint, count: GLsizei) {.stdcall.}
  glDrawElements*: proc (mode: GLenum, count: GLsizei, `type`: GLenum, indices: pointer) {.stdcall.}
  glGetPointerv*: proc (pname: GLenum, params: ptr pointer) {.stdcall.}
  glPolygonOffset*: proc (factor: GLfloat, units: GLfloat) {.stdcall.}
  glCopyTexImage1D*: proc (target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, border: GLint) {.stdcall.}
  glCopyTexImage2D*: proc (target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint) {.stdcall.}
  glCopyTexSubImage1D*: proc (target: GLenum, level: GLint, xoffset: GLint, x: GLint, y: GLint, width: GLsizei) {.stdcall.}
  glCopyTexSubImage2D*: proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) {.stdcall.}
  glTexSubImage1D*: proc (target: GLenum, level: GLint, xoffset: GLint, width: GLsizei, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}
  glTexSubImage2D*: proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}
  glBindTexture*: proc (target: GLenum, texture: GLuint) {.stdcall.}
  glDeleteTextures*: proc (n: GLsizei, textures: ptr GLuint) {.stdcall.}
  glGenTextures*: proc (n: GLsizei, textures: ptr GLuint) {.stdcall.}
  glIsTexture*: proc (texture: GLuint): GLboolean {.stdcall.}
  glArrayElement*: proc (i: GLint) {.stdcall.}
  glColorPointer*: proc (size: GLint, `type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}
  glDisableClientState*: proc (array: GLenum) {.stdcall.}
  glEdgeFlagPointer*: proc (stride: GLsizei, pointer: pointer) {.stdcall.}
  glEnableClientState*: proc (array: GLenum) {.stdcall.}
  glIndexPointer*: proc (`type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}
  glInterleavedArrays*: proc (format: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}
  glNormalPointer*: proc (`type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}
  glTexCoordPointer*: proc (size: GLint, `type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}
  glVertexPointer*: proc (size: GLint, `type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}
  glAreTexturesResident*: proc (n: GLsizei, textures: ptr GLuint, residences: ptr GLboolean): GLboolean {.stdcall.}
  glPrioritizeTextures*: proc (n: GLsizei, textures: ptr GLuint, priorities: ptr GLfloat) {.stdcall.}
  glIndexub*: proc (c: GLubyte) {.stdcall.}
  glIndexubv*: proc (c: ptr GLubyte) {.stdcall.}
  glPopClientAttrib*: proc () {.stdcall.}
  glPushClientAttrib*: proc (mask: GLbitfield) {.stdcall.}
  glDrawRangeElements*: proc (mode: GLenum, start: GLuint, `end`: GLuint, count: GLsizei, `type`: GLenum, indices: pointer) {.stdcall.}
  glTexImage3D*: proc (target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}
  glTexSubImage3D*: proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}
  glCopyTexSubImage3D*: proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) {.stdcall.}
  glActiveTexture*: proc (texture: GLenum) {.stdcall.}
  glSampleCoverage*: proc (value: GLfloat, invert: GLboolean) {.stdcall.}
  glCompressedTexImage3D*: proc (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, imageSize: GLsizei, data: pointer) {.stdcall.}
  glCompressedTexImage2D*: proc (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, imageSize: GLsizei, data: pointer) {.stdcall.}
  glCompressedTexImage1D*: proc (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, border: GLint, imageSize: GLsizei, data: pointer) {.stdcall.}
  glCompressedTexSubImage3D*: proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, imageSize: GLsizei, data: pointer) {.stdcall.}
  glCompressedTexSubImage2D*: proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, imageSize: GLsizei, data: pointer) {.stdcall.}
  glCompressedTexSubImage1D*: proc (target: GLenum, level: GLint, xoffset: GLint, width: GLsizei, format: GLenum, imageSize: GLsizei, data: pointer) {.stdcall.}
  glGetCompressedTexImage*: proc (target: GLenum, level: GLint, img: pointer) {.stdcall.}
  glClientActiveTexture*: proc (texture: GLenum) {.stdcall.}
  glMultiTexCoord1d*: proc (target: GLenum, s: GLdouble) {.stdcall.}
  glMultiTexCoord1dv*: proc (target: GLenum, v: ptr GLdouble) {.stdcall.}
  glMultiTexCoord1f*: proc (target: GLenum, s: GLfloat) {.stdcall.}
  glMultiTexCoord1fv*: proc (target: GLenum, v: ptr GLfloat) {.stdcall.}
  glMultiTexCoord1i*: proc (target: GLenum, s: GLint) {.stdcall.}
  glMultiTexCoord1iv*: proc (target: GLenum, v: ptr GLint) {.stdcall.}
  glMultiTexCoord1s*: proc (target: GLenum, s: GLshort) {.stdcall.}
  glMultiTexCoord1sv*: proc (target: GLenum, v: ptr GLshort) {.stdcall.}
  glMultiTexCoord2d*: proc (target: GLenum, s: GLdouble, t: GLdouble) {.stdcall.}
  glMultiTexCoord2dv*: proc (target: GLenum, v: ptr GLdouble) {.stdcall.}
  glMultiTexCoord2f*: proc (target: GLenum, s: GLfloat, t: GLfloat) {.stdcall.}
  glMultiTexCoord2fv*: proc (target: GLenum, v: ptr GLfloat) {.stdcall.}
  glMultiTexCoord2i*: proc (target: GLenum, s: GLint, t: GLint) {.stdcall.}
  glMultiTexCoord2iv*: proc (target: GLenum, v: ptr GLint) {.stdcall.}
  glMultiTexCoord2s*: proc (target: GLenum, s: GLshort, t: GLshort) {.stdcall.}
  glMultiTexCoord2sv*: proc (target: GLenum, v: ptr GLshort) {.stdcall.}
  glMultiTexCoord3d*: proc (target: GLenum, s: GLdouble, t: GLdouble, r: GLdouble) {.stdcall.}
  glMultiTexCoord3dv*: proc (target: GLenum, v: ptr GLdouble) {.stdcall.}
  glMultiTexCoord3f*: proc (target: GLenum, s: GLfloat, t: GLfloat, r: GLfloat) {.stdcall.}
  glMultiTexCoord3fv*: proc (target: GLenum, v: ptr GLfloat) {.stdcall.}
  glMultiTexCoord3i*: proc (target: GLenum, s: GLint, t: GLint, r: GLint) {.stdcall.}
  glMultiTexCoord3iv*: proc (target: GLenum, v: ptr GLint) {.stdcall.}
  glMultiTexCoord3s*: proc (target: GLenum, s: GLshort, t: GLshort, r: GLshort) {.stdcall.}
  glMultiTexCoord3sv*: proc (target: GLenum, v: ptr GLshort) {.stdcall.}
  glMultiTexCoord4d*: proc (target: GLenum, s: GLdouble, t: GLdouble, r: GLdouble, q: GLdouble) {.stdcall.}
  glMultiTexCoord4dv*: proc (target: GLenum, v: ptr GLdouble) {.stdcall.}
  glMultiTexCoord4f*: proc (target: GLenum, s: GLfloat, t: GLfloat, r: GLfloat, q: GLfloat) {.stdcall.}
  glMultiTexCoord4fv*: proc (target: GLenum, v: ptr GLfloat) {.stdcall.}
  glMultiTexCoord4i*: proc (target: GLenum, s: GLint, t: GLint, r: GLint, q: GLint) {.stdcall.}
  glMultiTexCoord4iv*: proc (target: GLenum, v: ptr GLint) {.stdcall.}
  glMultiTexCoord4s*: proc (target: GLenum, s: GLshort, t: GLshort, r: GLshort, q: GLshort) {.stdcall.}
  glMultiTexCoord4sv*: proc (target: GLenum, v: ptr GLshort) {.stdcall.}
  glLoadTransposeMatrixf*: proc (m: ptr GLfloat) {.stdcall.}
  glLoadTransposeMatrixd*: proc (m: ptr GLdouble) {.stdcall.}
  glMultTransposeMatrixf*: proc (m: ptr GLfloat) {.stdcall.}
  glMultTransposeMatrixd*: proc (m: ptr GLdouble) {.stdcall.}
  glBlendFuncSeparate*: proc (sfactorRGB: GLenum, dfactorRGB: GLenum, sfactorAlpha: GLenum, dfactorAlpha: GLenum) {.stdcall.}
  glMultiDrawArrays*: proc (mode: GLenum, first: ptr GLint, count: ptr GLsizei, drawcount: GLsizei) {.stdcall.}
  glMultiDrawElements*: proc (mode: GLenum, count: ptr GLsizei, `type`: GLenum, indices: ptr pointer, drawcount: GLsizei) {.stdcall.}
  glPointParameterf*: proc (pname: GLenum, param: GLfloat) {.stdcall.}
  glPointParameterfv*: proc (pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glPointParameteri*: proc (pname: GLenum, param: GLint) {.stdcall.}
  glPointParameteriv*: proc (pname: GLenum, params: ptr GLint) {.stdcall.}
  glFogCoordf*: proc (coord: GLfloat) {.stdcall.}
  glFogCoordfv*: proc (coord: ptr GLfloat) {.stdcall.}
  glFogCoordd*: proc (coord: GLdouble) {.stdcall.}
  glFogCoorddv*: proc (coord: ptr GLdouble) {.stdcall.}
  glFogCoordPointer*: proc (`type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}
  glSecondaryColor3b*: proc (red: GLbyte, green: GLbyte, blue: GLbyte) {.stdcall.}
  glSecondaryColor3bv*: proc (v: ptr GLbyte) {.stdcall.}
  glSecondaryColor3d*: proc (red: GLdouble, green: GLdouble, blue: GLdouble) {.stdcall.}
  glSecondaryColor3dv*: proc (v: ptr GLdouble) {.stdcall.}
  glSecondaryColor3f*: proc (red: GLfloat, green: GLfloat, blue: GLfloat) {.stdcall.}
  glSecondaryColor3fv*: proc (v: ptr GLfloat) {.stdcall.}
  glSecondaryColor3i*: proc (red: GLint, green: GLint, blue: GLint) {.stdcall.}
  glSecondaryColor3iv*: proc (v: ptr GLint) {.stdcall.}
  glSecondaryColor3s*: proc (red: GLshort, green: GLshort, blue: GLshort) {.stdcall.}
  glSecondaryColor3sv*: proc (v: ptr GLshort) {.stdcall.}
  glSecondaryColor3ub*: proc (red: GLubyte, green: GLubyte, blue: GLubyte) {.stdcall.}
  glSecondaryColor3ubv*: proc (v: ptr GLubyte) {.stdcall.}
  glSecondaryColor3ui*: proc (red: GLuint, green: GLuint, blue: GLuint) {.stdcall.}
  glSecondaryColor3uiv*: proc (v: ptr GLuint) {.stdcall.}
  glSecondaryColor3us*: proc (red: GLushort, green: GLushort, blue: GLushort) {.stdcall.}
  glSecondaryColor3usv*: proc (v: ptr GLushort) {.stdcall.}
  glSecondaryColorPointer*: proc (size: GLint, `type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}
  glWindowPos2d*: proc (x: GLdouble, y: GLdouble) {.stdcall.}
  glWindowPos2dv*: proc (v: ptr GLdouble) {.stdcall.}
  glWindowPos2f*: proc (x: GLfloat, y: GLfloat) {.stdcall.}
  glWindowPos2fv*: proc (v: ptr GLfloat) {.stdcall.}
  glWindowPos2i*: proc (x: GLint, y: GLint) {.stdcall.}
  glWindowPos2iv*: proc (v: ptr GLint) {.stdcall.}
  glWindowPos2s*: proc (x: GLshort, y: GLshort) {.stdcall.}
  glWindowPos2sv*: proc (v: ptr GLshort) {.stdcall.}
  glWindowPos3d*: proc (x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}
  glWindowPos3dv*: proc (v: ptr GLdouble) {.stdcall.}
  glWindowPos3f*: proc (x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}
  glWindowPos3fv*: proc (v: ptr GLfloat) {.stdcall.}
  glWindowPos3i*: proc (x: GLint, y: GLint, z: GLint) {.stdcall.}
  glWindowPos3iv*: proc (v: ptr GLint) {.stdcall.}
  glWindowPos3s*: proc (x: GLshort, y: GLshort, z: GLshort) {.stdcall.}
  glWindowPos3sv*: proc (v: ptr GLshort) {.stdcall.}
  glBlendColor*: proc (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) {.stdcall.}
  glBlendEquation*: proc (mode: GLenum) {.stdcall.}
  glGenQueries*: proc (n: GLsizei, ids: ptr GLuint) {.stdcall.}
  glDeleteQueries*: proc (n: GLsizei, ids: ptr GLuint) {.stdcall.}
  glIsQuery*: proc (id: GLuint): GLboolean {.stdcall.}
  glBeginQuery*: proc (target: GLenum, id: GLuint) {.stdcall.}
  glEndQuery*: proc (target: GLenum) {.stdcall.}
  glGetQueryiv*: proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetQueryObjectiv*: proc (id: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetQueryObjectuiv*: proc (id: GLuint, pname: GLenum, params: ptr GLuint) {.stdcall.}
  glBindBuffer*: proc (target: GLenum, buffer: GLuint) {.stdcall.}
  glDeleteBuffers*: proc (n: GLsizei, buffers: ptr GLuint) {.stdcall.}
  glGenBuffers*: proc (n: GLsizei, buffers: ptr GLuint) {.stdcall.}
  glIsBuffer*: proc (buffer: GLuint): GLboolean {.stdcall.}
  glBufferData*: proc (target: GLenum, size: GLsizeiptr, data: pointer, usage: GLenum) {.stdcall.}
  glBufferSubData*: proc (target: GLenum, offset: GLintptr, size: GLsizeiptr, data: pointer) {.stdcall.}
  glGetBufferSubData*: proc (target: GLenum, offset: GLintptr, size: GLsizeiptr, data: pointer) {.stdcall.}
  glMapBuffer*: proc (target: GLenum, access: GLenum): pointer {.stdcall.}
  glUnmapBuffer*: proc (target: GLenum): GLboolean {.stdcall.}
  glGetBufferParameteriv*: proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetBufferPointerv*: proc (target: GLenum, pname: GLenum, params: ptr pointer) {.stdcall.}
  glBlendEquationSeparate*: proc (modeRGB: GLenum, modeAlpha: GLenum) {.stdcall.}
  glDrawBuffers*: proc (n: GLsizei, bufs: ptr GLenum) {.stdcall.}
  glStencilOpSeparate*: proc (face: GLenum, sfail: GLenum, dpfail: GLenum, dppass: GLenum) {.stdcall.}
  glStencilFuncSeparate*: proc (face: GLenum, `func`: GLenum, `ref`: GLint, mask: GLuint) {.stdcall.}
  glStencilMaskSeparate*: proc (face: GLenum, mask: GLuint) {.stdcall.}
  glAttachShader*: proc (program: GLuint, shader: GLuint) {.stdcall.}
  glBindAttribLocation*: proc (program: GLuint, index: GLuint, name: cstring) {.stdcall.}
  glCompileShader*: proc (shader: GLuint) {.stdcall.}
  glCreateProgram*: proc (): GLuint {.stdcall.}
  glCreateShader*: proc (`type`: GLenum): GLuint {.stdcall.}
  glDeleteProgram*: proc (program: GLuint) {.stdcall.}
  glDeleteShader*: proc (shader: GLuint) {.stdcall.}
  glDetachShader*: proc (program: GLuint, shader: GLuint) {.stdcall.}
  glDisableVertexAttribArray*: proc (index: GLuint) {.stdcall.}
  glEnableVertexAttribArray*: proc (index: GLuint) {.stdcall.}
  glGetActiveAttrib*: proc (program: GLuint, index: GLuint, bufSize: GLsizei, length: ptr GLsizei, size: ptr GLint, `type`: ptr GLenum, name: cstring) {.stdcall.}
  glGetActiveUniform*: proc (program: GLuint, index: GLuint, bufSize: GLsizei, length: ptr GLsizei, size: ptr GLint, `type`: ptr GLenum, name: cstring) {.stdcall.}
  glGetAttachedShaders*: proc (program: GLuint, maxCount: GLsizei, count: ptr GLsizei, shaders: ptr GLuint) {.stdcall.}
  glGetAttribLocation*: proc (program: GLuint, name: cstring): GLint {.stdcall.}
  glGetProgramiv*: proc (program: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetProgramInfoLog*: proc (program: GLuint, bufSize: GLsizei, length: ptr GLsizei, infoLog: cstring) {.stdcall.}
  glGetShaderiv*: proc (shader: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetShaderInfoLog*: proc (shader: GLuint, bufSize: GLsizei, length: ptr GLsizei, infoLog: cstring) {.stdcall.}
  glGetShaderSource*: proc (shader: GLuint, bufSize: GLsizei, length: ptr GLsizei, source: cstring) {.stdcall.}
  glGetUniformLocation*: proc (program: GLuint, name: cstring): GLint {.stdcall.}
  glGetUniformfv*: proc (program: GLuint, location: GLint, params: ptr GLfloat) {.stdcall.}
  glGetUniformiv*: proc (program: GLuint, location: GLint, params: ptr GLint) {.stdcall.}
  glGetVertexAttribdv*: proc (index: GLuint, pname: GLenum, params: ptr GLdouble) {.stdcall.}
  glGetVertexAttribfv*: proc (index: GLuint, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glGetVertexAttribiv*: proc (index: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetVertexAttribPointerv*: proc (index: GLuint, pname: GLenum, pointer: ptr pointer) {.stdcall.}
  glIsProgram*: proc (program: GLuint): GLboolean {.stdcall.}
  glIsShader*: proc (shader: GLuint): GLboolean {.stdcall.}
  glLinkProgram*: proc (program: GLuint) {.stdcall.}
  glShaderSource*: proc (shader: GLuint, count: GLsizei, string: cstringArray, length: ptr GLint) {.stdcall.}
  glUseProgram*: proc (program: GLuint) {.stdcall.}
  glUniform1f*: proc (location: GLint, v0: GLfloat) {.stdcall.}
  glUniform2f*: proc (location: GLint, v0: GLfloat, v1: GLfloat) {.stdcall.}
  glUniform3f*: proc (location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat) {.stdcall.}
  glUniform4f*: proc (location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat, v3: GLfloat) {.stdcall.}
  glUniform1i*: proc (location: GLint, v0: GLint) {.stdcall.}
  glUniform2i*: proc (location: GLint, v0: GLint, v1: GLint) {.stdcall.}
  glUniform3i*: proc (location: GLint, v0: GLint, v1: GLint, v2: GLint) {.stdcall.}
  glUniform4i*: proc (location: GLint, v0: GLint, v1: GLint, v2: GLint, v3: GLint) {.stdcall.}
  glUniform1fv*: proc (location: GLint, count: GLsizei, value: ptr GLfloat) {.stdcall.}
  glUniform2fv*: proc (location: GLint, count: GLsizei, value: ptr GLfloat) {.stdcall.}
  glUniform3fv*: proc (location: GLint, count: GLsizei, value: ptr GLfloat) {.stdcall.}
  glUniform4fv*: proc (location: GLint, count: GLsizei, value: ptr GLfloat) {.stdcall.}
  glUniform1iv*: proc (location: GLint, count: GLsizei, value: ptr GLint) {.stdcall.}
  glUniform2iv*: proc (location: GLint, count: GLsizei, value: ptr GLint) {.stdcall.}
  glUniform3iv*: proc (location: GLint, count: GLsizei, value: ptr GLint) {.stdcall.}
  glUniform4iv*: proc (location: GLint, count: GLsizei, value: ptr GLint) {.stdcall.}
  glUniformMatrix2fv*: proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}
  glUniformMatrix3fv*: proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}
  glUniformMatrix4fv*: proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}
  glValidateProgram*: proc (program: GLuint) {.stdcall.}
  glVertexAttrib1d*: proc (index: GLuint, x: GLdouble) {.stdcall.}
  glVertexAttrib1dv*: proc (index: GLuint, v: ptr GLdouble) {.stdcall.}
  glVertexAttrib1f*: proc (index: GLuint, x: GLfloat) {.stdcall.}
  glVertexAttrib1fv*: proc (index: GLuint, v: ptr GLfloat) {.stdcall.}
  glVertexAttrib1s*: proc (index: GLuint, x: GLshort) {.stdcall.}
  glVertexAttrib1sv*: proc (index: GLuint, v: ptr GLshort) {.stdcall.}
  glVertexAttrib2d*: proc (index: GLuint, x: GLdouble, y: GLdouble) {.stdcall.}
  glVertexAttrib2dv*: proc (index: GLuint, v: ptr GLdouble) {.stdcall.}
  glVertexAttrib2f*: proc (index: GLuint, x: GLfloat, y: GLfloat) {.stdcall.}
  glVertexAttrib2fv*: proc (index: GLuint, v: ptr GLfloat) {.stdcall.}
  glVertexAttrib2s*: proc (index: GLuint, x: GLshort, y: GLshort) {.stdcall.}
  glVertexAttrib2sv*: proc (index: GLuint, v: ptr GLshort) {.stdcall.}
  glVertexAttrib3d*: proc (index: GLuint, x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}
  glVertexAttrib3dv*: proc (index: GLuint, v: ptr GLdouble) {.stdcall.}
  glVertexAttrib3f*: proc (index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}
  glVertexAttrib3fv*: proc (index: GLuint, v: ptr GLfloat) {.stdcall.}
  glVertexAttrib3s*: proc (index: GLuint, x: GLshort, y: GLshort, z: GLshort) {.stdcall.}
  glVertexAttrib3sv*: proc (index: GLuint, v: ptr GLshort) {.stdcall.}
  glVertexAttrib4Nbv*: proc (index: GLuint, v: ptr GLbyte) {.stdcall.}
  glVertexAttrib4Niv*: proc (index: GLuint, v: ptr GLint) {.stdcall.}
  glVertexAttrib4Nsv*: proc (index: GLuint, v: ptr GLshort) {.stdcall.}
  glVertexAttrib4Nub*: proc (index: GLuint, x: GLubyte, y: GLubyte, z: GLubyte, w: GLubyte) {.stdcall.}
  glVertexAttrib4Nubv*: proc (index: GLuint, v: ptr GLubyte) {.stdcall.}
  glVertexAttrib4Nuiv*: proc (index: GLuint, v: ptr GLuint) {.stdcall.}
  glVertexAttrib4Nusv*: proc (index: GLuint, v: ptr GLushort) {.stdcall.}
  glVertexAttrib4bv*: proc (index: GLuint, v: ptr GLbyte) {.stdcall.}
  glVertexAttrib4d*: proc (index: GLuint, x: GLdouble, y: GLdouble, z: GLdouble, w: GLdouble) {.stdcall.}
  glVertexAttrib4dv*: proc (index: GLuint, v: ptr GLdouble) {.stdcall.}
  glVertexAttrib4f*: proc (index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) {.stdcall.}
  glVertexAttrib4fv*: proc (index: GLuint, v: ptr GLfloat) {.stdcall.}
  glVertexAttrib4iv*: proc (index: GLuint, v: ptr GLint) {.stdcall.}
  glVertexAttrib4s*: proc (index: GLuint, x: GLshort, y: GLshort, z: GLshort, w: GLshort) {.stdcall.}
  glVertexAttrib4sv*: proc (index: GLuint, v: ptr GLshort) {.stdcall.}
  glVertexAttrib4ubv*: proc (index: GLuint, v: ptr GLubyte) {.stdcall.}
  glVertexAttrib4uiv*: proc (index: GLuint, v: ptr GLuint) {.stdcall.}
  glVertexAttrib4usv*: proc (index: GLuint, v: ptr GLushort) {.stdcall.}
  glVertexAttribPointer*: proc (index: GLuint, size: GLint, `type`: GLenum, normalized: GLboolean, stride: GLsizei, pointer: pointer) {.stdcall.}
  glUniformMatrix2x3fv*: proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}
  glUniformMatrix3x2fv*: proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}
  glUniformMatrix2x4fv*: proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}
  glUniformMatrix4x2fv*: proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}
  glUniformMatrix3x4fv*: proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}
  glUniformMatrix4x3fv*: proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}
  glColorMaski*: proc (index: GLuint, r: GLboolean, g: GLboolean, b: GLboolean, a: GLboolean) {.stdcall.}
  glGetBooleani_v*: proc (target: GLenum, index: GLuint, data: ptr GLboolean) {.stdcall.}
  glGetIntegeri_v*: proc (target: GLenum, index: GLuint, data: ptr GLint) {.stdcall.}
  glEnablei*: proc (target: GLenum, index: GLuint) {.stdcall.}
  glDisablei*: proc (target: GLenum, index: GLuint) {.stdcall.}
  glIsEnabledi*: proc (target: GLenum, index: GLuint): GLboolean {.stdcall.}
  glBeginTransformFeedback*: proc (primitiveMode: GLenum) {.stdcall.}
  glEndTransformFeedback*: proc () {.stdcall.}
  glBindBufferRange*: proc (target: GLenum, index: GLuint, buffer: GLuint, offset: GLintptr, size: GLsizeiptr) {.stdcall.}
  glBindBufferBase*: proc (target: GLenum, index: GLuint, buffer: GLuint) {.stdcall.}
  glTransformFeedbackVaryings*: proc (program: GLuint, count: GLsizei, varyings: cstringArray, bufferMode: GLenum) {.stdcall.}
  glGetTransformFeedbackVarying*: proc (program: GLuint, index: GLuint, bufSize: GLsizei, length: ptr GLsizei, size: ptr GLsizei, `type`: ptr GLenum, name: cstring) {.stdcall.}
  glClampColor*: proc (target: GLenum, clamp: GLenum) {.stdcall.}
  glBeginConditionalRender*: proc (id: GLuint, mode: GLenum) {.stdcall.}
  glEndConditionalRender*: proc () {.stdcall.}
  glVertexAttribIPointer*: proc (index: GLuint, size: GLint, `type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}
  glGetVertexAttribIiv*: proc (index: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetVertexAttribIuiv*: proc (index: GLuint, pname: GLenum, params: ptr GLuint) {.stdcall.}
  glVertexAttribI1i*: proc (index: GLuint, x: GLint) {.stdcall.}
  glVertexAttribI2i*: proc (index: GLuint, x: GLint, y: GLint) {.stdcall.}
  glVertexAttribI3i*: proc (index: GLuint, x: GLint, y: GLint, z: GLint) {.stdcall.}
  glVertexAttribI4i*: proc (index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint) {.stdcall.}
  glVertexAttribI1ui*: proc (index: GLuint, x: GLuint) {.stdcall.}
  glVertexAttribI2ui*: proc (index: GLuint, x: GLuint, y: GLuint) {.stdcall.}
  glVertexAttribI3ui*: proc (index: GLuint, x: GLuint, y: GLuint, z: GLuint) {.stdcall.}
  glVertexAttribI4ui*: proc (index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint) {.stdcall.}
  glVertexAttribI1iv*: proc (index: GLuint, v: ptr GLint) {.stdcall.}
  glVertexAttribI2iv*: proc (index: GLuint, v: ptr GLint) {.stdcall.}
  glVertexAttribI3iv*: proc (index: GLuint, v: ptr GLint) {.stdcall.}
  glVertexAttribI4iv*: proc (index: GLuint, v: ptr GLint) {.stdcall.}
  glVertexAttribI1uiv*: proc (index: GLuint, v: ptr GLuint) {.stdcall.}
  glVertexAttribI2uiv*: proc (index: GLuint, v: ptr GLuint) {.stdcall.}
  glVertexAttribI3uiv*: proc (index: GLuint, v: ptr GLuint) {.stdcall.}
  glVertexAttribI4uiv*: proc (index: GLuint, v: ptr GLuint) {.stdcall.}
  glVertexAttribI4bv*: proc (index: GLuint, v: ptr GLbyte) {.stdcall.}
  glVertexAttribI4sv*: proc (index: GLuint, v: ptr GLshort) {.stdcall.}
  glVertexAttribI4ubv*: proc (index: GLuint, v: ptr GLubyte) {.stdcall.}
  glVertexAttribI4usv*: proc (index: GLuint, v: ptr GLushort) {.stdcall.}
  glGetUniformuiv*: proc (program: GLuint, location: GLint, params: ptr GLuint) {.stdcall.}
  glBindFragDataLocation*: proc (program: GLuint, color: GLuint, name: cstring) {.stdcall.}
  glGetFragDataLocation*: proc (program: GLuint, name: cstring): GLint {.stdcall.}
  glUniform1ui*: proc (location: GLint, v0: GLuint) {.stdcall.}
  glUniform2ui*: proc (location: GLint, v0: GLuint, v1: GLuint) {.stdcall.}
  glUniform3ui*: proc (location: GLint, v0: GLuint, v1: GLuint, v2: GLuint) {.stdcall.}
  glUniform4ui*: proc (location: GLint, v0: GLuint, v1: GLuint, v2: GLuint, v3: GLuint) {.stdcall.}
  glUniform1uiv*: proc (location: GLint, count: GLsizei, value: ptr GLuint) {.stdcall.}
  glUniform2uiv*: proc (location: GLint, count: GLsizei, value: ptr GLuint) {.stdcall.}
  glUniform3uiv*: proc (location: GLint, count: GLsizei, value: ptr GLuint) {.stdcall.}
  glUniform4uiv*: proc (location: GLint, count: GLsizei, value: ptr GLuint) {.stdcall.}
  glTexParameterIiv*: proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glTexParameterIuiv*: proc (target: GLenum, pname: GLenum, params: ptr GLuint) {.stdcall.}
  glGetTexParameterIiv*: proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetTexParameterIuiv*: proc (target: GLenum, pname: GLenum, params: ptr GLuint) {.stdcall.}
  glClearBufferiv*: proc (buffer: GLenum, drawbuffer: GLint, value: ptr GLint) {.stdcall.}
  glClearBufferuiv*: proc (buffer: GLenum, drawbuffer: GLint, value: ptr GLuint) {.stdcall.}
  glClearBufferfv*: proc (buffer: GLenum, drawbuffer: GLint, value: ptr GLfloat) {.stdcall.}
  glClearBufferfi*: proc (buffer: GLenum, drawbuffer: GLint, depth: GLfloat, stencil: GLint) {.stdcall.}
  glGetStringi*: proc (name: GLenum, index: GLuint): ptr GLubyte {.stdcall.}
  glIsRenderbuffer*: proc (renderbuffer: GLuint): GLboolean {.stdcall.}
  glBindRenderbuffer*: proc (target: GLenum, renderbuffer: GLuint) {.stdcall.}
  glDeleteRenderbuffers*: proc (n: GLsizei, renderbuffers: ptr GLuint) {.stdcall.}
  glGenRenderbuffers*: proc (n: GLsizei, renderbuffers: ptr GLuint) {.stdcall.}
  glRenderbufferStorage*: proc (target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) {.stdcall.}
  glGetRenderbufferParameteriv*: proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glIsFramebuffer*: proc (framebuffer: GLuint): GLboolean {.stdcall.}
  glBindFramebuffer*: proc (target: GLenum, framebuffer: GLuint) {.stdcall.}
  glDeleteFramebuffers*: proc (n: GLsizei, framebuffers: ptr GLuint) {.stdcall.}
  glGenFramebuffers*: proc (n: GLsizei, framebuffers: ptr GLuint) {.stdcall.}
  glCheckFramebufferStatus*: proc (target: GLenum): GLenum {.stdcall.}
  glFramebufferTexture1D*: proc (target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLuint, level: GLint) {.stdcall.}
  glFramebufferTexture2D*: proc (target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLuint, level: GLint) {.stdcall.}
  glFramebufferTexture3D*: proc (target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLuint, level: GLint, zoffset: GLint) {.stdcall.}
  glFramebufferRenderbuffer*: proc (target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: GLuint) {.stdcall.}
  glGetFramebufferAttachmentParameteriv*: proc (target: GLenum, attachment: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGenerateMipmap*: proc (target: GLenum) {.stdcall.}
  glBlitFramebuffer*: proc (srcX0: GLint, srcY0: GLint, srcX1: GLint, srcY1: GLint, dstX0: GLint, dstY0: GLint, dstX1: GLint, dstY1: GLint, mask: GLbitfield, filter: GLenum) {.stdcall.}
  glRenderbufferStorageMultisample*: proc (target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) {.stdcall.}
  glFramebufferTextureLayer*: proc (target: GLenum, attachment: GLenum, texture: GLuint, level: GLint, layer: GLint) {.stdcall.}
  glMapBufferRange*: proc (target: GLenum, offset: GLintptr, length: GLsizeiptr, access: GLbitfield): pointer {.stdcall.}
  glFlushMappedBufferRange*: proc (target: GLenum, offset: GLintptr, length: GLsizeiptr) {.stdcall.}
  glBindVertexArray*: proc (array: GLuint) {.stdcall.}
  glDeleteVertexArrays*: proc (n: GLsizei, arrays: ptr GLuint) {.stdcall.}
  glGenVertexArrays*: proc (n: GLsizei, arrays: ptr GLuint) {.stdcall.}
  glIsVertexArray*: proc (array: GLuint): GLboolean {.stdcall.}
  glDrawArraysInstanced*: proc (mode: GLenum, first: GLint, count: GLsizei, instancecount: GLsizei) {.stdcall.}
  glDrawElementsInstanced*: proc (mode: GLenum, count: GLsizei, `type`: GLenum, indices: pointer, instancecount: GLsizei) {.stdcall.}
  glTexBuffer*: proc (target: GLenum, internalformat: GLenum, buffer: GLuint) {.stdcall.}
  glPrimitiveRestartIndex*: proc (index: GLuint) {.stdcall.}
  glCopyBufferSubData*: proc (readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr) {.stdcall.}
  glGetUniformIndices*: proc (program: GLuint, uniformCount: GLsizei, uniformNames: cstringArray, uniformIndices: ptr GLuint) {.stdcall.}
  glGetActiveUniformsiv*: proc (program: GLuint, uniformCount: GLsizei, uniformIndices: ptr GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetActiveUniformName*: proc (program: GLuint, uniformIndex: GLuint, bufSize: GLsizei, length: ptr GLsizei, uniformName: cstring) {.stdcall.}
  glGetUniformBlockIndex*: proc (program: GLuint, uniformBlockName: cstring): GLuint {.stdcall.}
  glGetActiveUniformBlockiv*: proc (program: GLuint, uniformBlockIndex: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetActiveUniformBlockName*: proc (program: GLuint, uniformBlockIndex: GLuint, bufSize: GLsizei, length: ptr GLsizei, uniformBlockName: cstring) {.stdcall.}
  glUniformBlockBinding*: proc (program: GLuint, uniformBlockIndex: GLuint, uniformBlockBinding: GLuint) {.stdcall.}
  glDrawElementsBaseVertex*: proc (mode: GLenum, count: GLsizei, `type`: GLenum, indices: pointer, basevertex: GLint) {.stdcall.}
  glDrawRangeElementsBaseVertex*: proc (mode: GLenum, start: GLuint, `end`: GLuint, count: GLsizei, `type`: GLenum, indices: pointer, basevertex: GLint) {.stdcall.}
  glDrawElementsInstancedBaseVertex*: proc (mode: GLenum, count: GLsizei, `type`: GLenum, indices: pointer, instancecount: GLsizei, basevertex: GLint) {.stdcall.}
  glMultiDrawElementsBaseVertex*: proc (mode: GLenum, count: ptr GLsizei, `type`: GLenum, indices: ptr pointer, drawcount: GLsizei, basevertex: ptr GLint) {.stdcall.}
  glProvokingVertex*: proc (mode: GLenum) {.stdcall.}
  glFenceSync*: proc (condition: GLenum, flags: GLbitfield): GLsync {.stdcall.}
  glIsSync*: proc (sync: GLsync): GLboolean {.stdcall.}
  glDeleteSync*: proc (sync: GLsync) {.stdcall.}
  glClientWaitSync*: proc (sync: GLsync, flags: GLbitfield, timeout: GLuint64): GLenum {.stdcall.}
  glWaitSync*: proc (sync: GLsync, flags: GLbitfield, timeout: GLuint64) {.stdcall.}
  glGetInteger64v*: proc (pname: GLenum, data: ptr GLint64) {.stdcall.}
  glGetSynciv*: proc (sync: GLsync, pname: GLenum, count: GLsizei, length: ptr GLsizei, values: ptr GLint) {.stdcall.}
  glGetInteger64i_v*: proc (target: GLenum, index: GLuint, data: ptr GLint64) {.stdcall.}
  glGetBufferParameteri64v*: proc (target: GLenum, pname: GLenum, params: ptr GLint64) {.stdcall.}
  glFramebufferTexture*: proc (target: GLenum, attachment: GLenum, texture: GLuint, level: GLint) {.stdcall.}
  glTexImage2DMultisample*: proc (target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, fixedsamplelocations: GLboolean) {.stdcall.}
  glTexImage3DMultisample*: proc (target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, fixedsamplelocations: GLboolean) {.stdcall.}
  glGetMultisamplefv*: proc (pname: GLenum, index: GLuint, val: ptr GLfloat) {.stdcall.}
  glSampleMaski*: proc (maskNumber: GLuint, mask: GLbitfield) {.stdcall.}
  glBindFragDataLocationIndexed*: proc (program: GLuint, colorNumber: GLuint, index: GLuint, name: cstring) {.stdcall.}
  glGetFragDataIndex*: proc (program: GLuint, name: cstring): GLint {.stdcall.}
  glGenSamplers*: proc (count: GLsizei, samplers: ptr GLuint) {.stdcall.}
  glDeleteSamplers*: proc (count: GLsizei, samplers: ptr GLuint) {.stdcall.}
  glIsSampler*: proc (sampler: GLuint): GLboolean {.stdcall.}
  glBindSampler*: proc (unit: GLuint, sampler: GLuint) {.stdcall.}
  glSamplerParameteri*: proc (sampler: GLuint, pname: GLenum, param: GLint) {.stdcall.}
  glSamplerParameteriv*: proc (sampler: GLuint, pname: GLenum, param: ptr GLint) {.stdcall.}
  glSamplerParameterf*: proc (sampler: GLuint, pname: GLenum, param: GLfloat) {.stdcall.}
  glSamplerParameterfv*: proc (sampler: GLuint, pname: GLenum, param: ptr GLfloat) {.stdcall.}
  glSamplerParameterIiv*: proc (sampler: GLuint, pname: GLenum, param: ptr GLint) {.stdcall.}
  glSamplerParameterIuiv*: proc (sampler: GLuint, pname: GLenum, param: ptr GLuint) {.stdcall.}
  glGetSamplerParameteriv*: proc (sampler: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetSamplerParameterIiv*: proc (sampler: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}
  glGetSamplerParameterfv*: proc (sampler: GLuint, pname: GLenum, params: ptr GLfloat) {.stdcall.}
  glGetSamplerParameterIuiv*: proc (sampler: GLuint, pname: GLenum, params: ptr GLuint) {.stdcall.}
  glQueryCounter*: proc (id: GLuint, target: GLenum) {.stdcall.}
  glGetQueryObjecti64v*: proc (id: GLuint, pname: GLenum, params: ptr GLint64) {.stdcall.}
  glGetQueryObjectui64v*: proc (id: GLuint, pname: GLenum, params: ptr GLuint64) {.stdcall.}
  glVertexAttribDivisor*: proc (index: GLuint, divisor: GLuint) {.stdcall.}
  glVertexAttribP1ui*: proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: GLuint) {.stdcall.}
  glVertexAttribP1uiv*: proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: ptr GLuint) {.stdcall.}
  glVertexAttribP2ui*: proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: GLuint) {.stdcall.}
  glVertexAttribP2uiv*: proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: ptr GLuint) {.stdcall.}
  glVertexAttribP3ui*: proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: GLuint) {.stdcall.}
  glVertexAttribP3uiv*: proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: ptr GLuint) {.stdcall.}
  glVertexAttribP4ui*: proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: GLuint) {.stdcall.}
  glVertexAttribP4uiv*: proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: ptr GLuint) {.stdcall.}
  glVertexP2ui*: proc (`type`: GLenum, value: GLuint) {.stdcall.}
  glVertexP2uiv*: proc (`type`: GLenum, value: ptr GLuint) {.stdcall.}
  glVertexP3ui*: proc (`type`: GLenum, value: GLuint) {.stdcall.}
  glVertexP3uiv*: proc (`type`: GLenum, value: ptr GLuint) {.stdcall.}
  glVertexP4ui*: proc (`type`: GLenum, value: GLuint) {.stdcall.}
  glVertexP4uiv*: proc (`type`: GLenum, value: ptr GLuint) {.stdcall.}
  glTexCoordP1ui*: proc (`type`: GLenum, coords: GLuint) {.stdcall.}
  glTexCoordP1uiv*: proc (`type`: GLenum, coords: ptr GLuint) {.stdcall.}
  glTexCoordP2ui*: proc (`type`: GLenum, coords: GLuint) {.stdcall.}
  glTexCoordP2uiv*: proc (`type`: GLenum, coords: ptr GLuint) {.stdcall.}
  glTexCoordP3ui*: proc (`type`: GLenum, coords: GLuint) {.stdcall.}
  glTexCoordP3uiv*: proc (`type`: GLenum, coords: ptr GLuint) {.stdcall.}
  glTexCoordP4ui*: proc (`type`: GLenum, coords: GLuint) {.stdcall.}
  glTexCoordP4uiv*: proc (`type`: GLenum, coords: ptr GLuint) {.stdcall.}
  glMultiTexCoordP1ui*: proc (texture: GLenum, `type`: GLenum, coords: GLuint) {.stdcall.}
  glMultiTexCoordP1uiv*: proc (texture: GLenum, `type`: GLenum, coords: ptr GLuint) {.stdcall.}
  glMultiTexCoordP2ui*: proc (texture: GLenum, `type`: GLenum, coords: GLuint) {.stdcall.}
  glMultiTexCoordP2uiv*: proc (texture: GLenum, `type`: GLenum, coords: ptr GLuint) {.stdcall.}
  glMultiTexCoordP3ui*: proc (texture: GLenum, `type`: GLenum, coords: GLuint) {.stdcall.}
  glMultiTexCoordP3uiv*: proc (texture: GLenum, `type`: GLenum, coords: ptr GLuint) {.stdcall.}
  glMultiTexCoordP4ui*: proc (texture: GLenum, `type`: GLenum, coords: GLuint) {.stdcall.}
  glMultiTexCoordP4uiv*: proc (texture: GLenum, `type`: GLenum, coords: ptr GLuint) {.stdcall.}
  glNormalP3ui*: proc (`type`: GLenum, coords: GLuint) {.stdcall.}
  glNormalP3uiv*: proc (`type`: GLenum, coords: ptr GLuint) {.stdcall.}
  glColorP3ui*: proc (`type`: GLenum, color: GLuint) {.stdcall.}
  glColorP3uiv*: proc (`type`: GLenum, color: ptr GLuint) {.stdcall.}
  glColorP4ui*: proc (`type`: GLenum, color: GLuint) {.stdcall.}
  glColorP4uiv*: proc (`type`: GLenum, color: ptr GLuint) {.stdcall.}
  glSecondaryColorP3ui*: proc (`type`: GLenum, color: GLuint) {.stdcall.}
  glSecondaryColorP3uiv*: proc (`type`: GLenum, color: ptr GLuint) {.stdcall.}


# Extensions
var
  GLAD_GL_ARB_multisample*: bool
  GL_MULTISAMPLE_ARB* = 0x809D.GLenum
  GL_SAMPLE_ALPHA_TO_COVERAGE_ARB* = 0x809E.GLenum
  GL_SAMPLE_ALPHA_TO_ONE_ARB* = 0x809F.GLenum
  GL_SAMPLE_COVERAGE_ARB* = 0x80A0.GLenum
  GL_SAMPLE_BUFFERS_ARB* = 0x80A8.GLenum
  GL_SAMPLES_ARB* = 0x80A9.GLenum
  GL_SAMPLE_COVERAGE_VALUE_ARB* = 0x80AA.GLenum
  GL_SAMPLE_COVERAGE_INVERT_ARB* = 0x80AB.GLenum
  GL_MULTISAMPLE_BIT_ARB* = 0x20000000.GLbitfield

  GLAD_GL_EXT_framebuffer_multisample*: bool
  GL_RENDERBUFFER_SAMPLES_EXT* = 0x8CAB.GLenum
  GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT* = 0x8D56.GLenum
  GL_MAX_SAMPLES_EXT* = 0x8D57.GLenum

  GLAD_GL_EXT_texture_filter_anisotropic*: bool
  GL_TEXTURE_MAX_ANISOTROPY_EXT* = 0x84FE.GLenum
  GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT* = 0x84FF.GLenum

  glSampleCoverageARB*: proc (value: GLfloat, invert: GLboolean) {.stdcall.}
  glRenderbufferStorageMultisampleEXT*: proc (target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) {.stdcall.}


proc hasExt(extname: string): bool =
  if extname.len == 0:
    return false

  if glVersionMajor < 3:
    var extensions = $cast[cstring](glGetString(GL_EXTENSIONS))
    if extensions.len == 0:
      return false

    var
      loc, terminatorLoc: int
      terminator: char

    while true:
      loc = extensions.find(extname)
      if loc < 0:
        return false

      terminatorLoc = loc + extname.len
      terminator = extensions[terminatorLoc]

      if (loc == 0 or extensions[loc - 1] == ' ') and
         (terminator == ' ' or terminator == '\0'):
        return true

      extensions = extensions[terminatorLoc..^1]

  else:
    var
      num: GLint
      s: cstring

    glGetIntegerv(GL_NUM_EXTENSIONS, num.addr)

    for i in 0..num-1:
      s = cast[cstring](glGetStringi(GL_EXTENSIONS, GLuint(i)))
      if s == extname:
        return true


proc load_GL_VERSION_1_0(load: proc) =
  if not GLAD_GL_VERSION_1_0: return

  glCullFace = cast[proc (mode: GLenum) {.stdcall.}](load("glCullFace"))
  glFrontFace = cast[proc (mode: GLenum) {.stdcall.}](load("glFrontFace"))
  glHint = cast[proc (target: GLenum, mode: GLenum) {.stdcall.}](load("glHint"))
  glLineWidth = cast[proc (width: GLfloat) {.stdcall.}](load("glLineWidth"))
  glPointSize = cast[proc (size: GLfloat) {.stdcall.}](load("glPointSize"))
  glPolygonMode = cast[proc (face: GLenum, mode: GLenum) {.stdcall.}](load("glPolygonMode"))
  glScissor = cast[proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei) {.stdcall.}](load("glScissor"))
  glTexParameterf = cast[proc (target: GLenum, pname: GLenum, param: GLfloat) {.stdcall.}](load("glTexParameterf"))
  glTexParameterfv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glTexParameterfv"))
  glTexParameteri = cast[proc (target: GLenum, pname: GLenum, param: GLint) {.stdcall.}](load("glTexParameteri"))
  glTexParameteriv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glTexParameteriv"))
  glTexImage1D = cast[proc (target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, border: GLint, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}](load("glTexImage1D"))
  glTexImage2D = cast[proc (target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, border: GLint, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}](load("glTexImage2D"))
  glDrawBuffer = cast[proc (buf: GLenum) {.stdcall.}](load("glDrawBuffer"))
  glClear = cast[proc (mask: GLbitfield) {.stdcall.}](load("glClear"))
  glClearColor = cast[proc (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) {.stdcall.}](load("glClearColor"))
  glClearStencil = cast[proc (s: GLint) {.stdcall.}](load("glClearStencil"))
  glClearDepth = cast[proc (depth: GLdouble) {.stdcall.}](load("glClearDepth"))
  glStencilMask = cast[proc (mask: GLuint) {.stdcall.}](load("glStencilMask"))
  glColorMask = cast[proc (red: GLboolean, green: GLboolean, blue: GLboolean, alpha: GLboolean) {.stdcall.}](load("glColorMask"))
  glDepthMask = cast[proc (flag: GLboolean) {.stdcall.}](load("glDepthMask"))
  glDisable = cast[proc (cap: GLenum) {.stdcall.}](load("glDisable"))
  glEnable = cast[proc (cap: GLenum) {.stdcall.}](load("glEnable"))
  glFinish = cast[proc () {.stdcall.}](load("glFinish"))
  glFlush = cast[proc () {.stdcall.}](load("glFlush"))
  glBlendFunc = cast[proc (sfactor: GLenum, dfactor: GLenum) {.stdcall.}](load("glBlendFunc"))
  glLogicOp = cast[proc (opcode: GLenum) {.stdcall.}](load("glLogicOp"))
  glStencilFunc = cast[proc (`func`: GLenum, `ref`: GLint, mask: GLuint) {.stdcall.}](load("glStencilFunc"))
  glStencilOp = cast[proc (fail: GLenum, zfail: GLenum, zpass: GLenum) {.stdcall.}](load("glStencilOp"))
  glDepthFunc = cast[proc (`func`: GLenum) {.stdcall.}](load("glDepthFunc"))
  glPixelStoref = cast[proc (pname: GLenum, param: GLfloat) {.stdcall.}](load("glPixelStoref"))
  glPixelStorei = cast[proc (pname: GLenum, param: GLint) {.stdcall.}](load("glPixelStorei"))
  glReadBuffer = cast[proc (src: GLenum) {.stdcall.}](load("glReadBuffer"))
  glReadPixels = cast[proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}](load("glReadPixels"))
  glGetBooleanv = cast[proc (pname: GLenum, data: ptr GLboolean) {.stdcall.}](load("glGetBooleanv"))
  glGetDoublev = cast[proc (pname: GLenum, data: ptr GLdouble) {.stdcall.}](load("glGetDoublev"))
  glGetError = cast[proc (): GLenum {.stdcall.}](load("glGetError"))
  glGetFloatv = cast[proc (pname: GLenum, data: ptr GLfloat) {.stdcall.}](load("glGetFloatv"))
  glGetIntegerv = cast[proc (pname: GLenum, data: ptr GLint) {.stdcall.}](load("glGetIntegerv"))
  glGetString = cast[proc (name: GLenum): ptr GLubyte {.stdcall.}](load("glGetString"))
  glGetTexImage = cast[proc (target: GLenum, level: GLint, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}](load("glGetTexImage"))
  glGetTexParameterfv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glGetTexParameterfv"))
  glGetTexParameteriv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetTexParameteriv"))
  glGetTexLevelParameterfv = cast[proc (target: GLenum, level: GLint, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glGetTexLevelParameterfv"))
  glGetTexLevelParameteriv = cast[proc (target: GLenum, level: GLint, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetTexLevelParameteriv"))
  glIsEnabled = cast[proc (cap: GLenum): GLboolean {.stdcall.}](load("glIsEnabled"))
  glDepthRange = cast[proc (n: GLdouble, f: GLdouble) {.stdcall.}](load("glDepthRange"))
  glViewport = cast[proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei) {.stdcall.}](load("glViewport"))
  glNewList = cast[proc (list: GLuint, mode: GLenum) {.stdcall.}](load("glNewList"))
  glEndList = cast[proc () {.stdcall.}](load("glEndList"))
  glCallList = cast[proc (list: GLuint) {.stdcall.}](load("glCallList"))
  glCallLists = cast[proc (n: GLsizei, `type`: GLenum, lists: pointer) {.stdcall.}](load("glCallLists"))
  glDeleteLists = cast[proc (list: GLuint, range: GLsizei) {.stdcall.}](load("glDeleteLists"))
  glGenLists = cast[proc (range: GLsizei): GLuint {.stdcall.}](load("glGenLists"))
  glListBase = cast[proc (base: GLuint) {.stdcall.}](load("glListBase"))
  glBegin = cast[proc (mode: GLenum) {.stdcall.}](load("glBegin"))
  glBitmap = cast[proc (width: GLsizei, height: GLsizei, xorig: GLfloat, yorig: GLfloat, xmove: GLfloat, ymove: GLfloat, bitmap: ptr GLubyte) {.stdcall.}](load("glBitmap"))
  glColor3b = cast[proc (red: GLbyte, green: GLbyte, blue: GLbyte) {.stdcall.}](load("glColor3b"))
  glColor3bv = cast[proc (v: ptr GLbyte) {.stdcall.}](load("glColor3bv"))
  glColor3d = cast[proc (red: GLdouble, green: GLdouble, blue: GLdouble) {.stdcall.}](load("glColor3d"))
  glColor3dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glColor3dv"))
  glColor3f = cast[proc (red: GLfloat, green: GLfloat, blue: GLfloat) {.stdcall.}](load("glColor3f"))
  glColor3fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glColor3fv"))
  glColor3i = cast[proc (red: GLint, green: GLint, blue: GLint) {.stdcall.}](load("glColor3i"))
  glColor3iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glColor3iv"))
  glColor3s = cast[proc (red: GLshort, green: GLshort, blue: GLshort) {.stdcall.}](load("glColor3s"))
  glColor3sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glColor3sv"))
  glColor3ub = cast[proc (red: GLubyte, green: GLubyte, blue: GLubyte) {.stdcall.}](load("glColor3ub"))
  glColor3ubv = cast[proc (v: ptr GLubyte) {.stdcall.}](load("glColor3ubv"))
  glColor3ui = cast[proc (red: GLuint, green: GLuint, blue: GLuint) {.stdcall.}](load("glColor3ui"))
  glColor3uiv = cast[proc (v: ptr GLuint) {.stdcall.}](load("glColor3uiv"))
  glColor3us = cast[proc (red: GLushort, green: GLushort, blue: GLushort) {.stdcall.}](load("glColor3us"))
  glColor3usv = cast[proc (v: ptr GLushort) {.stdcall.}](load("glColor3usv"))
  glColor4b = cast[proc (red: GLbyte, green: GLbyte, blue: GLbyte, alpha: GLbyte) {.stdcall.}](load("glColor4b"))
  glColor4bv = cast[proc (v: ptr GLbyte) {.stdcall.}](load("glColor4bv"))
  glColor4d = cast[proc (red: GLdouble, green: GLdouble, blue: GLdouble, alpha: GLdouble) {.stdcall.}](load("glColor4d"))
  glColor4dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glColor4dv"))
  glColor4f = cast[proc (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) {.stdcall.}](load("glColor4f"))
  glColor4fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glColor4fv"))
  glColor4i = cast[proc (red: GLint, green: GLint, blue: GLint, alpha: GLint) {.stdcall.}](load("glColor4i"))
  glColor4iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glColor4iv"))
  glColor4s = cast[proc (red: GLshort, green: GLshort, blue: GLshort, alpha: GLshort) {.stdcall.}](load("glColor4s"))
  glColor4sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glColor4sv"))
  glColor4ub = cast[proc (red: GLubyte, green: GLubyte, blue: GLubyte, alpha: GLubyte) {.stdcall.}](load("glColor4ub"))
  glColor4ubv = cast[proc (v: ptr GLubyte) {.stdcall.}](load("glColor4ubv"))
  glColor4ui = cast[proc (red: GLuint, green: GLuint, blue: GLuint, alpha: GLuint) {.stdcall.}](load("glColor4ui"))
  glColor4uiv = cast[proc (v: ptr GLuint) {.stdcall.}](load("glColor4uiv"))
  glColor4us = cast[proc (red: GLushort, green: GLushort, blue: GLushort, alpha: GLushort) {.stdcall.}](load("glColor4us"))
  glColor4usv = cast[proc (v: ptr GLushort) {.stdcall.}](load("glColor4usv"))
  glEdgeFlag = cast[proc (flag: GLboolean) {.stdcall.}](load("glEdgeFlag"))
  glEdgeFlagv = cast[proc (flag: ptr GLboolean) {.stdcall.}](load("glEdgeFlagv"))
  glEnd = cast[proc () {.stdcall.}](load("glEnd"))
  glIndexd = cast[proc (c: GLdouble) {.stdcall.}](load("glIndexd"))
  glIndexdv = cast[proc (c: ptr GLdouble) {.stdcall.}](load("glIndexdv"))
  glIndexf = cast[proc (c: GLfloat) {.stdcall.}](load("glIndexf"))
  glIndexfv = cast[proc (c: ptr GLfloat) {.stdcall.}](load("glIndexfv"))
  glIndexi = cast[proc (c: GLint) {.stdcall.}](load("glIndexi"))
  glIndexiv = cast[proc (c: ptr GLint) {.stdcall.}](load("glIndexiv"))
  glIndexs = cast[proc (c: GLshort) {.stdcall.}](load("glIndexs"))
  glIndexsv = cast[proc (c: ptr GLshort) {.stdcall.}](load("glIndexsv"))
  glNormal3b = cast[proc (nx: GLbyte, ny: GLbyte, nz: GLbyte) {.stdcall.}](load("glNormal3b"))
  glNormal3bv = cast[proc (v: ptr GLbyte) {.stdcall.}](load("glNormal3bv"))
  glNormal3d = cast[proc (nx: GLdouble, ny: GLdouble, nz: GLdouble) {.stdcall.}](load("glNormal3d"))
  glNormal3dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glNormal3dv"))
  glNormal3f = cast[proc (nx: GLfloat, ny: GLfloat, nz: GLfloat) {.stdcall.}](load("glNormal3f"))
  glNormal3fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glNormal3fv"))
  glNormal3i = cast[proc (nx: GLint, ny: GLint, nz: GLint) {.stdcall.}](load("glNormal3i"))
  glNormal3iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glNormal3iv"))
  glNormal3s = cast[proc (nx: GLshort, ny: GLshort, nz: GLshort) {.stdcall.}](load("glNormal3s"))
  glNormal3sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glNormal3sv"))
  glRasterPos2d = cast[proc (x: GLdouble, y: GLdouble) {.stdcall.}](load("glRasterPos2d"))
  glRasterPos2dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glRasterPos2dv"))
  glRasterPos2f = cast[proc (x: GLfloat, y: GLfloat) {.stdcall.}](load("glRasterPos2f"))
  glRasterPos2fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glRasterPos2fv"))
  glRasterPos2i = cast[proc (x: GLint, y: GLint) {.stdcall.}](load("glRasterPos2i"))
  glRasterPos2iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glRasterPos2iv"))
  glRasterPos2s = cast[proc (x: GLshort, y: GLshort) {.stdcall.}](load("glRasterPos2s"))
  glRasterPos2sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glRasterPos2sv"))
  glRasterPos3d = cast[proc (x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}](load("glRasterPos3d"))
  glRasterPos3dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glRasterPos3dv"))
  glRasterPos3f = cast[proc (x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}](load("glRasterPos3f"))
  glRasterPos3fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glRasterPos3fv"))
  glRasterPos3i = cast[proc (x: GLint, y: GLint, z: GLint) {.stdcall.}](load("glRasterPos3i"))
  glRasterPos3iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glRasterPos3iv"))
  glRasterPos3s = cast[proc (x: GLshort, y: GLshort, z: GLshort) {.stdcall.}](load("glRasterPos3s"))
  glRasterPos3sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glRasterPos3sv"))
  glRasterPos4d = cast[proc (x: GLdouble, y: GLdouble, z: GLdouble, w: GLdouble) {.stdcall.}](load("glRasterPos4d"))
  glRasterPos4dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glRasterPos4dv"))
  glRasterPos4f = cast[proc (x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) {.stdcall.}](load("glRasterPos4f"))
  glRasterPos4fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glRasterPos4fv"))
  glRasterPos4i = cast[proc (x: GLint, y: GLint, z: GLint, w: GLint) {.stdcall.}](load("glRasterPos4i"))
  glRasterPos4iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glRasterPos4iv"))
  glRasterPos4s = cast[proc (x: GLshort, y: GLshort, z: GLshort, w: GLshort) {.stdcall.}](load("glRasterPos4s"))
  glRasterPos4sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glRasterPos4sv"))
  glRectd = cast[proc (x1: GLdouble, y1: GLdouble, x2: GLdouble, y2: GLdouble) {.stdcall.}](load("glRectd"))
  glRectdv = cast[proc (v1: ptr GLdouble, v2: ptr GLdouble) {.stdcall.}](load("glRectdv"))
  glRectf = cast[proc (x1: GLfloat, y1: GLfloat, x2: GLfloat, y2: GLfloat) {.stdcall.}](load("glRectf"))
  glRectfv = cast[proc (v1: ptr GLfloat, v2: ptr GLfloat) {.stdcall.}](load("glRectfv"))
  glRecti = cast[proc (x1: GLint, y1: GLint, x2: GLint, y2: GLint) {.stdcall.}](load("glRecti"))
  glRectiv = cast[proc (v1: ptr GLint, v2: ptr GLint) {.stdcall.}](load("glRectiv"))
  glRects = cast[proc (x1: GLshort, y1: GLshort, x2: GLshort, y2: GLshort) {.stdcall.}](load("glRects"))
  glRectsv = cast[proc (v1: ptr GLshort, v2: ptr GLshort) {.stdcall.}](load("glRectsv"))
  glTexCoord1d = cast[proc (s: GLdouble) {.stdcall.}](load("glTexCoord1d"))
  glTexCoord1dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glTexCoord1dv"))
  glTexCoord1f = cast[proc (s: GLfloat) {.stdcall.}](load("glTexCoord1f"))
  glTexCoord1fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glTexCoord1fv"))
  glTexCoord1i = cast[proc (s: GLint) {.stdcall.}](load("glTexCoord1i"))
  glTexCoord1iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glTexCoord1iv"))
  glTexCoord1s = cast[proc (s: GLshort) {.stdcall.}](load("glTexCoord1s"))
  glTexCoord1sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glTexCoord1sv"))
  glTexCoord2d = cast[proc (s: GLdouble, t: GLdouble) {.stdcall.}](load("glTexCoord2d"))
  glTexCoord2dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glTexCoord2dv"))
  glTexCoord2f = cast[proc (s: GLfloat, t: GLfloat) {.stdcall.}](load("glTexCoord2f"))
  glTexCoord2fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glTexCoord2fv"))
  glTexCoord2i = cast[proc (s: GLint, t: GLint) {.stdcall.}](load("glTexCoord2i"))
  glTexCoord2iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glTexCoord2iv"))
  glTexCoord2s = cast[proc (s: GLshort, t: GLshort) {.stdcall.}](load("glTexCoord2s"))
  glTexCoord2sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glTexCoord2sv"))
  glTexCoord3d = cast[proc (s: GLdouble, t: GLdouble, r: GLdouble) {.stdcall.}](load("glTexCoord3d"))
  glTexCoord3dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glTexCoord3dv"))
  glTexCoord3f = cast[proc (s: GLfloat, t: GLfloat, r: GLfloat) {.stdcall.}](load("glTexCoord3f"))
  glTexCoord3fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glTexCoord3fv"))
  glTexCoord3i = cast[proc (s: GLint, t: GLint, r: GLint) {.stdcall.}](load("glTexCoord3i"))
  glTexCoord3iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glTexCoord3iv"))
  glTexCoord3s = cast[proc (s: GLshort, t: GLshort, r: GLshort) {.stdcall.}](load("glTexCoord3s"))
  glTexCoord3sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glTexCoord3sv"))
  glTexCoord4d = cast[proc (s: GLdouble, t: GLdouble, r: GLdouble, q: GLdouble) {.stdcall.}](load("glTexCoord4d"))
  glTexCoord4dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glTexCoord4dv"))
  glTexCoord4f = cast[proc (s: GLfloat, t: GLfloat, r: GLfloat, q: GLfloat) {.stdcall.}](load("glTexCoord4f"))
  glTexCoord4fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glTexCoord4fv"))
  glTexCoord4i = cast[proc (s: GLint, t: GLint, r: GLint, q: GLint) {.stdcall.}](load("glTexCoord4i"))
  glTexCoord4iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glTexCoord4iv"))
  glTexCoord4s = cast[proc (s: GLshort, t: GLshort, r: GLshort, q: GLshort) {.stdcall.}](load("glTexCoord4s"))
  glTexCoord4sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glTexCoord4sv"))
  glVertex2d = cast[proc (x: GLdouble, y: GLdouble) {.stdcall.}](load("glVertex2d"))
  glVertex2dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glVertex2dv"))
  glVertex2f = cast[proc (x: GLfloat, y: GLfloat) {.stdcall.}](load("glVertex2f"))
  glVertex2fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glVertex2fv"))
  glVertex2i = cast[proc (x: GLint, y: GLint) {.stdcall.}](load("glVertex2i"))
  glVertex2iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glVertex2iv"))
  glVertex2s = cast[proc (x: GLshort, y: GLshort) {.stdcall.}](load("glVertex2s"))
  glVertex2sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glVertex2sv"))
  glVertex3d = cast[proc (x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}](load("glVertex3d"))
  glVertex3dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glVertex3dv"))
  glVertex3f = cast[proc (x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}](load("glVertex3f"))
  glVertex3fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glVertex3fv"))
  glVertex3i = cast[proc (x: GLint, y: GLint, z: GLint) {.stdcall.}](load("glVertex3i"))
  glVertex3iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glVertex3iv"))
  glVertex3s = cast[proc (x: GLshort, y: GLshort, z: GLshort) {.stdcall.}](load("glVertex3s"))
  glVertex3sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glVertex3sv"))
  glVertex4d = cast[proc (x: GLdouble, y: GLdouble, z: GLdouble, w: GLdouble) {.stdcall.}](load("glVertex4d"))
  glVertex4dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glVertex4dv"))
  glVertex4f = cast[proc (x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) {.stdcall.}](load("glVertex4f"))
  glVertex4fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glVertex4fv"))
  glVertex4i = cast[proc (x: GLint, y: GLint, z: GLint, w: GLint) {.stdcall.}](load("glVertex4i"))
  glVertex4iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glVertex4iv"))
  glVertex4s = cast[proc (x: GLshort, y: GLshort, z: GLshort, w: GLshort) {.stdcall.}](load("glVertex4s"))
  glVertex4sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glVertex4sv"))
  glClipPlane = cast[proc (plane: GLenum, equation: ptr GLdouble) {.stdcall.}](load("glClipPlane"))
  glColorMaterial = cast[proc (face: GLenum, mode: GLenum) {.stdcall.}](load("glColorMaterial"))
  glFogf = cast[proc (pname: GLenum, param: GLfloat) {.stdcall.}](load("glFogf"))
  glFogfv = cast[proc (pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glFogfv"))
  glFogi = cast[proc (pname: GLenum, param: GLint) {.stdcall.}](load("glFogi"))
  glFogiv = cast[proc (pname: GLenum, params: ptr GLint) {.stdcall.}](load("glFogiv"))
  glLightf = cast[proc (light: GLenum, pname: GLenum, param: GLfloat) {.stdcall.}](load("glLightf"))
  glLightfv = cast[proc (light: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glLightfv"))
  glLighti = cast[proc (light: GLenum, pname: GLenum, param: GLint) {.stdcall.}](load("glLighti"))
  glLightiv = cast[proc (light: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glLightiv"))
  glLightModelf = cast[proc (pname: GLenum, param: GLfloat) {.stdcall.}](load("glLightModelf"))
  glLightModelfv = cast[proc (pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glLightModelfv"))
  glLightModeli = cast[proc (pname: GLenum, param: GLint) {.stdcall.}](load("glLightModeli"))
  glLightModeliv = cast[proc (pname: GLenum, params: ptr GLint) {.stdcall.}](load("glLightModeliv"))
  glLineStipple = cast[proc (factor: GLint, pattern: GLushort) {.stdcall.}](load("glLineStipple"))
  glMaterialf = cast[proc (face: GLenum, pname: GLenum, param: GLfloat) {.stdcall.}](load("glMaterialf"))
  glMaterialfv = cast[proc (face: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glMaterialfv"))
  glMateriali = cast[proc (face: GLenum, pname: GLenum, param: GLint) {.stdcall.}](load("glMateriali"))
  glMaterialiv = cast[proc (face: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glMaterialiv"))
  glPolygonStipple = cast[proc (mask: ptr GLubyte) {.stdcall.}](load("glPolygonStipple"))
  glShadeModel = cast[proc (mode: GLenum) {.stdcall.}](load("glShadeModel"))
  glTexEnvf = cast[proc (target: GLenum, pname: GLenum, param: GLfloat) {.stdcall.}](load("glTexEnvf"))
  glTexEnvfv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glTexEnvfv"))
  glTexEnvi = cast[proc (target: GLenum, pname: GLenum, param: GLint) {.stdcall.}](load("glTexEnvi"))
  glTexEnviv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glTexEnviv"))
  glTexGend = cast[proc (coord: GLenum, pname: GLenum, param: GLdouble) {.stdcall.}](load("glTexGend"))
  glTexGendv = cast[proc (coord: GLenum, pname: GLenum, params: ptr GLdouble) {.stdcall.}](load("glTexGendv"))
  glTexGenf = cast[proc (coord: GLenum, pname: GLenum, param: GLfloat) {.stdcall.}](load("glTexGenf"))
  glTexGenfv = cast[proc (coord: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glTexGenfv"))
  glTexGeni = cast[proc (coord: GLenum, pname: GLenum, param: GLint) {.stdcall.}](load("glTexGeni"))
  glTexGeniv = cast[proc (coord: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glTexGeniv"))
  glFeedbackBuffer = cast[proc (size: GLsizei, `type`: GLenum, buffer: ptr GLfloat) {.stdcall.}](load("glFeedbackBuffer"))
  glSelectBuffer = cast[proc (size: GLsizei, buffer: ptr GLuint) {.stdcall.}](load("glSelectBuffer"))
  glRenderMode = cast[proc (mode: GLenum): GLint {.stdcall.}](load("glRenderMode"))
  glInitNames = cast[proc () {.stdcall.}](load("glInitNames"))
  glLoadName = cast[proc (name: GLuint) {.stdcall.}](load("glLoadName"))
  glPassThrough = cast[proc (token: GLfloat) {.stdcall.}](load("glPassThrough"))
  glPopName = cast[proc () {.stdcall.}](load("glPopName"))
  glPushName = cast[proc (name: GLuint) {.stdcall.}](load("glPushName"))
  glClearAccum = cast[proc (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) {.stdcall.}](load("glClearAccum"))
  glClearIndex = cast[proc (c: GLfloat) {.stdcall.}](load("glClearIndex"))
  glIndexMask = cast[proc (mask: GLuint) {.stdcall.}](load("glIndexMask"))
  glAccum = cast[proc (op: GLenum, value: GLfloat) {.stdcall.}](load("glAccum"))
  glPopAttrib = cast[proc () {.stdcall.}](load("glPopAttrib"))
  glPushAttrib = cast[proc (mask: GLbitfield) {.stdcall.}](load("glPushAttrib"))
  glMap1d = cast[proc (target: GLenum, u1: GLdouble, u2: GLdouble, stride: GLint, order: GLint, points: ptr GLdouble) {.stdcall.}](load("glMap1d"))
  glMap1f = cast[proc (target: GLenum, u1: GLfloat, u2: GLfloat, stride: GLint, order: GLint, points: ptr GLfloat) {.stdcall.}](load("glMap1f"))
  glMap2d = cast[proc (target: GLenum, u1: GLdouble, u2: GLdouble, ustride: GLint, uorder: GLint, v1: GLdouble, v2: GLdouble, vstride: GLint, vorder: GLint, points: ptr GLdouble) {.stdcall.}](load("glMap2d"))
  glMap2f = cast[proc (target: GLenum, u1: GLfloat, u2: GLfloat, ustride: GLint, uorder: GLint, v1: GLfloat, v2: GLfloat, vstride: GLint, vorder: GLint, points: ptr GLfloat) {.stdcall.}](load("glMap2f"))
  glMapGrid1d = cast[proc (un: GLint, u1: GLdouble, u2: GLdouble) {.stdcall.}](load("glMapGrid1d"))
  glMapGrid1f = cast[proc (un: GLint, u1: GLfloat, u2: GLfloat) {.stdcall.}](load("glMapGrid1f"))
  glMapGrid2d = cast[proc (un: GLint, u1: GLdouble, u2: GLdouble, vn: GLint, v1: GLdouble, v2: GLdouble) {.stdcall.}](load("glMapGrid2d"))
  glMapGrid2f = cast[proc (un: GLint, u1: GLfloat, u2: GLfloat, vn: GLint, v1: GLfloat, v2: GLfloat) {.stdcall.}](load("glMapGrid2f"))
  glEvalCoord1d = cast[proc (u: GLdouble) {.stdcall.}](load("glEvalCoord1d"))
  glEvalCoord1dv = cast[proc (u: ptr GLdouble) {.stdcall.}](load("glEvalCoord1dv"))
  glEvalCoord1f = cast[proc (u: GLfloat) {.stdcall.}](load("glEvalCoord1f"))
  glEvalCoord1fv = cast[proc (u: ptr GLfloat) {.stdcall.}](load("glEvalCoord1fv"))
  glEvalCoord2d = cast[proc (u: GLdouble, v: GLdouble) {.stdcall.}](load("glEvalCoord2d"))
  glEvalCoord2dv = cast[proc (u: ptr GLdouble) {.stdcall.}](load("glEvalCoord2dv"))
  glEvalCoord2f = cast[proc (u: GLfloat, v: GLfloat) {.stdcall.}](load("glEvalCoord2f"))
  glEvalCoord2fv = cast[proc (u: ptr GLfloat) {.stdcall.}](load("glEvalCoord2fv"))
  glEvalMesh1 = cast[proc (mode: GLenum, i1: GLint, i2: GLint) {.stdcall.}](load("glEvalMesh1"))
  glEvalPoint1 = cast[proc (i: GLint) {.stdcall.}](load("glEvalPoint1"))
  glEvalMesh2 = cast[proc (mode: GLenum, i1: GLint, i2: GLint, j1: GLint, j2: GLint) {.stdcall.}](load("glEvalMesh2"))
  glEvalPoint2 = cast[proc (i: GLint, j: GLint) {.stdcall.}](load("glEvalPoint2"))
  glAlphaFunc = cast[proc (`func`: GLenum, `ref`: GLfloat) {.stdcall.}](load("glAlphaFunc"))
  glPixelZoom = cast[proc (xfactor: GLfloat, yfactor: GLfloat) {.stdcall.}](load("glPixelZoom"))
  glPixelTransferf = cast[proc (pname: GLenum, param: GLfloat) {.stdcall.}](load("glPixelTransferf"))
  glPixelTransferi = cast[proc (pname: GLenum, param: GLint) {.stdcall.}](load("glPixelTransferi"))
  glPixelMapfv = cast[proc (map: GLenum, mapsize: GLsizei, values: ptr GLfloat) {.stdcall.}](load("glPixelMapfv"))
  glPixelMapuiv = cast[proc (map: GLenum, mapsize: GLsizei, values: ptr GLuint) {.stdcall.}](load("glPixelMapuiv"))
  glPixelMapusv = cast[proc (map: GLenum, mapsize: GLsizei, values: ptr GLushort) {.stdcall.}](load("glPixelMapusv"))
  glCopyPixels = cast[proc (x: GLint, y: GLint, width: GLsizei, height: GLsizei, `type`: GLenum) {.stdcall.}](load("glCopyPixels"))
  glDrawPixels = cast[proc (width: GLsizei, height: GLsizei, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}](load("glDrawPixels"))
  glGetClipPlane = cast[proc (plane: GLenum, equation: ptr GLdouble) {.stdcall.}](load("glGetClipPlane"))
  glGetLightfv = cast[proc (light: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glGetLightfv"))
  glGetLightiv = cast[proc (light: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetLightiv"))
  glGetMapdv = cast[proc (target: GLenum, query: GLenum, v: ptr GLdouble) {.stdcall.}](load("glGetMapdv"))
  glGetMapfv = cast[proc (target: GLenum, query: GLenum, v: ptr GLfloat) {.stdcall.}](load("glGetMapfv"))
  glGetMapiv = cast[proc (target: GLenum, query: GLenum, v: ptr GLint) {.stdcall.}](load("glGetMapiv"))
  glGetMaterialfv = cast[proc (face: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glGetMaterialfv"))
  glGetMaterialiv = cast[proc (face: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetMaterialiv"))
  glGetPixelMapfv = cast[proc (map: GLenum, values: ptr GLfloat) {.stdcall.}](load("glGetPixelMapfv"))
  glGetPixelMapuiv = cast[proc (map: GLenum, values: ptr GLuint) {.stdcall.}](load("glGetPixelMapuiv"))
  glGetPixelMapusv = cast[proc (map: GLenum, values: ptr GLushort) {.stdcall.}](load("glGetPixelMapusv"))
  glGetPolygonStipple = cast[proc (mask: ptr GLubyte) {.stdcall.}](load("glGetPolygonStipple"))
  glGetTexEnvfv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glGetTexEnvfv"))
  glGetTexEnviv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetTexEnviv"))
  glGetTexGendv = cast[proc (coord: GLenum, pname: GLenum, params: ptr GLdouble) {.stdcall.}](load("glGetTexGendv"))
  glGetTexGenfv = cast[proc (coord: GLenum, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glGetTexGenfv"))
  glGetTexGeniv = cast[proc (coord: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetTexGeniv"))
  glIsList = cast[proc (list: GLuint): GLboolean {.stdcall.}](load("glIsList"))
  glFrustum = cast[proc (left: GLdouble, right: GLdouble, bottom: GLdouble, top: GLdouble, zNear: GLdouble, zFar: GLdouble) {.stdcall.}](load("glFrustum"))
  glLoadIdentity = cast[proc () {.stdcall.}](load("glLoadIdentity"))
  glLoadMatrixf = cast[proc (m: ptr GLfloat) {.stdcall.}](load("glLoadMatrixf"))
  glLoadMatrixd = cast[proc (m: ptr GLdouble) {.stdcall.}](load("glLoadMatrixd"))
  glMatrixMode = cast[proc (mode: GLenum) {.stdcall.}](load("glMatrixMode"))
  glMultMatrixf = cast[proc (m: ptr GLfloat) {.stdcall.}](load("glMultMatrixf"))
  glMultMatrixd = cast[proc (m: ptr GLdouble) {.stdcall.}](load("glMultMatrixd"))
  glOrtho = cast[proc (left: GLdouble, right: GLdouble, bottom: GLdouble, top: GLdouble, zNear: GLdouble, zFar: GLdouble) {.stdcall.}](load("glOrtho"))
  glPopMatrix = cast[proc () {.stdcall.}](load("glPopMatrix"))
  glPushMatrix = cast[proc () {.stdcall.}](load("glPushMatrix"))
  glRotated = cast[proc (angle: GLdouble, x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}](load("glRotated"))
  glRotatef = cast[proc (angle: GLfloat, x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}](load("glRotatef"))
  glScaled = cast[proc (x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}](load("glScaled"))
  glScalef = cast[proc (x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}](load("glScalef"))
  glTranslated = cast[proc (x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}](load("glTranslated"))
  glTranslatef = cast[proc (x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}](load("glTranslatef"))


proc load_GL_VERSION_1_1(load: proc) =
  if not GLAD_GL_VERSION_1_1: return

  glDrawArrays = cast[proc (mode: GLenum, first: GLint, count: GLsizei) {.stdcall.}](load("glDrawArrays"))
  glDrawElements = cast[proc (mode: GLenum, count: GLsizei, `type`: GLenum, indices: pointer) {.stdcall.}](load("glDrawElements"))
  glGetPointerv = cast[proc (pname: GLenum, params: ptr pointer) {.stdcall.}](load("glGetPointerv"))
  glPolygonOffset = cast[proc (factor: GLfloat, units: GLfloat) {.stdcall.}](load("glPolygonOffset"))
  glCopyTexImage1D = cast[proc (target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, border: GLint) {.stdcall.}](load("glCopyTexImage1D"))
  glCopyTexImage2D = cast[proc (target: GLenum, level: GLint, internalformat: GLenum, x: GLint, y: GLint, width: GLsizei, height: GLsizei, border: GLint) {.stdcall.}](load("glCopyTexImage2D"))
  glCopyTexSubImage1D = cast[proc (target: GLenum, level: GLint, xoffset: GLint, x: GLint, y: GLint, width: GLsizei) {.stdcall.}](load("glCopyTexSubImage1D"))
  glCopyTexSubImage2D = cast[proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) {.stdcall.}](load("glCopyTexSubImage2D"))
  glTexSubImage1D = cast[proc (target: GLenum, level: GLint, xoffset: GLint, width: GLsizei, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}](load("glTexSubImage1D"))
  glTexSubImage2D = cast[proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}](load("glTexSubImage2D"))
  glBindTexture = cast[proc (target: GLenum, texture: GLuint) {.stdcall.}](load("glBindTexture"))
  glDeleteTextures = cast[proc (n: GLsizei, textures: ptr GLuint) {.stdcall.}](load("glDeleteTextures"))
  glGenTextures = cast[proc (n: GLsizei, textures: ptr GLuint) {.stdcall.}](load("glGenTextures"))
  glIsTexture = cast[proc (texture: GLuint): GLboolean {.stdcall.}](load("glIsTexture"))
  glArrayElement = cast[proc (i: GLint) {.stdcall.}](load("glArrayElement"))
  glColorPointer = cast[proc (size: GLint, `type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}](load("glColorPointer"))
  glDisableClientState = cast[proc (array: GLenum) {.stdcall.}](load("glDisableClientState"))
  glEdgeFlagPointer = cast[proc (stride: GLsizei, pointer: pointer) {.stdcall.}](load("glEdgeFlagPointer"))
  glEnableClientState = cast[proc (array: GLenum) {.stdcall.}](load("glEnableClientState"))
  glIndexPointer = cast[proc (`type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}](load("glIndexPointer"))
  glInterleavedArrays = cast[proc (format: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}](load("glInterleavedArrays"))
  glNormalPointer = cast[proc (`type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}](load("glNormalPointer"))
  glTexCoordPointer = cast[proc (size: GLint, `type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}](load("glTexCoordPointer"))
  glVertexPointer = cast[proc (size: GLint, `type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}](load("glVertexPointer"))
  glAreTexturesResident = cast[proc (n: GLsizei, textures: ptr GLuint, residences: ptr GLboolean): GLboolean {.stdcall.}](load("glAreTexturesResident"))
  glPrioritizeTextures = cast[proc (n: GLsizei, textures: ptr GLuint, priorities: ptr GLfloat) {.stdcall.}](load("glPrioritizeTextures"))
  glIndexub = cast[proc (c: GLubyte) {.stdcall.}](load("glIndexub"))
  glIndexubv = cast[proc (c: ptr GLubyte) {.stdcall.}](load("glIndexubv"))
  glPopClientAttrib = cast[proc () {.stdcall.}](load("glPopClientAttrib"))
  glPushClientAttrib = cast[proc (mask: GLbitfield) {.stdcall.}](load("glPushClientAttrib"))


proc load_GL_VERSION_1_2(load: proc) =
  if not GLAD_GL_VERSION_1_2: return

  glDrawRangeElements = cast[proc (mode: GLenum, start: GLuint, `end`: GLuint, count: GLsizei, `type`: GLenum, indices: pointer) {.stdcall.}](load("glDrawRangeElements"))
  glTexImage3D = cast[proc (target: GLenum, level: GLint, internalformat: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}](load("glTexImage3D"))
  glTexSubImage3D = cast[proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, `type`: GLenum, pixels: pointer) {.stdcall.}](load("glTexSubImage3D"))
  glCopyTexSubImage3D = cast[proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, x: GLint, y: GLint, width: GLsizei, height: GLsizei) {.stdcall.}](load("glCopyTexSubImage3D"))


proc load_GL_VERSION_1_3(load: proc) =
  if not GLAD_GL_VERSION_1_3: return

  glActiveTexture = cast[proc (texture: GLenum) {.stdcall.}](load("glActiveTexture"))
  glSampleCoverage = cast[proc (value: GLfloat, invert: GLboolean) {.stdcall.}](load("glSampleCoverage"))
  glCompressedTexImage3D = cast[proc (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, border: GLint, imageSize: GLsizei, data: pointer) {.stdcall.}](load("glCompressedTexImage3D"))
  glCompressedTexImage2D = cast[proc (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, height: GLsizei, border: GLint, imageSize: GLsizei, data: pointer) {.stdcall.}](load("glCompressedTexImage2D"))
  glCompressedTexImage1D = cast[proc (target: GLenum, level: GLint, internalformat: GLenum, width: GLsizei, border: GLint, imageSize: GLsizei, data: pointer) {.stdcall.}](load("glCompressedTexImage1D"))
  glCompressedTexSubImage3D = cast[proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, zoffset: GLint, width: GLsizei, height: GLsizei, depth: GLsizei, format: GLenum, imageSize: GLsizei, data: pointer) {.stdcall.}](load("glCompressedTexSubImage3D"))
  glCompressedTexSubImage2D = cast[proc (target: GLenum, level: GLint, xoffset: GLint, yoffset: GLint, width: GLsizei, height: GLsizei, format: GLenum, imageSize: GLsizei, data: pointer) {.stdcall.}](load("glCompressedTexSubImage2D"))
  glCompressedTexSubImage1D = cast[proc (target: GLenum, level: GLint, xoffset: GLint, width: GLsizei, format: GLenum, imageSize: GLsizei, data: pointer) {.stdcall.}](load("glCompressedTexSubImage1D"))
  glGetCompressedTexImage = cast[proc (target: GLenum, level: GLint, img: pointer) {.stdcall.}](load("glGetCompressedTexImage"))
  glClientActiveTexture = cast[proc (texture: GLenum) {.stdcall.}](load("glClientActiveTexture"))
  glMultiTexCoord1d = cast[proc (target: GLenum, s: GLdouble) {.stdcall.}](load("glMultiTexCoord1d"))
  glMultiTexCoord1dv = cast[proc (target: GLenum, v: ptr GLdouble) {.stdcall.}](load("glMultiTexCoord1dv"))
  glMultiTexCoord1f = cast[proc (target: GLenum, s: GLfloat) {.stdcall.}](load("glMultiTexCoord1f"))
  glMultiTexCoord1fv = cast[proc (target: GLenum, v: ptr GLfloat) {.stdcall.}](load("glMultiTexCoord1fv"))
  glMultiTexCoord1i = cast[proc (target: GLenum, s: GLint) {.stdcall.}](load("glMultiTexCoord1i"))
  glMultiTexCoord1iv = cast[proc (target: GLenum, v: ptr GLint) {.stdcall.}](load("glMultiTexCoord1iv"))
  glMultiTexCoord1s = cast[proc (target: GLenum, s: GLshort) {.stdcall.}](load("glMultiTexCoord1s"))
  glMultiTexCoord1sv = cast[proc (target: GLenum, v: ptr GLshort) {.stdcall.}](load("glMultiTexCoord1sv"))
  glMultiTexCoord2d = cast[proc (target: GLenum, s: GLdouble, t: GLdouble) {.stdcall.}](load("glMultiTexCoord2d"))
  glMultiTexCoord2dv = cast[proc (target: GLenum, v: ptr GLdouble) {.stdcall.}](load("glMultiTexCoord2dv"))
  glMultiTexCoord2f = cast[proc (target: GLenum, s: GLfloat, t: GLfloat) {.stdcall.}](load("glMultiTexCoord2f"))
  glMultiTexCoord2fv = cast[proc (target: GLenum, v: ptr GLfloat) {.stdcall.}](load("glMultiTexCoord2fv"))
  glMultiTexCoord2i = cast[proc (target: GLenum, s: GLint, t: GLint) {.stdcall.}](load("glMultiTexCoord2i"))
  glMultiTexCoord2iv = cast[proc (target: GLenum, v: ptr GLint) {.stdcall.}](load("glMultiTexCoord2iv"))
  glMultiTexCoord2s = cast[proc (target: GLenum, s: GLshort, t: GLshort) {.stdcall.}](load("glMultiTexCoord2s"))
  glMultiTexCoord2sv = cast[proc (target: GLenum, v: ptr GLshort) {.stdcall.}](load("glMultiTexCoord2sv"))
  glMultiTexCoord3d = cast[proc (target: GLenum, s: GLdouble, t: GLdouble, r: GLdouble) {.stdcall.}](load("glMultiTexCoord3d"))
  glMultiTexCoord3dv = cast[proc (target: GLenum, v: ptr GLdouble) {.stdcall.}](load("glMultiTexCoord3dv"))
  glMultiTexCoord3f = cast[proc (target: GLenum, s: GLfloat, t: GLfloat, r: GLfloat) {.stdcall.}](load("glMultiTexCoord3f"))
  glMultiTexCoord3fv = cast[proc (target: GLenum, v: ptr GLfloat) {.stdcall.}](load("glMultiTexCoord3fv"))
  glMultiTexCoord3i = cast[proc (target: GLenum, s: GLint, t: GLint, r: GLint) {.stdcall.}](load("glMultiTexCoord3i"))
  glMultiTexCoord3iv = cast[proc (target: GLenum, v: ptr GLint) {.stdcall.}](load("glMultiTexCoord3iv"))
  glMultiTexCoord3s = cast[proc (target: GLenum, s: GLshort, t: GLshort, r: GLshort) {.stdcall.}](load("glMultiTexCoord3s"))
  glMultiTexCoord3sv = cast[proc (target: GLenum, v: ptr GLshort) {.stdcall.}](load("glMultiTexCoord3sv"))
  glMultiTexCoord4d = cast[proc (target: GLenum, s: GLdouble, t: GLdouble, r: GLdouble, q: GLdouble) {.stdcall.}](load("glMultiTexCoord4d"))
  glMultiTexCoord4dv = cast[proc (target: GLenum, v: ptr GLdouble) {.stdcall.}](load("glMultiTexCoord4dv"))
  glMultiTexCoord4f = cast[proc (target: GLenum, s: GLfloat, t: GLfloat, r: GLfloat, q: GLfloat) {.stdcall.}](load("glMultiTexCoord4f"))
  glMultiTexCoord4fv = cast[proc (target: GLenum, v: ptr GLfloat) {.stdcall.}](load("glMultiTexCoord4fv"))
  glMultiTexCoord4i = cast[proc (target: GLenum, s: GLint, t: GLint, r: GLint, q: GLint) {.stdcall.}](load("glMultiTexCoord4i"))
  glMultiTexCoord4iv = cast[proc (target: GLenum, v: ptr GLint) {.stdcall.}](load("glMultiTexCoord4iv"))
  glMultiTexCoord4s = cast[proc (target: GLenum, s: GLshort, t: GLshort, r: GLshort, q: GLshort) {.stdcall.}](load("glMultiTexCoord4s"))
  glMultiTexCoord4sv = cast[proc (target: GLenum, v: ptr GLshort) {.stdcall.}](load("glMultiTexCoord4sv"))
  glLoadTransposeMatrixf = cast[proc (m: ptr GLfloat) {.stdcall.}](load("glLoadTransposeMatrixf"))
  glLoadTransposeMatrixd = cast[proc (m: ptr GLdouble) {.stdcall.}](load("glLoadTransposeMatrixd"))
  glMultTransposeMatrixf = cast[proc (m: ptr GLfloat) {.stdcall.}](load("glMultTransposeMatrixf"))
  glMultTransposeMatrixd = cast[proc (m: ptr GLdouble) {.stdcall.}](load("glMultTransposeMatrixd"))


proc load_GL_VERSION_1_4(load: proc) =
  if not GLAD_GL_VERSION_1_4: return

  glBlendFuncSeparate = cast[proc (sfactorRGB: GLenum, dfactorRGB: GLenum, sfactorAlpha: GLenum, dfactorAlpha: GLenum) {.stdcall.}](load("glBlendFuncSeparate"))
  glMultiDrawArrays = cast[proc (mode: GLenum, first: ptr GLint, count: ptr GLsizei, drawcount: GLsizei) {.stdcall.}](load("glMultiDrawArrays"))
  glMultiDrawElements = cast[proc (mode: GLenum, count: ptr GLsizei, `type`: GLenum, indices: ptr pointer, drawcount: GLsizei) {.stdcall.}](load("glMultiDrawElements"))
  glPointParameterf = cast[proc (pname: GLenum, param: GLfloat) {.stdcall.}](load("glPointParameterf"))
  glPointParameterfv = cast[proc (pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glPointParameterfv"))
  glPointParameteri = cast[proc (pname: GLenum, param: GLint) {.stdcall.}](load("glPointParameteri"))
  glPointParameteriv = cast[proc (pname: GLenum, params: ptr GLint) {.stdcall.}](load("glPointParameteriv"))
  glFogCoordf = cast[proc (coord: GLfloat) {.stdcall.}](load("glFogCoordf"))
  glFogCoordfv = cast[proc (coord: ptr GLfloat) {.stdcall.}](load("glFogCoordfv"))
  glFogCoordd = cast[proc (coord: GLdouble) {.stdcall.}](load("glFogCoordd"))
  glFogCoorddv = cast[proc (coord: ptr GLdouble) {.stdcall.}](load("glFogCoorddv"))
  glFogCoordPointer = cast[proc (`type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}](load("glFogCoordPointer"))
  glSecondaryColor3b = cast[proc (red: GLbyte, green: GLbyte, blue: GLbyte) {.stdcall.}](load("glSecondaryColor3b"))
  glSecondaryColor3bv = cast[proc (v: ptr GLbyte) {.stdcall.}](load("glSecondaryColor3bv"))
  glSecondaryColor3d = cast[proc (red: GLdouble, green: GLdouble, blue: GLdouble) {.stdcall.}](load("glSecondaryColor3d"))
  glSecondaryColor3dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glSecondaryColor3dv"))
  glSecondaryColor3f = cast[proc (red: GLfloat, green: GLfloat, blue: GLfloat) {.stdcall.}](load("glSecondaryColor3f"))
  glSecondaryColor3fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glSecondaryColor3fv"))
  glSecondaryColor3i = cast[proc (red: GLint, green: GLint, blue: GLint) {.stdcall.}](load("glSecondaryColor3i"))
  glSecondaryColor3iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glSecondaryColor3iv"))
  glSecondaryColor3s = cast[proc (red: GLshort, green: GLshort, blue: GLshort) {.stdcall.}](load("glSecondaryColor3s"))
  glSecondaryColor3sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glSecondaryColor3sv"))
  glSecondaryColor3ub = cast[proc (red: GLubyte, green: GLubyte, blue: GLubyte) {.stdcall.}](load("glSecondaryColor3ub"))
  glSecondaryColor3ubv = cast[proc (v: ptr GLubyte) {.stdcall.}](load("glSecondaryColor3ubv"))
  glSecondaryColor3ui = cast[proc (red: GLuint, green: GLuint, blue: GLuint) {.stdcall.}](load("glSecondaryColor3ui"))
  glSecondaryColor3uiv = cast[proc (v: ptr GLuint) {.stdcall.}](load("glSecondaryColor3uiv"))
  glSecondaryColor3us = cast[proc (red: GLushort, green: GLushort, blue: GLushort) {.stdcall.}](load("glSecondaryColor3us"))
  glSecondaryColor3usv = cast[proc (v: ptr GLushort) {.stdcall.}](load("glSecondaryColor3usv"))
  glSecondaryColorPointer = cast[proc (size: GLint, `type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}](load("glSecondaryColorPointer"))
  glWindowPos2d = cast[proc (x: GLdouble, y: GLdouble) {.stdcall.}](load("glWindowPos2d"))
  glWindowPos2dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glWindowPos2dv"))
  glWindowPos2f = cast[proc (x: GLfloat, y: GLfloat) {.stdcall.}](load("glWindowPos2f"))
  glWindowPos2fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glWindowPos2fv"))
  glWindowPos2i = cast[proc (x: GLint, y: GLint) {.stdcall.}](load("glWindowPos2i"))
  glWindowPos2iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glWindowPos2iv"))
  glWindowPos2s = cast[proc (x: GLshort, y: GLshort) {.stdcall.}](load("glWindowPos2s"))
  glWindowPos2sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glWindowPos2sv"))
  glWindowPos3d = cast[proc (x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}](load("glWindowPos3d"))
  glWindowPos3dv = cast[proc (v: ptr GLdouble) {.stdcall.}](load("glWindowPos3dv"))
  glWindowPos3f = cast[proc (x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}](load("glWindowPos3f"))
  glWindowPos3fv = cast[proc (v: ptr GLfloat) {.stdcall.}](load("glWindowPos3fv"))
  glWindowPos3i = cast[proc (x: GLint, y: GLint, z: GLint) {.stdcall.}](load("glWindowPos3i"))
  glWindowPos3iv = cast[proc (v: ptr GLint) {.stdcall.}](load("glWindowPos3iv"))
  glWindowPos3s = cast[proc (x: GLshort, y: GLshort, z: GLshort) {.stdcall.}](load("glWindowPos3s"))
  glWindowPos3sv = cast[proc (v: ptr GLshort) {.stdcall.}](load("glWindowPos3sv"))
  glBlendColor = cast[proc (red: GLfloat, green: GLfloat, blue: GLfloat, alpha: GLfloat) {.stdcall.}](load("glBlendColor"))
  glBlendEquation = cast[proc (mode: GLenum) {.stdcall.}](load("glBlendEquation"))


proc load_GL_VERSION_1_5(load: proc) =
  if not GLAD_GL_VERSION_1_5: return

  glGenQueries = cast[proc (n: GLsizei, ids: ptr GLuint) {.stdcall.}](load("glGenQueries"))
  glDeleteQueries = cast[proc (n: GLsizei, ids: ptr GLuint) {.stdcall.}](load("glDeleteQueries"))
  glIsQuery = cast[proc (id: GLuint): GLboolean {.stdcall.}](load("glIsQuery"))
  glBeginQuery = cast[proc (target: GLenum, id: GLuint) {.stdcall.}](load("glBeginQuery"))
  glEndQuery = cast[proc (target: GLenum) {.stdcall.}](load("glEndQuery"))
  glGetQueryiv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetQueryiv"))
  glGetQueryObjectiv = cast[proc (id: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetQueryObjectiv"))
  glGetQueryObjectuiv = cast[proc (id: GLuint, pname: GLenum, params: ptr GLuint) {.stdcall.}](load("glGetQueryObjectuiv"))
  glBindBuffer = cast[proc (target: GLenum, buffer: GLuint) {.stdcall.}](load("glBindBuffer"))
  glDeleteBuffers = cast[proc (n: GLsizei, buffers: ptr GLuint) {.stdcall.}](load("glDeleteBuffers"))
  glGenBuffers = cast[proc (n: GLsizei, buffers: ptr GLuint) {.stdcall.}](load("glGenBuffers"))
  glIsBuffer = cast[proc (buffer: GLuint): GLboolean {.stdcall.}](load("glIsBuffer"))
  glBufferData = cast[proc (target: GLenum, size: GLsizeiptr, data: pointer, usage: GLenum) {.stdcall.}](load("glBufferData"))
  glBufferSubData = cast[proc (target: GLenum, offset: GLintptr, size: GLsizeiptr, data: pointer) {.stdcall.}](load("glBufferSubData"))
  glGetBufferSubData = cast[proc (target: GLenum, offset: GLintptr, size: GLsizeiptr, data: pointer) {.stdcall.}](load("glGetBufferSubData"))
  glMapBuffer = cast[proc (target: GLenum, access: GLenum): pointer {.stdcall.}](load("glMapBuffer"))
  glUnmapBuffer = cast[proc (target: GLenum): GLboolean {.stdcall.}](load("glUnmapBuffer"))
  glGetBufferParameteriv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetBufferParameteriv"))
  glGetBufferPointerv = cast[proc (target: GLenum, pname: GLenum, params: ptr pointer) {.stdcall.}](load("glGetBufferPointerv"))


proc load_GL_VERSION_2_0(load: proc) =
  if not GLAD_GL_VERSION_2_0: return

  glBlendEquationSeparate = cast[proc (modeRGB: GLenum, modeAlpha: GLenum) {.stdcall.}](load("glBlendEquationSeparate"))
  glDrawBuffers = cast[proc (n: GLsizei, bufs: ptr GLenum) {.stdcall.}](load("glDrawBuffers"))
  glStencilOpSeparate = cast[proc (face: GLenum, sfail: GLenum, dpfail: GLenum, dppass: GLenum) {.stdcall.}](load("glStencilOpSeparate"))
  glStencilFuncSeparate = cast[proc (face: GLenum, `func`: GLenum, `ref`: GLint, mask: GLuint) {.stdcall.}](load("glStencilFuncSeparate"))
  glStencilMaskSeparate = cast[proc (face: GLenum, mask: GLuint) {.stdcall.}](load("glStencilMaskSeparate"))
  glAttachShader = cast[proc (program: GLuint, shader: GLuint) {.stdcall.}](load("glAttachShader"))
  glBindAttribLocation = cast[proc (program: GLuint, index: GLuint, name: cstring) {.stdcall.}](load("glBindAttribLocation"))
  glCompileShader = cast[proc (shader: GLuint) {.stdcall.}](load("glCompileShader"))
  glCreateProgram = cast[proc (): GLuint {.stdcall.}](load("glCreateProgram"))
  glCreateShader = cast[proc (`type`: GLenum): GLuint {.stdcall.}](load("glCreateShader"))
  glDeleteProgram = cast[proc (program: GLuint) {.stdcall.}](load("glDeleteProgram"))
  glDeleteShader = cast[proc (shader: GLuint) {.stdcall.}](load("glDeleteShader"))
  glDetachShader = cast[proc (program: GLuint, shader: GLuint) {.stdcall.}](load("glDetachShader"))
  glDisableVertexAttribArray = cast[proc (index: GLuint) {.stdcall.}](load("glDisableVertexAttribArray"))
  glEnableVertexAttribArray = cast[proc (index: GLuint) {.stdcall.}](load("glEnableVertexAttribArray"))
  glGetActiveAttrib = cast[proc (program: GLuint, index: GLuint, bufSize: GLsizei, length: ptr GLsizei, size: ptr GLint, `type`: ptr GLenum, name: cstring) {.stdcall.}](load("glGetActiveAttrib"))
  glGetActiveUniform = cast[proc (program: GLuint, index: GLuint, bufSize: GLsizei, length: ptr GLsizei, size: ptr GLint, `type`: ptr GLenum, name: cstring) {.stdcall.}](load("glGetActiveUniform"))
  glGetAttachedShaders = cast[proc (program: GLuint, maxCount: GLsizei, count: ptr GLsizei, shaders: ptr GLuint) {.stdcall.}](load("glGetAttachedShaders"))
  glGetAttribLocation = cast[proc (program: GLuint, name: cstring): GLint {.stdcall.}](load("glGetAttribLocation"))
  glGetProgramiv = cast[proc (program: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetProgramiv"))
  glGetProgramInfoLog = cast[proc (program: GLuint, bufSize: GLsizei, length: ptr GLsizei, infoLog: cstring) {.stdcall.}](load("glGetProgramInfoLog"))
  glGetShaderiv = cast[proc (shader: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetShaderiv"))
  glGetShaderInfoLog = cast[proc (shader: GLuint, bufSize: GLsizei, length: ptr GLsizei, infoLog: cstring) {.stdcall.}](load("glGetShaderInfoLog"))
  glGetShaderSource = cast[proc (shader: GLuint, bufSize: GLsizei, length: ptr GLsizei, source: cstring) {.stdcall.}](load("glGetShaderSource"))
  glGetUniformLocation = cast[proc (program: GLuint, name: cstring): GLint {.stdcall.}](load("glGetUniformLocation"))
  glGetUniformfv = cast[proc (program: GLuint, location: GLint, params: ptr GLfloat) {.stdcall.}](load("glGetUniformfv"))
  glGetUniformiv = cast[proc (program: GLuint, location: GLint, params: ptr GLint) {.stdcall.}](load("glGetUniformiv"))
  glGetVertexAttribdv = cast[proc (index: GLuint, pname: GLenum, params: ptr GLdouble) {.stdcall.}](load("glGetVertexAttribdv"))
  glGetVertexAttribfv = cast[proc (index: GLuint, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glGetVertexAttribfv"))
  glGetVertexAttribiv = cast[proc (index: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetVertexAttribiv"))
  glGetVertexAttribPointerv = cast[proc (index: GLuint, pname: GLenum, pointer: ptr pointer) {.stdcall.}](load("glGetVertexAttribPointerv"))
  glIsProgram = cast[proc (program: GLuint): GLboolean {.stdcall.}](load("glIsProgram"))
  glIsShader = cast[proc (shader: GLuint): GLboolean {.stdcall.}](load("glIsShader"))
  glLinkProgram = cast[proc (program: GLuint) {.stdcall.}](load("glLinkProgram"))
  glShaderSource = cast[proc (shader: GLuint, count: GLsizei, string: cstringArray, length: ptr GLint) {.stdcall.}](load("glShaderSource"))
  glUseProgram = cast[proc (program: GLuint) {.stdcall.}](load("glUseProgram"))
  glUniform1f = cast[proc (location: GLint, v0: GLfloat) {.stdcall.}](load("glUniform1f"))
  glUniform2f = cast[proc (location: GLint, v0: GLfloat, v1: GLfloat) {.stdcall.}](load("glUniform2f"))
  glUniform3f = cast[proc (location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat) {.stdcall.}](load("glUniform3f"))
  glUniform4f = cast[proc (location: GLint, v0: GLfloat, v1: GLfloat, v2: GLfloat, v3: GLfloat) {.stdcall.}](load("glUniform4f"))
  glUniform1i = cast[proc (location: GLint, v0: GLint) {.stdcall.}](load("glUniform1i"))
  glUniform2i = cast[proc (location: GLint, v0: GLint, v1: GLint) {.stdcall.}](load("glUniform2i"))
  glUniform3i = cast[proc (location: GLint, v0: GLint, v1: GLint, v2: GLint) {.stdcall.}](load("glUniform3i"))
  glUniform4i = cast[proc (location: GLint, v0: GLint, v1: GLint, v2: GLint, v3: GLint) {.stdcall.}](load("glUniform4i"))
  glUniform1fv = cast[proc (location: GLint, count: GLsizei, value: ptr GLfloat) {.stdcall.}](load("glUniform1fv"))
  glUniform2fv = cast[proc (location: GLint, count: GLsizei, value: ptr GLfloat) {.stdcall.}](load("glUniform2fv"))
  glUniform3fv = cast[proc (location: GLint, count: GLsizei, value: ptr GLfloat) {.stdcall.}](load("glUniform3fv"))
  glUniform4fv = cast[proc (location: GLint, count: GLsizei, value: ptr GLfloat) {.stdcall.}](load("glUniform4fv"))
  glUniform1iv = cast[proc (location: GLint, count: GLsizei, value: ptr GLint) {.stdcall.}](load("glUniform1iv"))
  glUniform2iv = cast[proc (location: GLint, count: GLsizei, value: ptr GLint) {.stdcall.}](load("glUniform2iv"))
  glUniform3iv = cast[proc (location: GLint, count: GLsizei, value: ptr GLint) {.stdcall.}](load("glUniform3iv"))
  glUniform4iv = cast[proc (location: GLint, count: GLsizei, value: ptr GLint) {.stdcall.}](load("glUniform4iv"))
  glUniformMatrix2fv = cast[proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}](load("glUniformMatrix2fv"))
  glUniformMatrix3fv = cast[proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}](load("glUniformMatrix3fv"))
  glUniformMatrix4fv = cast[proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}](load("glUniformMatrix4fv"))
  glValidateProgram = cast[proc (program: GLuint) {.stdcall.}](load("glValidateProgram"))
  glVertexAttrib1d = cast[proc (index: GLuint, x: GLdouble) {.stdcall.}](load("glVertexAttrib1d"))
  glVertexAttrib1dv = cast[proc (index: GLuint, v: ptr GLdouble) {.stdcall.}](load("glVertexAttrib1dv"))
  glVertexAttrib1f = cast[proc (index: GLuint, x: GLfloat) {.stdcall.}](load("glVertexAttrib1f"))
  glVertexAttrib1fv = cast[proc (index: GLuint, v: ptr GLfloat) {.stdcall.}](load("glVertexAttrib1fv"))
  glVertexAttrib1s = cast[proc (index: GLuint, x: GLshort) {.stdcall.}](load("glVertexAttrib1s"))
  glVertexAttrib1sv = cast[proc (index: GLuint, v: ptr GLshort) {.stdcall.}](load("glVertexAttrib1sv"))
  glVertexAttrib2d = cast[proc (index: GLuint, x: GLdouble, y: GLdouble) {.stdcall.}](load("glVertexAttrib2d"))
  glVertexAttrib2dv = cast[proc (index: GLuint, v: ptr GLdouble) {.stdcall.}](load("glVertexAttrib2dv"))
  glVertexAttrib2f = cast[proc (index: GLuint, x: GLfloat, y: GLfloat) {.stdcall.}](load("glVertexAttrib2f"))
  glVertexAttrib2fv = cast[proc (index: GLuint, v: ptr GLfloat) {.stdcall.}](load("glVertexAttrib2fv"))
  glVertexAttrib2s = cast[proc (index: GLuint, x: GLshort, y: GLshort) {.stdcall.}](load("glVertexAttrib2s"))
  glVertexAttrib2sv = cast[proc (index: GLuint, v: ptr GLshort) {.stdcall.}](load("glVertexAttrib2sv"))
  glVertexAttrib3d = cast[proc (index: GLuint, x: GLdouble, y: GLdouble, z: GLdouble) {.stdcall.}](load("glVertexAttrib3d"))
  glVertexAttrib3dv = cast[proc (index: GLuint, v: ptr GLdouble) {.stdcall.}](load("glVertexAttrib3dv"))
  glVertexAttrib3f = cast[proc (index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat) {.stdcall.}](load("glVertexAttrib3f"))
  glVertexAttrib3fv = cast[proc (index: GLuint, v: ptr GLfloat) {.stdcall.}](load("glVertexAttrib3fv"))
  glVertexAttrib3s = cast[proc (index: GLuint, x: GLshort, y: GLshort, z: GLshort) {.stdcall.}](load("glVertexAttrib3s"))
  glVertexAttrib3sv = cast[proc (index: GLuint, v: ptr GLshort) {.stdcall.}](load("glVertexAttrib3sv"))
  glVertexAttrib4Nbv = cast[proc (index: GLuint, v: ptr GLbyte) {.stdcall.}](load("glVertexAttrib4Nbv"))
  glVertexAttrib4Niv = cast[proc (index: GLuint, v: ptr GLint) {.stdcall.}](load("glVertexAttrib4Niv"))
  glVertexAttrib4Nsv = cast[proc (index: GLuint, v: ptr GLshort) {.stdcall.}](load("glVertexAttrib4Nsv"))
  glVertexAttrib4Nub = cast[proc (index: GLuint, x: GLubyte, y: GLubyte, z: GLubyte, w: GLubyte) {.stdcall.}](load("glVertexAttrib4Nub"))
  glVertexAttrib4Nubv = cast[proc (index: GLuint, v: ptr GLubyte) {.stdcall.}](load("glVertexAttrib4Nubv"))
  glVertexAttrib4Nuiv = cast[proc (index: GLuint, v: ptr GLuint) {.stdcall.}](load("glVertexAttrib4Nuiv"))
  glVertexAttrib4Nusv = cast[proc (index: GLuint, v: ptr GLushort) {.stdcall.}](load("glVertexAttrib4Nusv"))
  glVertexAttrib4bv = cast[proc (index: GLuint, v: ptr GLbyte) {.stdcall.}](load("glVertexAttrib4bv"))
  glVertexAttrib4d = cast[proc (index: GLuint, x: GLdouble, y: GLdouble, z: GLdouble, w: GLdouble) {.stdcall.}](load("glVertexAttrib4d"))
  glVertexAttrib4dv = cast[proc (index: GLuint, v: ptr GLdouble) {.stdcall.}](load("glVertexAttrib4dv"))
  glVertexAttrib4f = cast[proc (index: GLuint, x: GLfloat, y: GLfloat, z: GLfloat, w: GLfloat) {.stdcall.}](load("glVertexAttrib4f"))
  glVertexAttrib4fv = cast[proc (index: GLuint, v: ptr GLfloat) {.stdcall.}](load("glVertexAttrib4fv"))
  glVertexAttrib4iv = cast[proc (index: GLuint, v: ptr GLint) {.stdcall.}](load("glVertexAttrib4iv"))
  glVertexAttrib4s = cast[proc (index: GLuint, x: GLshort, y: GLshort, z: GLshort, w: GLshort) {.stdcall.}](load("glVertexAttrib4s"))
  glVertexAttrib4sv = cast[proc (index: GLuint, v: ptr GLshort) {.stdcall.}](load("glVertexAttrib4sv"))
  glVertexAttrib4ubv = cast[proc (index: GLuint, v: ptr GLubyte) {.stdcall.}](load("glVertexAttrib4ubv"))
  glVertexAttrib4uiv = cast[proc (index: GLuint, v: ptr GLuint) {.stdcall.}](load("glVertexAttrib4uiv"))
  glVertexAttrib4usv = cast[proc (index: GLuint, v: ptr GLushort) {.stdcall.}](load("glVertexAttrib4usv"))
  glVertexAttribPointer = cast[proc (index: GLuint, size: GLint, `type`: GLenum, normalized: GLboolean, stride: GLsizei, pointer: pointer) {.stdcall.}](load("glVertexAttribPointer"))


proc load_GL_VERSION_2_1(load: proc) =
  if not GLAD_GL_VERSION_2_1: return

  glUniformMatrix2x3fv = cast[proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}](load("glUniformMatrix2x3fv"))
  glUniformMatrix3x2fv = cast[proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}](load("glUniformMatrix3x2fv"))
  glUniformMatrix2x4fv = cast[proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}](load("glUniformMatrix2x4fv"))
  glUniformMatrix4x2fv = cast[proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}](load("glUniformMatrix4x2fv"))
  glUniformMatrix3x4fv = cast[proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}](load("glUniformMatrix3x4fv"))
  glUniformMatrix4x3fv = cast[proc (location: GLint, count: GLsizei, transpose: GLboolean, value: ptr GLfloat) {.stdcall.}](load("glUniformMatrix4x3fv"))


proc load_GL_VERSION_3_0(load: proc) =
  if not GLAD_GL_VERSION_3_0: return

  glColorMaski = cast[proc (index: GLuint, r: GLboolean, g: GLboolean, b: GLboolean, a: GLboolean) {.stdcall.}](load("glColorMaski"))
  glGetBooleani_v = cast[proc (target: GLenum, index: GLuint, data: ptr GLboolean) {.stdcall.}](load("glGetBooleani_v"))
  glGetIntegeri_v = cast[proc (target: GLenum, index: GLuint, data: ptr GLint) {.stdcall.}](load("glGetIntegeri_v"))
  glEnablei = cast[proc (target: GLenum, index: GLuint) {.stdcall.}](load("glEnablei"))
  glDisablei = cast[proc (target: GLenum, index: GLuint) {.stdcall.}](load("glDisablei"))
  glIsEnabledi = cast[proc (target: GLenum, index: GLuint): GLboolean {.stdcall.}](load("glIsEnabledi"))
  glBeginTransformFeedback = cast[proc (primitiveMode: GLenum) {.stdcall.}](load("glBeginTransformFeedback"))
  glEndTransformFeedback = cast[proc () {.stdcall.}](load("glEndTransformFeedback"))
  glBindBufferRange = cast[proc (target: GLenum, index: GLuint, buffer: GLuint, offset: GLintptr, size: GLsizeiptr) {.stdcall.}](load("glBindBufferRange"))
  glBindBufferBase = cast[proc (target: GLenum, index: GLuint, buffer: GLuint) {.stdcall.}](load("glBindBufferBase"))
  glTransformFeedbackVaryings = cast[proc (program: GLuint, count: GLsizei, varyings: cstringArray, bufferMode: GLenum) {.stdcall.}](load("glTransformFeedbackVaryings"))
  glGetTransformFeedbackVarying = cast[proc (program: GLuint, index: GLuint, bufSize: GLsizei, length: ptr GLsizei, size: ptr GLsizei, `type`: ptr GLenum, name: cstring) {.stdcall.}](load("glGetTransformFeedbackVarying"))
  glClampColor = cast[proc (target: GLenum, clamp: GLenum) {.stdcall.}](load("glClampColor"))
  glBeginConditionalRender = cast[proc (id: GLuint, mode: GLenum) {.stdcall.}](load("glBeginConditionalRender"))
  glEndConditionalRender = cast[proc () {.stdcall.}](load("glEndConditionalRender"))
  glVertexAttribIPointer = cast[proc (index: GLuint, size: GLint, `type`: GLenum, stride: GLsizei, pointer: pointer) {.stdcall.}](load("glVertexAttribIPointer"))
  glGetVertexAttribIiv = cast[proc (index: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetVertexAttribIiv"))
  glGetVertexAttribIuiv = cast[proc (index: GLuint, pname: GLenum, params: ptr GLuint) {.stdcall.}](load("glGetVertexAttribIuiv"))
  glVertexAttribI1i = cast[proc (index: GLuint, x: GLint) {.stdcall.}](load("glVertexAttribI1i"))
  glVertexAttribI2i = cast[proc (index: GLuint, x: GLint, y: GLint) {.stdcall.}](load("glVertexAttribI2i"))
  glVertexAttribI3i = cast[proc (index: GLuint, x: GLint, y: GLint, z: GLint) {.stdcall.}](load("glVertexAttribI3i"))
  glVertexAttribI4i = cast[proc (index: GLuint, x: GLint, y: GLint, z: GLint, w: GLint) {.stdcall.}](load("glVertexAttribI4i"))
  glVertexAttribI1ui = cast[proc (index: GLuint, x: GLuint) {.stdcall.}](load("glVertexAttribI1ui"))
  glVertexAttribI2ui = cast[proc (index: GLuint, x: GLuint, y: GLuint) {.stdcall.}](load("glVertexAttribI2ui"))
  glVertexAttribI3ui = cast[proc (index: GLuint, x: GLuint, y: GLuint, z: GLuint) {.stdcall.}](load("glVertexAttribI3ui"))
  glVertexAttribI4ui = cast[proc (index: GLuint, x: GLuint, y: GLuint, z: GLuint, w: GLuint) {.stdcall.}](load("glVertexAttribI4ui"))
  glVertexAttribI1iv = cast[proc (index: GLuint, v: ptr GLint) {.stdcall.}](load("glVertexAttribI1iv"))
  glVertexAttribI2iv = cast[proc (index: GLuint, v: ptr GLint) {.stdcall.}](load("glVertexAttribI2iv"))
  glVertexAttribI3iv = cast[proc (index: GLuint, v: ptr GLint) {.stdcall.}](load("glVertexAttribI3iv"))
  glVertexAttribI4iv = cast[proc (index: GLuint, v: ptr GLint) {.stdcall.}](load("glVertexAttribI4iv"))
  glVertexAttribI1uiv = cast[proc (index: GLuint, v: ptr GLuint) {.stdcall.}](load("glVertexAttribI1uiv"))
  glVertexAttribI2uiv = cast[proc (index: GLuint, v: ptr GLuint) {.stdcall.}](load("glVertexAttribI2uiv"))
  glVertexAttribI3uiv = cast[proc (index: GLuint, v: ptr GLuint) {.stdcall.}](load("glVertexAttribI3uiv"))
  glVertexAttribI4uiv = cast[proc (index: GLuint, v: ptr GLuint) {.stdcall.}](load("glVertexAttribI4uiv"))
  glVertexAttribI4bv = cast[proc (index: GLuint, v: ptr GLbyte) {.stdcall.}](load("glVertexAttribI4bv"))
  glVertexAttribI4sv = cast[proc (index: GLuint, v: ptr GLshort) {.stdcall.}](load("glVertexAttribI4sv"))
  glVertexAttribI4ubv = cast[proc (index: GLuint, v: ptr GLubyte) {.stdcall.}](load("glVertexAttribI4ubv"))
  glVertexAttribI4usv = cast[proc (index: GLuint, v: ptr GLushort) {.stdcall.}](load("glVertexAttribI4usv"))
  glGetUniformuiv = cast[proc (program: GLuint, location: GLint, params: ptr GLuint) {.stdcall.}](load("glGetUniformuiv"))
  glBindFragDataLocation = cast[proc (program: GLuint, color: GLuint, name: cstring) {.stdcall.}](load("glBindFragDataLocation"))
  glGetFragDataLocation = cast[proc (program: GLuint, name: cstring): GLint {.stdcall.}](load("glGetFragDataLocation"))
  glUniform1ui = cast[proc (location: GLint, v0: GLuint) {.stdcall.}](load("glUniform1ui"))
  glUniform2ui = cast[proc (location: GLint, v0: GLuint, v1: GLuint) {.stdcall.}](load("glUniform2ui"))
  glUniform3ui = cast[proc (location: GLint, v0: GLuint, v1: GLuint, v2: GLuint) {.stdcall.}](load("glUniform3ui"))
  glUniform4ui = cast[proc (location: GLint, v0: GLuint, v1: GLuint, v2: GLuint, v3: GLuint) {.stdcall.}](load("glUniform4ui"))
  glUniform1uiv = cast[proc (location: GLint, count: GLsizei, value: ptr GLuint) {.stdcall.}](load("glUniform1uiv"))
  glUniform2uiv = cast[proc (location: GLint, count: GLsizei, value: ptr GLuint) {.stdcall.}](load("glUniform2uiv"))
  glUniform3uiv = cast[proc (location: GLint, count: GLsizei, value: ptr GLuint) {.stdcall.}](load("glUniform3uiv"))
  glUniform4uiv = cast[proc (location: GLint, count: GLsizei, value: ptr GLuint) {.stdcall.}](load("glUniform4uiv"))
  glTexParameterIiv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glTexParameterIiv"))
  glTexParameterIuiv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLuint) {.stdcall.}](load("glTexParameterIuiv"))
  glGetTexParameterIiv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetTexParameterIiv"))
  glGetTexParameterIuiv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLuint) {.stdcall.}](load("glGetTexParameterIuiv"))
  glClearBufferiv = cast[proc (buffer: GLenum, drawbuffer: GLint, value: ptr GLint) {.stdcall.}](load("glClearBufferiv"))
  glClearBufferuiv = cast[proc (buffer: GLenum, drawbuffer: GLint, value: ptr GLuint) {.stdcall.}](load("glClearBufferuiv"))
  glClearBufferfv = cast[proc (buffer: GLenum, drawbuffer: GLint, value: ptr GLfloat) {.stdcall.}](load("glClearBufferfv"))
  glClearBufferfi = cast[proc (buffer: GLenum, drawbuffer: GLint, depth: GLfloat, stencil: GLint) {.stdcall.}](load("glClearBufferfi"))
  glGetStringi = cast[proc (name: GLenum, index: GLuint): ptr GLubyte {.stdcall.}](load("glGetStringi"))
  glIsRenderbuffer = cast[proc (renderbuffer: GLuint): GLboolean {.stdcall.}](load("glIsRenderbuffer"))
  glBindRenderbuffer = cast[proc (target: GLenum, renderbuffer: GLuint) {.stdcall.}](load("glBindRenderbuffer"))
  glDeleteRenderbuffers = cast[proc (n: GLsizei, renderbuffers: ptr GLuint) {.stdcall.}](load("glDeleteRenderbuffers"))
  glGenRenderbuffers = cast[proc (n: GLsizei, renderbuffers: ptr GLuint) {.stdcall.}](load("glGenRenderbuffers"))
  glRenderbufferStorage = cast[proc (target: GLenum, internalformat: GLenum, width: GLsizei, height: GLsizei) {.stdcall.}](load("glRenderbufferStorage"))
  glGetRenderbufferParameteriv = cast[proc (target: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetRenderbufferParameteriv"))
  glIsFramebuffer = cast[proc (framebuffer: GLuint): GLboolean {.stdcall.}](load("glIsFramebuffer"))
  glBindFramebuffer = cast[proc (target: GLenum, framebuffer: GLuint) {.stdcall.}](load("glBindFramebuffer"))
  glDeleteFramebuffers = cast[proc (n: GLsizei, framebuffers: ptr GLuint) {.stdcall.}](load("glDeleteFramebuffers"))
  glGenFramebuffers = cast[proc (n: GLsizei, framebuffers: ptr GLuint) {.stdcall.}](load("glGenFramebuffers"))
  glCheckFramebufferStatus = cast[proc (target: GLenum): GLenum {.stdcall.}](load("glCheckFramebufferStatus"))
  glFramebufferTexture1D = cast[proc (target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLuint, level: GLint) {.stdcall.}](load("glFramebufferTexture1D"))
  glFramebufferTexture2D = cast[proc (target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLuint, level: GLint) {.stdcall.}](load("glFramebufferTexture2D"))
  glFramebufferTexture3D = cast[proc (target: GLenum, attachment: GLenum, textarget: GLenum, texture: GLuint, level: GLint, zoffset: GLint) {.stdcall.}](load("glFramebufferTexture3D"))
  glFramebufferRenderbuffer = cast[proc (target: GLenum, attachment: GLenum, renderbuffertarget: GLenum, renderbuffer: GLuint) {.stdcall.}](load("glFramebufferRenderbuffer"))
  glGetFramebufferAttachmentParameteriv = cast[proc (target: GLenum, attachment: GLenum, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetFramebufferAttachmentParameteriv"))
  glGenerateMipmap = cast[proc (target: GLenum) {.stdcall.}](load("glGenerateMipmap"))
  glBlitFramebuffer = cast[proc (srcX0: GLint, srcY0: GLint, srcX1: GLint, srcY1: GLint, dstX0: GLint, dstY0: GLint, dstX1: GLint, dstY1: GLint, mask: GLbitfield, filter: GLenum) {.stdcall.}](load("glBlitFramebuffer"))
  glRenderbufferStorageMultisample = cast[proc (target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) {.stdcall.}](load("glRenderbufferStorageMultisample"))
  glFramebufferTextureLayer = cast[proc (target: GLenum, attachment: GLenum, texture: GLuint, level: GLint, layer: GLint) {.stdcall.}](load("glFramebufferTextureLayer"))
  glMapBufferRange = cast[proc (target: GLenum, offset: GLintptr, length: GLsizeiptr, access: GLbitfield): pointer {.stdcall.}](load("glMapBufferRange"))
  glFlushMappedBufferRange = cast[proc (target: GLenum, offset: GLintptr, length: GLsizeiptr) {.stdcall.}](load("glFlushMappedBufferRange"))
  glBindVertexArray = cast[proc (array: GLuint) {.stdcall.}](load("glBindVertexArray"))
  glDeleteVertexArrays = cast[proc (n: GLsizei, arrays: ptr GLuint) {.stdcall.}](load("glDeleteVertexArrays"))
  glGenVertexArrays = cast[proc (n: GLsizei, arrays: ptr GLuint) {.stdcall.}](load("glGenVertexArrays"))
  glIsVertexArray = cast[proc (array: GLuint): GLboolean {.stdcall.}](load("glIsVertexArray"))


proc load_GL_VERSION_3_1(load: proc) =
  if not GLAD_GL_VERSION_3_1: return

  glDrawArraysInstanced = cast[proc (mode: GLenum, first: GLint, count: GLsizei, instancecount: GLsizei) {.stdcall.}](load("glDrawArraysInstanced"))
  glDrawElementsInstanced = cast[proc (mode: GLenum, count: GLsizei, `type`: GLenum, indices: pointer, instancecount: GLsizei) {.stdcall.}](load("glDrawElementsInstanced"))
  glTexBuffer = cast[proc (target: GLenum, internalformat: GLenum, buffer: GLuint) {.stdcall.}](load("glTexBuffer"))
  glPrimitiveRestartIndex = cast[proc (index: GLuint) {.stdcall.}](load("glPrimitiveRestartIndex"))
  glCopyBufferSubData = cast[proc (readTarget: GLenum, writeTarget: GLenum, readOffset: GLintptr, writeOffset: GLintptr, size: GLsizeiptr) {.stdcall.}](load("glCopyBufferSubData"))
  glGetUniformIndices = cast[proc (program: GLuint, uniformCount: GLsizei, uniformNames: cstringArray, uniformIndices: ptr GLuint) {.stdcall.}](load("glGetUniformIndices"))
  glGetActiveUniformsiv = cast[proc (program: GLuint, uniformCount: GLsizei, uniformIndices: ptr GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetActiveUniformsiv"))
  glGetActiveUniformName = cast[proc (program: GLuint, uniformIndex: GLuint, bufSize: GLsizei, length: ptr GLsizei, uniformName: cstring) {.stdcall.}](load("glGetActiveUniformName"))
  glGetUniformBlockIndex = cast[proc (program: GLuint, uniformBlockName: cstring): GLuint {.stdcall.}](load("glGetUniformBlockIndex"))
  glGetActiveUniformBlockiv = cast[proc (program: GLuint, uniformBlockIndex: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetActiveUniformBlockiv"))
  glGetActiveUniformBlockName = cast[proc (program: GLuint, uniformBlockIndex: GLuint, bufSize: GLsizei, length: ptr GLsizei, uniformBlockName: cstring) {.stdcall.}](load("glGetActiveUniformBlockName"))
  glUniformBlockBinding = cast[proc (program: GLuint, uniformBlockIndex: GLuint, uniformBlockBinding: GLuint) {.stdcall.}](load("glUniformBlockBinding"))
  glBindBufferRange = cast[proc (target: GLenum, index: GLuint, buffer: GLuint, offset: GLintptr, size: GLsizeiptr) {.stdcall.}](load("glBindBufferRange"))
  glBindBufferBase = cast[proc (target: GLenum, index: GLuint, buffer: GLuint) {.stdcall.}](load("glBindBufferBase"))
  glGetIntegeri_v = cast[proc (target: GLenum, index: GLuint, data: ptr GLint) {.stdcall.}](load("glGetIntegeri_v"))


proc load_GL_VERSION_3_2(load: proc) =
  if not GLAD_GL_VERSION_3_2: return

  glDrawElementsBaseVertex = cast[proc (mode: GLenum, count: GLsizei, `type`: GLenum, indices: pointer, basevertex: GLint) {.stdcall.}](load("glDrawElementsBaseVertex"))
  glDrawRangeElementsBaseVertex = cast[proc (mode: GLenum, start: GLuint, `end`: GLuint, count: GLsizei, `type`: GLenum, indices: pointer, basevertex: GLint) {.stdcall.}](load("glDrawRangeElementsBaseVertex"))
  glDrawElementsInstancedBaseVertex = cast[proc (mode: GLenum, count: GLsizei, `type`: GLenum, indices: pointer, instancecount: GLsizei, basevertex: GLint) {.stdcall.}](load("glDrawElementsInstancedBaseVertex"))
  glMultiDrawElementsBaseVertex = cast[proc (mode: GLenum, count: ptr GLsizei, `type`: GLenum, indices: ptr pointer, drawcount: GLsizei, basevertex: ptr GLint) {.stdcall.}](load("glMultiDrawElementsBaseVertex"))
  glProvokingVertex = cast[proc (mode: GLenum) {.stdcall.}](load("glProvokingVertex"))
  glFenceSync = cast[proc (condition: GLenum, flags: GLbitfield): GLsync {.stdcall.}](load("glFenceSync"))
  glIsSync = cast[proc (sync: GLsync): GLboolean {.stdcall.}](load("glIsSync"))
  glDeleteSync = cast[proc (sync: GLsync) {.stdcall.}](load("glDeleteSync"))
  glClientWaitSync = cast[proc (sync: GLsync, flags: GLbitfield, timeout: GLuint64): GLenum {.stdcall.}](load("glClientWaitSync"))
  glWaitSync = cast[proc (sync: GLsync, flags: GLbitfield, timeout: GLuint64) {.stdcall.}](load("glWaitSync"))
  glGetInteger64v = cast[proc (pname: GLenum, data: ptr GLint64) {.stdcall.}](load("glGetInteger64v"))
  glGetSynciv = cast[proc (sync: GLsync, pname: GLenum, count: GLsizei, length: ptr GLsizei, values: ptr GLint) {.stdcall.}](load("glGetSynciv"))
  glGetInteger64i_v = cast[proc (target: GLenum, index: GLuint, data: ptr GLint64) {.stdcall.}](load("glGetInteger64i_v"))
  glGetBufferParameteri64v = cast[proc (target: GLenum, pname: GLenum, params: ptr GLint64) {.stdcall.}](load("glGetBufferParameteri64v"))
  glFramebufferTexture = cast[proc (target: GLenum, attachment: GLenum, texture: GLuint, level: GLint) {.stdcall.}](load("glFramebufferTexture"))
  glTexImage2DMultisample = cast[proc (target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, fixedsamplelocations: GLboolean) {.stdcall.}](load("glTexImage2DMultisample"))
  glTexImage3DMultisample = cast[proc (target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei, depth: GLsizei, fixedsamplelocations: GLboolean) {.stdcall.}](load("glTexImage3DMultisample"))
  glGetMultisamplefv = cast[proc (pname: GLenum, index: GLuint, val: ptr GLfloat) {.stdcall.}](load("glGetMultisamplefv"))
  glSampleMaski = cast[proc (maskNumber: GLuint, mask: GLbitfield) {.stdcall.}](load("glSampleMaski"))


proc load_GL_VERSION_3_3(load: proc) =
  if not GLAD_GL_VERSION_3_3: return

  glBindFragDataLocationIndexed = cast[proc (program: GLuint, colorNumber: GLuint, index: GLuint, name: cstring) {.stdcall.}](load("glBindFragDataLocationIndexed"))
  glGetFragDataIndex = cast[proc (program: GLuint, name: cstring): GLint {.stdcall.}](load("glGetFragDataIndex"))
  glGenSamplers = cast[proc (count: GLsizei, samplers: ptr GLuint) {.stdcall.}](load("glGenSamplers"))
  glDeleteSamplers = cast[proc (count: GLsizei, samplers: ptr GLuint) {.stdcall.}](load("glDeleteSamplers"))
  glIsSampler = cast[proc (sampler: GLuint): GLboolean {.stdcall.}](load("glIsSampler"))
  glBindSampler = cast[proc (unit: GLuint, sampler: GLuint) {.stdcall.}](load("glBindSampler"))
  glSamplerParameteri = cast[proc (sampler: GLuint, pname: GLenum, param: GLint) {.stdcall.}](load("glSamplerParameteri"))
  glSamplerParameteriv = cast[proc (sampler: GLuint, pname: GLenum, param: ptr GLint) {.stdcall.}](load("glSamplerParameteriv"))
  glSamplerParameterf = cast[proc (sampler: GLuint, pname: GLenum, param: GLfloat) {.stdcall.}](load("glSamplerParameterf"))
  glSamplerParameterfv = cast[proc (sampler: GLuint, pname: GLenum, param: ptr GLfloat) {.stdcall.}](load("glSamplerParameterfv"))
  glSamplerParameterIiv = cast[proc (sampler: GLuint, pname: GLenum, param: ptr GLint) {.stdcall.}](load("glSamplerParameterIiv"))
  glSamplerParameterIuiv = cast[proc (sampler: GLuint, pname: GLenum, param: ptr GLuint) {.stdcall.}](load("glSamplerParameterIuiv"))
  glGetSamplerParameteriv = cast[proc (sampler: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetSamplerParameteriv"))
  glGetSamplerParameterIiv = cast[proc (sampler: GLuint, pname: GLenum, params: ptr GLint) {.stdcall.}](load("glGetSamplerParameterIiv"))
  glGetSamplerParameterfv = cast[proc (sampler: GLuint, pname: GLenum, params: ptr GLfloat) {.stdcall.}](load("glGetSamplerParameterfv"))
  glGetSamplerParameterIuiv = cast[proc (sampler: GLuint, pname: GLenum, params: ptr GLuint) {.stdcall.}](load("glGetSamplerParameterIuiv"))
  glQueryCounter = cast[proc (id: GLuint, target: GLenum) {.stdcall.}](load("glQueryCounter"))
  glGetQueryObjecti64v = cast[proc (id: GLuint, pname: GLenum, params: ptr GLint64) {.stdcall.}](load("glGetQueryObjecti64v"))
  glGetQueryObjectui64v = cast[proc (id: GLuint, pname: GLenum, params: ptr GLuint64) {.stdcall.}](load("glGetQueryObjectui64v"))
  glVertexAttribDivisor = cast[proc (index: GLuint, divisor: GLuint) {.stdcall.}](load("glVertexAttribDivisor"))
  glVertexAttribP1ui = cast[proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: GLuint) {.stdcall.}](load("glVertexAttribP1ui"))
  glVertexAttribP1uiv = cast[proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: ptr GLuint) {.stdcall.}](load("glVertexAttribP1uiv"))
  glVertexAttribP2ui = cast[proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: GLuint) {.stdcall.}](load("glVertexAttribP2ui"))
  glVertexAttribP2uiv = cast[proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: ptr GLuint) {.stdcall.}](load("glVertexAttribP2uiv"))
  glVertexAttribP3ui = cast[proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: GLuint) {.stdcall.}](load("glVertexAttribP3ui"))
  glVertexAttribP3uiv = cast[proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: ptr GLuint) {.stdcall.}](load("glVertexAttribP3uiv"))
  glVertexAttribP4ui = cast[proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: GLuint) {.stdcall.}](load("glVertexAttribP4ui"))
  glVertexAttribP4uiv = cast[proc (index: GLuint, `type`: GLenum, normalized: GLboolean, value: ptr GLuint) {.stdcall.}](load("glVertexAttribP4uiv"))
  glVertexP2ui = cast[proc (`type`: GLenum, value: GLuint) {.stdcall.}](load("glVertexP2ui"))
  glVertexP2uiv = cast[proc (`type`: GLenum, value: ptr GLuint) {.stdcall.}](load("glVertexP2uiv"))
  glVertexP3ui = cast[proc (`type`: GLenum, value: GLuint) {.stdcall.}](load("glVertexP3ui"))
  glVertexP3uiv = cast[proc (`type`: GLenum, value: ptr GLuint) {.stdcall.}](load("glVertexP3uiv"))
  glVertexP4ui = cast[proc (`type`: GLenum, value: GLuint) {.stdcall.}](load("glVertexP4ui"))
  glVertexP4uiv = cast[proc (`type`: GLenum, value: ptr GLuint) {.stdcall.}](load("glVertexP4uiv"))
  glTexCoordP1ui = cast[proc (`type`: GLenum, coords: GLuint) {.stdcall.}](load("glTexCoordP1ui"))
  glTexCoordP1uiv = cast[proc (`type`: GLenum, coords: ptr GLuint) {.stdcall.}](load("glTexCoordP1uiv"))
  glTexCoordP2ui = cast[proc (`type`: GLenum, coords: GLuint) {.stdcall.}](load("glTexCoordP2ui"))
  glTexCoordP2uiv = cast[proc (`type`: GLenum, coords: ptr GLuint) {.stdcall.}](load("glTexCoordP2uiv"))
  glTexCoordP3ui = cast[proc (`type`: GLenum, coords: GLuint) {.stdcall.}](load("glTexCoordP3ui"))
  glTexCoordP3uiv = cast[proc (`type`: GLenum, coords: ptr GLuint) {.stdcall.}](load("glTexCoordP3uiv"))
  glTexCoordP4ui = cast[proc (`type`: GLenum, coords: GLuint) {.stdcall.}](load("glTexCoordP4ui"))
  glTexCoordP4uiv = cast[proc (`type`: GLenum, coords: ptr GLuint) {.stdcall.}](load("glTexCoordP4uiv"))
  glMultiTexCoordP1ui = cast[proc (texture: GLenum, `type`: GLenum, coords: GLuint) {.stdcall.}](load("glMultiTexCoordP1ui"))
  glMultiTexCoordP1uiv = cast[proc (texture: GLenum, `type`: GLenum, coords: ptr GLuint) {.stdcall.}](load("glMultiTexCoordP1uiv"))
  glMultiTexCoordP2ui = cast[proc (texture: GLenum, `type`: GLenum, coords: GLuint) {.stdcall.}](load("glMultiTexCoordP2ui"))
  glMultiTexCoordP2uiv = cast[proc (texture: GLenum, `type`: GLenum, coords: ptr GLuint) {.stdcall.}](load("glMultiTexCoordP2uiv"))
  glMultiTexCoordP3ui = cast[proc (texture: GLenum, `type`: GLenum, coords: GLuint) {.stdcall.}](load("glMultiTexCoordP3ui"))
  glMultiTexCoordP3uiv = cast[proc (texture: GLenum, `type`: GLenum, coords: ptr GLuint) {.stdcall.}](load("glMultiTexCoordP3uiv"))
  glMultiTexCoordP4ui = cast[proc (texture: GLenum, `type`: GLenum, coords: GLuint) {.stdcall.}](load("glMultiTexCoordP4ui"))
  glMultiTexCoordP4uiv = cast[proc (texture: GLenum, `type`: GLenum, coords: ptr GLuint) {.stdcall.}](load("glMultiTexCoordP4uiv"))
  glNormalP3ui = cast[proc (`type`: GLenum, coords: GLuint) {.stdcall.}](load("glNormalP3ui"))
  glNormalP3uiv = cast[proc (`type`: GLenum, coords: ptr GLuint) {.stdcall.}](load("glNormalP3uiv"))
  glColorP3ui = cast[proc (`type`: GLenum, color: GLuint) {.stdcall.}](load("glColorP3ui"))
  glColorP3uiv = cast[proc (`type`: GLenum, color: ptr GLuint) {.stdcall.}](load("glColorP3uiv"))
  glColorP4ui = cast[proc (`type`: GLenum, color: GLuint) {.stdcall.}](load("glColorP4ui"))
  glColorP4uiv = cast[proc (`type`: GLenum, color: ptr GLuint) {.stdcall.}](load("glColorP4uiv"))
  glSecondaryColorP3ui = cast[proc (`type`: GLenum, color: GLuint) {.stdcall.}](load("glSecondaryColorP3ui"))
  glSecondaryColorP3uiv = cast[proc (`type`: GLenum, color: ptr GLuint) {.stdcall.}](load("glSecondaryColorP3uiv"))


proc load_GL_ARB_multisample(load: proc) =
  if not GLAD_GL_ARB_multisample: return
  glSampleCoverageARB = cast[proc (value: GLfloat, invert: GLboolean) {.stdcall.}](load("glSampleCoverageARB"))


proc load_GL_EXT_framebuffer_multisample(load: proc) =
  if not GLAD_GL_EXT_framebuffer_multisample: return
  glRenderbufferStorageMultisampleEXT = cast[proc (target: GLenum, samples: GLsizei, internalformat: GLenum, width: GLsizei, height: GLsizei) {.stdcall.}](load("glRenderbufferStorageMultisampleEXT"))


proc findExtensionsGL() =
  GLAD_GL_ARB_multisample = hasExt("GL_ARB_multisample")
  GLAD_GL_EXT_framebuffer_multisample = hasExt("GL_EXT_framebuffer_multisample")
  GLAD_GL_EXT_texture_filter_anisotropic = hasExt("GL_EXT_texture_filter_anisotropic")
  discard


proc findCoreGL(glVersion: string) =
  # Thank you @elmindreda
  # https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176
  # https://github.com/glfw/glfw/blob/master/src/context.c#L36
  var prefixes = ["OpenGL ES-CM ", "OpenGL ES-CL ", "OpenGL ES "]

  var version = glVersion
  for p in prefixes:
    if version.startsWith(p):
      version = version.replace(p)
      break

  var major = ord(glVersion[0]) - ord('0')
  var minor = ord(glVersion[2]) - ord('0')

  glVersionMajor = major
  glVersionMinor = minor

  GLAD_GL_VERSION_1_0 = (major == 1 and minor >= 0) or major > 1
  GLAD_GL_VERSION_1_1 = (major == 1 and minor >= 1) or major > 1
  GLAD_GL_VERSION_1_2 = (major == 1 and minor >= 2) or major > 1
  GLAD_GL_VERSION_1_3 = (major == 1 and minor >= 3) or major > 1
  GLAD_GL_VERSION_1_4 = (major == 1 and minor >= 4) or major > 1
  GLAD_GL_VERSION_1_5 = (major == 1 and minor >= 5) or major > 1
  GLAD_GL_VERSION_2_0 = (major == 2 and minor >= 0) or major > 2
  GLAD_GL_VERSION_2_1 = (major == 2 and minor >= 1) or major > 2
  GLAD_GL_VERSION_3_0 = (major == 3 and minor >= 0) or major > 3
  GLAD_GL_VERSION_3_1 = (major == 3 and minor >= 1) or major > 3
  GLAD_GL_VERSION_3_2 = (major == 3 and minor >= 2) or major > 3
  GLAD_GL_VERSION_3_3 = (major == 3 and minor >= 3) or major > 3


proc gladLoadGL*(load: proc): bool =
  glGetString = cast[proc (name: GLenum): ptr GLubyte {.stdcall.}](load("glGetString"))
  if glGetString == nil: return false

  var glVersion = cast[cstring](glGetString(GL_VERSION))
  if glVersion == nil: return false

  findCoreGL($glVersion)

  load_GL_VERSION_1_0(load)
  load_GL_VERSION_1_1(load)
  load_GL_VERSION_1_2(load)
  load_GL_VERSION_1_3(load)
  load_GL_VERSION_1_4(load)
  load_GL_VERSION_1_5(load)
  load_GL_VERSION_2_0(load)
  load_GL_VERSION_2_1(load)
  load_GL_VERSION_3_0(load)
  load_GL_VERSION_3_1(load)
  load_GL_VERSION_3_2(load)
  load_GL_VERSION_3_3(load)

  findExtensionsGL()

  load_GL_ARB_multisample(load);
  load_GL_EXT_framebuffer_multisample(load);

  return glVersionMajor != 0 or glVersionMinor != 0

