text: /************************************************************************************
  
  Filename    :   CAPI_GLE.h
  Content     :   OpenGL extensions support. Implements a stripped down glew-like
                  interface with some additional functionality.
  Copyright   :   Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
  
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
  
  http://www.apache.org/licenses/LICENSE-2.0
  
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
  
  ************************************************************************************/
  
  // This file provides functionality similar to a reduced version of GLEW, plus some
  // additional functionality that's useful to us, such as function hooking.
  
  #ifndef OVR_CAPI_GLE_h
  #define OVR_CAPI_GLE_h
  
  #include "Kernel/OVR_Types.h"
  #include "CAPI_GLE_GL.h"
  
  ///////////////////////////////////////////////////////////////////////////////
  // How to use this functionality
  //
  // - You #include this header instead of gl.h, glext.h, wglext.h (Windows), gl3.h (Apple), gl3ext.h
  // (Apple), glx.h (Unix), and glxext.h (Unix).
  //   Currently you still would #include <Windows.h> for the base wgl functions on Windows and
  //   OpenGL.h or NSOpenGL for the base Apple cgl functions.
  //
  // - You call OpenGL functions just like you would if you were directly using OpenGL
  //   headers and declarations. The difference is that this module automatically loads
  //   extensions on init and so you should never need to use GetProcAddress, wglGetProcAddress, etc.
  //
  // - OpenGL 1.1 functions can be called unilaterally without checking if they are present,
  //   as it's assumed they are always present.
  //
  // - In order to use an OpenGL 1.2 or later function you can check the GLEContext::WholeVersion
  //   variable to tell what version of OpenGL is present and active. Example usage:
  //       if(GLEContext::GetCurrentContext()->WholeVersion >= 302) // If OpenGL 3.2 or later...
  //
  // - In order to use an OpenGL extension, you can check the GLE_ helper macro that exists for each
  //   extension. For example, in order to check of the KHR_debug is present you could do this:
  //        if(GLE_KHR_debug) ...
  //   You cannot check for the presence of extensions by testing the function pointer, because
  //   when hooking is enabled then we aren't using function pointers and thus all functions will
  //   look like they are present.
  //
  // - You can test if the OpenGL implementation is OpenGL ES by checking the GLEContext IsGLES
  //   member variable. For example: if(GLEContext::GetCurrentContext()->IsGLES) ...
  //
  // - You can test if the OpenGL implementation is a core profile ES by checking the GLEContext
  // IsCoreProfile
  //   member variable. For example: if(GLEContext::GetCurrentContext()->IsCoreProfile) ...
  //
  ///////////////////////////////////////////////////////////////////////////////
  
  ///////////////////////////////////////////////////////////////////////////////
  // How to add support for additional functions to this module.
  //
  // For an example of how to do this, search the source files for all cases of KHR_Debug and just
  // copy the things that it does but for your new extension.
  //
  //     1) Add the appropriate extension declaration to CAPI_GLE_GL.h, preferably by
  //        copying it from the standard header file it normally comes from. If it's
  //        platform-specific (e.g. a Windows wgl function) then make sure it's declared
  //        within the given platform section. Note that there are potentially #defines, typedefs,
  //        function typedefs, and function #defines. There is always a GLE_ macro declared which
  //        lets the user know at runtime whether the extension is present.
  //        Note that entries are alphabetically sorted in these files.
  //        e.g.  #ifndef GL_KHR_debug
  //                  #define GL_KHR_debug 1
  //                  #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 etc.
  //                  typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) ();
  //                  #define glPopDebugGroup GLEGetCurrentFunction(glPopDebugGroup)
  //                  #define GLE_KHR_debug GLEGetCurrentVariable(gl_KHR_debug)
  //              #endif etc.
  //
  //     2) Add a hook function for in the hook section of the GLEContext class in this header,
  //        ideally in the same order it's declared in the CAPI_GLE_GL.h so it's easily readable.
  //        e.g. void glDebugMessageControl_Hook(GLenum source, GLenum type, GLenum severity, GLsizei
  //        count, const GLuint* ids, GLboolean enabled); etc.
  //
  //     3) Add a declaration for each interface function to the GLEContext class in this header.
  //        e.g. PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback_Impl; etc.
  //
  //     4) Add code to GLEContext::InitExtensionLoad to load the function pointer.
  //        e.g. GLELoadProc(glDebugMessageCallback_Impl, glDebugMessageCallback); etc.
  //
  //     5) Add code to GLEContext::InitExtensionSupport to detect the extension support.
  //        On Mac, core profile functions aren't identified as extensions and so in addition
  //        to detecting them you need to unilaterally set them as available when using 3.2+
  //        by adding them to the section at the bottom of InitExtensionSupport.
  //        e.g. { gl_KHR_debug, "GL_KHR_debug" }, etc.
  //
  //     6) Implement the GLEContext hook function(s) you declared.
  //        e.g.  void OVR::GLEContext::glDebugMessageControl_Hook(GLenum source, GLenum type, GLenum
  //        severity, GLsizei count, const GLuint* ids, GLboolean enabled)
  //              {
  //                 if(glDebugMessageControl_Impl)
  //                    glDebugMessageControl_Impl(source, type, severity, count, ids, enabled);
  //                 PostHook();
  //              }
  //
  // In order to test this, build with GLE_HOOKING_ENABLED defined and not defined.
  //
  // Note that if the extension is a WGL-, GLX-, or CGL-specific extension, they are handled like
  // above but are in their own section below the section for regular OpenGL extensions.
  //
  // In some cases the given interface may already be present by currently commented out,
  // in which case you can simply un-comment it to enable it.
  ///////////////////////////////////////////////////////////////////////////////
  
  namespace OVR {
  // Generic OpenGL GetProcAddress function interface. Maps to platform-specific functionality
  // internally. On Windows this is equivalent to wglGetProcAddress as opposed to global
  // GetProcAddress.
  void* GLEGetProcAddress(const char* name);
  
  // GLEContext
  //
  // Manages a collection of OpenGL extension interfaces.
  // If the application has multiple OpenGL unrelated contexts then you will want to create a
  // different instance of this class for each one you intend to use it with.
  //
  // Example usage:
  //     GLEContext gGLEContext;
  //
  //     GLEContext::SetCurrentContext(&gGLEContext);
  //     gGLEContext.PlatformInit(); // Initializes WGL/GLX/etc. platform-specific OpenGL
  //     functionality
  //
  //     if(GLE_WGL_ARB_create_context) // If wglCreateContextAttribsARB is available...
  //     {
  //         int attribList[] = { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 2,
  //         WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB, None }; HGLRC h =
  //         wglCreateContextAttribsARB(hDC, 0, attribList);
  //         [...]
  //     }
  //
  //     gGLEContext.Init(); // Must be called after an OpenGL context has been created.
  //
  //     if(GLE_WHOLE_VERSION() >= 302) // If OpenGL 3.2 or later
  //     {
  //         glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, someTexture, 0); // This is an
  //         OpenGL 3.2 function.
  //         [...]
  //     }
  //
  //     if(GLE_GL_ARB_texture_multisample) // If the GL_ARB_texture_multisample extension is
  //     available...
  //     {
  //         glEnable(GL_SAMPLE_MASK);
  //         glSampleMaski(0, 0x1);
  //         [...]
  //     }
  //
  //     [...]
  //
  //     gGLEContext.Shutdown();
  //
  GLE_CLASS_EXPORT class GLEContext {
   public:
    GLEContext();
    ~GLEContext();
  
    // Initializes platform-specific functionality (e.g. Windows WGL, Unix GLX, Android EGL, Apple
    // CGL). You would typically call this before creating an OpenGL context and using
    // platform-specific functions.
    void PlatformInit();
    bool IsPlatformInitialized() const;
  
    // Loads all the extensions from the current OpenGL context. This must be called after an OpenGL
    // context has been created and made current.
    void Init();
    bool IsInitialized() const;
  
    // Clears all the extensions initialized by PlatformInit and Init.
    void Shutdown();
  
    void SetEnableHookGetError(bool enabled) {
      EnableHookGetError = enabled;
    }
  
    // Returns the default instance of this class.
    static GLEContext* GetCurrentContext();
  
    // Sets the default instance of this class. This should be called after enabling a new OpenGL
    // context. This sets the current GLEContext; it does not set the underlying OpenGL context
    // itself.
    static void SetCurrentContext(GLEContext*);
  
   public:
    // OpenGL version information
    int MajorVersion; // OpenGL major version
    int MinorVersion; // OpenGL minor version
    int WholeVersion; // Equals ((MajorVersion * 100) + MinorVersion). Example usage:
    // if(glv.WholeVersion >= 302) // If OpenGL v3.02+ ...
    bool IsGLES; // Open GL ES?
    bool IsCoreProfile; // Is the current OpenGL context a core profile context? Its trueness may be a
    // false positive but will never be a false negative.
    bool EnableHookGetError; // If enabled then hook functions call glGetError after making the call.
  
    int PlatformMajorVersion; // GLX/WGL/EGL/CGL version. Not the same as OpenGL version.
    int PlatformMinorVersion;
    int PlatformWholeVersion;
  
    void InitVersion(); // Initializes the version information (e.g. MajorVersion). Called by the
    // public Init function.
    void InitExtensionLoad(); // Loads the function addresses into the function pointers.
    void InitExtensionSupport(); // Loads the boolean extension support booleans.
  
    void InitPlatformVersion();
    void InitPlatformExtensionLoad();
    void InitPlatformExtensionSupport();
  
   public:
  // GL_VERSION_1_1
  // Not normally included because all OpenGL 1.1 functionality is always present. But if we have
  // hooking enabled then we implement our own version of each function.
  #if defined(GLE_HOOKING_ENABLED)
    // void PreHook(const char* functionName);             // Called at the beginning of a hook
    // function.
    void PostHook(const char* functionName); // Called at the end of a hook function.
  
    void glAccum_Hook(GLenum op, GLfloat value);
    void glAlphaFunc_Hook(GLenum func, GLclampf ref);
    GLboolean glAreTexturesResident_Hook(GLsizei n, const GLuint* textures, GLboolean* residences);
    void glArrayElement_Hook(GLint i);
    void glBegin_Hook(GLenum mode);
    void glBindTexture_Hook(GLenum target, GLuint texture);
    void glBitmap_Hook(
        GLsizei width,
        GLsizei height,
        GLfloat xorig,
        GLfloat yorig,
        GLfloat xmove,
        GLfloat ymove,
        const GLubyte* bitmap);
    void glBlendFunc_Hook(GLenum sfactor, GLenum dfactor);
    void glCallList_Hook(GLuint list);
    void glCallLists_Hook(GLsizei n, GLenum type, const void* lists);
    void glClear_Hook(GLbitfield mask);
    void glClearAccum_Hook(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
    void glClearColor_Hook(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
    void glClearDepth_Hook(GLclampd depth);
    void glClearIndex_Hook(GLfloat c);
    void glClearStencil_Hook(GLint s);
    void glClipPlane_Hook(GLenum plane, const GLdouble* equation);
    void glColor3b_Hook(GLbyte red, GLbyte green, GLbyte blue);
    void glColor3bv_Hook(const GLbyte* v);
    void glColor3d_Hook(GLdouble red, GLdouble green, GLdouble blue);
    void glColor3dv_Hook(const GLdouble* v);
    void glColor3f_Hook(GLfloat red, GLfloat green, GLfloat blue);
    void glColor3fv_Hook(const GLfloat* v);
    void glColor3i_Hook(GLint red, GLint green, GLint blue);
    void glColor3iv_Hook(const GLint* v);
    void glColor3s_Hook(GLshort red, GLshort green, GLshort blue);
    void glColor3sv_Hook(const GLshort* v);
    void glColor3ub_Hook(GLubyte red, GLubyte green, GLubyte blue);
    void glColor3ubv_Hook(const GLubyte* v);
    void glColor3ui_Hook(GLuint red, GLuint green, GLuint blue);
    void glColor3uiv_Hook(const GLuint* v);
    void glColor3us_Hook(GLushort red, GLushort green, GLushort blue);
    void glColor3usv_Hook(const GLushort* v);
    void glColor4b_Hook(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
    void glColor4bv_Hook(const GLbyte* v);
    void glColor4d_Hook(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
    void glColor4dv_Hook(const GLdouble* v);
    void glColor4f_Hook(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
    void glColor4fv_Hook(const GLfloat* v);
    void glColor4i_Hook(GLint red, GLint green, GLint blue, GLint alpha);
    void glColor4iv_Hook(const GLint* v);
    void glColor4s_Hook(GLshort red, GLshort green, GLshort blue, GLshort alpha);
    void glColor4sv_Hook(const GLshort* v);
    void glColor4ub_Hook(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
    void glColor4ubv_Hook(const GLubyte* v);
    void glColor4ui_Hook(GLuint red, GLuint green, GLuint blue, GLuint alpha);
    void glColor4uiv_Hook(const GLuint* v);
    void glColor4us_Hook(GLushort red, GLushort green, GLushort blue, GLushort alpha);
    void glColor4usv_Hook(const GLushort* v);
    void glColorMask_Hook(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
    void glColorMaterial_Hook(GLenum face, GLenum mode);
    void glColorPointer_Hook(GLint size, GLenum type, GLsizei stride, const void* pointer);
    void glCopyPixels_Hook(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
    void glCopyTexImage1D_Hook(
        GLenum target,
        GLint level,
        GLenum internalFormat,
        GLint x,
        GLint y,
        GLsizei width,
        GLint border);
    void glCopyTexImage2D_Hook(
        GLenum target,
        GLint level,
        GLenum internalFormat,
        GLint x,
        GLint y,
        GLsizei width,
        GLsizei height,
        GLint border);
    void glCopyTexSubImage1D_Hook(
        GLenum target,
        GLint level,
        GLint xoffset,
        GLint x,
        GLint y,
        GLsizei width);
    void glCopyTexSubImage2D_Hook(
        GLenum target,
        GLint level,
        GLint xoffset,
        GLint yoffset,
        GLint x,
        GLint y,
        GLsizei width,
        GLsizei height);
    void glCullFace_Hook(GLenum mode);
    void glDeleteLists_Hook(GLuint list, GLsizei range);
    void glDeleteTextures_Hook(GLsizei n, const GLuint* textures);
    void glDepthFunc_Hook(GLenum func);
    void glDepthMask_Hook(GLboolean flag);
    void glDepthRange_Hook(GLclampd zNear, GLclampd zFar);
    void glDisable_Hook(GLenum cap);
    void glDisableClientState_Hook(GLenum array);
    void glDrawArrays_Hook(GLenum mode, GLint first, GLsizei count);
    void glDrawBuffer_Hook(GLenum mode);
    void glDrawElements_Hook(GLenum mode, GLsizei count, GLenum type, const void* indices);
    void
    glDrawPixels_Hook(GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
    void glEdgeFlag_Hook(GLboolean flag);
    void glEdgeFlagPointer_Hook(GLsizei stride, const void* pointer);
    void glEdgeFlagv_Hook(const GLboolean* flag);
    void glEnable_Hook(GLenum cap);
    void glEnableClientState_Hook(GLenum array);
    void glEnd_Hook(void);
    void glEndList_Hook(void);
    void glEvalCoord1d_Hook(GLdouble u);
    void glEvalCoord1dv_Hook(const GLdouble* u);
    void glEvalCoord1f_Hook(GLfloat u);
    void glEvalCoord1fv_Hook(const GLfloat* u);
    void glEvalCoord2d_Hook(GLdouble u, GLdouble v);
    void glEvalCoord2dv_Hook(const GLdouble* u);
    void glEvalCoord2f_Hook(GLfloat u, GLfloat v);
    void glEvalCoord2fv_Hook(const GLfloat* u);
    void glEvalMesh1_Hook(GLenum mode, GLint i1, GLint i2);
    void glEvalMesh2_Hook(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
    void glEvalPoint1_Hook(GLint i);
    void glEvalPoint2_Hook(GLint i, GLint j);
    void glFeedbackBuffer_Hook(GLsizei size, GLenum type, GLfloat* buffer);
    void glFinish_Hook(void);
    void glFlush_Hook(void);
    void glFogf_Hook(GLenum pname, GLfloat param);
    void glFogfv_Hook(GLenum pname, const GLfloat* params);
    void glFogi_Hook(GLenum pname, GLint param);
    void glFogiv_Hook(GLenum pname, const GLint* params);
    void glFrontFace_Hook(GLenum mode);
    void glFrustum_Hook(
        GLdouble left,
        GLdouble right,
        GLdouble bottom,
        GLdouble top,
        GLdouble zNear,
        GLdouble zFar);
    GLuint glGenLists_Hook(GLsizei range);
    void glGenTextures_Hook(GLsizei n, GLuint* textures);
    void glGetBooleanv_Hook(GLenum pname, GLboolean* params);
    void glGetClipPlane_Hook(GLenum plane, GLdouble* equation);
    void glGetDoublev_Hook(GLenum pname, GLdouble* params);
    GLenum glGetError_Hook(void);
    void glGetFloatv_Hook(GLenum pname, GLfloat* params);
    void glGetIntegerv_Hook(GLenum pname, GLint* params);
    void glGetLightfv_Hook(GLenum light, GLenum pname, GLfloat* params);
    void glGetLightiv_Hook(GLenum light, GLenum pname, GLint* params);
    void glGetMapdv_Hook(GLenum target, GLenum query, GLdouble* v);
    void glGetMapfv_Hook(GLenum target, GLenum query, GLfloat* v);
    void glGetMapiv_Hook(GLenum target, GLenum query, GLint* v);
    void glGetMaterialfv_Hook(GLenum face, GLenum pname, GLfloat* params);
    void glGetMaterialiv_Hook(GLenum face, GLenum pname, GLint* params);
    void glGetPixelMapfv_Hook(GLenum map, GLfloat* values);
    void glGetPixelMapuiv_Hook(GLenum map, GLuint* values);
    void glGetPixelMapusv_Hook(GLenum map, GLushort* values);
    void glGetPointerv_Hook(GLenum pname, void** params);
    void glGetPolygonStipple_Hook(GLubyte* mask);
    const GLubyte* glGetString_Hook(GLenum name);
    void glGetTexEnvfv_Hook(GLenum target, GLenum pname, GLfloat* params);
    void glGetTexEnviv_Hook(GLenum target, GLenum pname, GLint* params);
    void glGetTexGendv_Hook(GLenum coord, GLenum pname, GLdouble* params);
    void glGetTexGenfv_Hook(GLenum coord, GLenum pname, GLfloat* params);
    void glGetTexGeniv_Hook(GLenum coord, GLenum pname, GLint* params);
    void glGetTexImage_Hook(GLenum target, GLint level, GLenum format, GLenum type, void* pixels);
    void glGetTexLevelParameterfv_Hook(GLenum target, GLint level, GLenum pname, GLfloat* params);
    void glGetTexLevelParameteriv_Hook(GLenum target, GLint level, GLenum pname, GLint* params);
    void glGetTexParameterfv_Hook(GLenum target, GLenum pname, GLfloat* params);
    void glGetTexParameteriv_Hook(GLenum target, GLenum pname, GLint* params);
    void glHint_Hook(GLenum target, GLenum mode);
    void glIndexMask_Hook(GLuint mask);
    void glIndexPointer_Hook(GLenum type, GLsizei stride, const void* pointer);
    void glIndexd_Hook(GLdouble c);
    void glIndexdv_Hook(const GLdouble* c);
    void glIndexf_Hook(GLfloat c);
    void glIndexfv_Hook(const GLfloat* c);
    void glIndexi_Hook(GLint c);
    void glIndexiv_Hook(const GLint* c);
    void glIndexs_Hook(GLshort c);
    void glIndexsv_Hook(const GLshort* c);
    void glIndexub_Hook(GLubyte c);
    void glIndexubv_Hook(const GLubyte* c);
    void glInitNames_Hook(void);
    void glInterleavedArrays_Hook(GLenum format, GLsizei stride, const void* pointer);
    GLboolean glIsEnabled_Hook(GLenum cap);
    GLboolean glIsList_Hook(GLuint list);
    GLboolean glIsTexture_Hook(GLuint texture);
    void glLightModelf_Hook(GLenum pname, GLfloat param);
    void glLightModelfv_Hook(GLenum pname, const GLfloat* params);
    void glLightModeli_Hook(GLenum pname, GLint param);
    void glLightModeliv_Hook(GLenum pname, const GLint* params);
    void glLightf_Hook(GLenum light, GLenum pname, GLfloat param);
    void glLightfv_Hook(GLenum light, GLenum pname, const GLfloat* params);
    void glLighti_Hook(GLenum light, GLenum pname, GLint param);
    void glLightiv_Hook(GLenum light, GLenum pname, const GLint* params);
    void glLineStipple_Hook(GLint factor, GLushort pattern);
    void glLineWidth_Hook(GLfloat width);
    void glListBase_Hook(GLuint base);
    void glLoadIdentity_Hook(void);
    void glLoadMatrixd_Hook(const GLdouble* m);
    void glLoadMatrixf_Hook(const GLfloat* m);
    void glLoadName_Hook(GLuint name);
    void glLogicOp_Hook(GLenum opcode);
    void glMap1d_Hook(
        GLenum target,
        GLdouble u1,
        GLdouble u2,
        GLint stride,
        GLint order,
        const GLdouble* points);
    void glMap1f_Hook(
        GLenum target,
        GLfloat u1,
        GLfloat u2,
        GLint stride,
        GLint order,
        const GLfloat* points);
    void glMap2d_Hook(
        GLenum target,
        GLdouble u1,
        GLdouble u2,
        GLint ustride,
        GLint uorder,
        GLdouble v1,
        GLdouble v2,
        GLint vstride,
        GLint vorder,
        const GLdouble* points);
    void glMap2f_Hook(
        GLenum target,
        GLfloat u1,
        GLfloat u2,
        GLint ustride,
        GLint uorder,
        GLfloat v1,
        GLfloat v2,
        GLint vstride,
        GLint vorder,
        const GLfloat* points);
    void glMapGrid1d_Hook(GLint un, GLdouble u1, GLdouble u2);
    void glMapGrid1f_Hook(GLint un, GLfloat u1, GLfloat u2);
    void glMapGrid2d_Hook(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
    void glMapGrid2f_Hook(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
    void glMaterialf_Hook(GLenum face, GLenum pname, GLfloat param);
    void glMaterialfv_Hook(GLenum face, GLenum pname, const GLfloat* params);
    void glMateriali_Hook(GLenum face, GLenum pname, GLint param);
    void glMaterialiv_Hook(GLenum face, GLenum pname, const GLint* params);
    void glMatrixMode_Hook(GLenum mode);
    void glMultMatrixd_Hook(const GLdouble* m);
    void glMultMatrixf_Hook(const GLfloat* m);
    void glNewList_Hook(GLuint list, GLenum mode);
    void glNormal3b_Hook(GLbyte nx, GLbyte ny, GLbyte nz);
    void glNormal3bv_Hook(const GLbyte* v);
    void glNormal3d_Hook(GLdouble nx, GLdouble ny, GLdouble nz);
    void glNormal3dv_Hook(const GLdouble* v);
    void glNormal3f_Hook(GLfloat nx, GLfloat ny, GLfloat nz);
    void glNormal3fv_Hook(const GLfloat* v);
    void glNormal3i_Hook(GLint nx, GLint ny, GLint nz);
    void glNormal3iv_Hook(const GLint* v);
    void glNormal3s_Hook(GLshort nx, GLshort ny, GLshort nz);
    void glNormal3sv_Hook(const GLshort* v);
    void glNormalPointer_Hook(GLenum type, GLsizei stride, const void* pointer);
    void glOrtho_Hook(
        GLdouble left,
        GLdouble right,
        GLdouble bottom,
        GLdouble top,
        GLdouble zNear,
        GLdouble zFar);
    void glPassThrough_Hook(GLfloat token);
    void glPixelMapfv_Hook(GLenum map, GLsizei mapsize, const GLfloat* values);
    void glPixelMapuiv_Hook(GLenum map, GLsizei mapsize, const GLuint* values);
    void glPixelMapusv_Hook(GLenum map, GLsizei mapsize, const GLushort* values);
    void glPixelStoref_Hook(GLenum pname, GLfloat param);
    void glPixelStorei_Hook(GLenum pname, GLint param);
    void glPixelTransferf_Hook(GLenum pname, GLfloat param);
    void glPixelTransferi_Hook(GLenum pname, GLint param);
    void glPixelZoom_Hook(GLfloat xfactor, GLfloat yfactor);
    void glPointSize_Hook(GLfloat size);
    void glPolygonMode_Hook(GLenum face, GLenum mode);
    void glPolygonOffset_Hook(GLfloat factor, GLfloat units);
    void glPolygonStipple_Hook(const GLubyte* mask);
    void glPopAttrib_Hook(void);
    void glPopClientAttrib_Hook(void);
    void glPopMatrix_Hook(void);
    void glPopName_Hook(void);
    void glPrioritizeTextures_Hook(GLsizei n, const GLuint* textures, const GLclampf* priorities);
    void glPushAttrib_Hook(GLbitfield mask);
    void glPushClientAttrib_Hook(GLbitfield mask);
    void glPushMatrix_Hook(void);
    void glPushName_Hook(GLuint name);
    void glRasterPos2d_Hook(GLdouble x, GLdouble y);
    void glRasterPos2dv_Hook(const GLdouble* v);
    void glRasterPos2f_Hook(GLfloat x, GLfloat y);
    void glRasterPos2fv_Hook(const GLfloat* v);
    void glRasterPos2i_Hook(GLint x, GLint y);
    void glRasterPos2iv_Hook(const GLint* v);
    void glRasterPos2s_Hook(GLshort x, GLshort y);
    void glRasterPos2sv_Hook(const GLshort* v);
    void glRasterPos3d_Hook(GLdouble x, GLdouble y, GLdouble z);
    void glRasterPos3dv_Hook(const GLdouble* v);
    void glRasterPos3f_Hook(GLfloat x, GLfloat y, GLfloat z);
    void glRasterPos3fv_Hook(const GLfloat* v);
    void glRasterPos3i_Hook(GLint x, GLint y, GLint z);
    void glRasterPos3iv_Hook(const GLint* v);
    void glRasterPos3s_Hook(GLshort x, GLshort y, GLshort z);
    void glRasterPos3sv_Hook(const GLshort* v);
    void glRasterPos4d_Hook(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
    void glRasterPos4dv_Hook(const GLdouble* v);
    void glRasterPos4f_Hook(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
    void glRasterPos4fv_Hook(const GLfloat* v);
    void glRasterPos4i_Hook(GLint x, GLint y, GLint z, GLint w);
    void glRasterPos4iv_Hook(const GLint* v);
    void glRasterPos4s_Hook(GLshort x, GLshort y, GLshort z, GLshort w);
    void glRasterPos4sv_Hook(const GLshort* v);
    void glReadBuffer_Hook(GLenum mode);
    void glReadPixels_Hook(
        GLint x,
        GLint y,
        GLsizei width,
        GLsizei height,
        GLenum format,
        GLenum type,
        void* pixels);
    void glRectd_Hook(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
    void glRectdv_Hook(const GLdouble* v1, const GLdouble* v2);
    void glRectf_Hook(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
    void glRectfv_Hook(const GLfloat* v1, const GLfloat* v2);
    void glRecti_Hook(GLint x1, GLint y1, GLint x2, GLint y2);
    void glRectiv_Hook(const GLint* v1, const GLint* v2);
    void glRects_Hook(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
    void glRectsv_Hook(const GLshort* v1, const GLshort* v2);
    GLint glRenderMode_Hook(GLenum mode);
    void glRotated_Hook(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
    void glRotatef_Hook(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
    void glScaled_Hook(GLdouble x, GLdouble y, GLdouble z);
    void glScalef_Hook(GLfloat x, GLfloat y, GLfloat z);
    void glScissor_Hook(GLint x, GLint y, GLsizei width, GLsizei height);
    void glSelectBuffer_Hook(GLsizei size, GLuint* buffer);
    void glShadeModel_Hook(GLenum mode);
    void glStencilFunc_Hook(GLenum func, GLint ref, GLuint mask);
    void glStencilMask_Hook(GLuint mask);
    void glStencilOp_Hook(GLenum fail, GLenum zfail, GLenum zpass);
    void glTexCoord1d_Hook(GLdouble s);
    void glTexCoord1dv_Hook(const GLdouble* v);
    void glTexCoord1f_Hook(GLfloat s);
    void glTexCoord1fv_Hook(const GLfloat* v);
    void glTexCoord1i_Hook(GLint s);
    void glTexCoord1iv_Hook(const GLint* v);
    void glTexCoord1s_Hook(GLshort s);
    void glTexCoord1sv_Hook(const GLshort* v);
    void glTexCoord2d_Hook(GLdouble s, GLdouble t);
    void glTexCoord2dv_Hook(const GLdouble* v);
    void glTexCoord2f_Hook(GLfloat s, GLfloat t);
    void glTexCoord2fv_Hook(const GLfloat* v);
    void glTexCoord2i_Hook(GLint s, GLint t);
    void glTexCoord2iv_Hook(const GLint* v);
    void glTexCoord2s_Hook(GLshort s, GLshort t);
    void glTexCoord2sv_Hook(const GLshort* v);
    void glTexCoord3d_Hook(GLdouble s, GLdouble t, GLdouble r);
    void glTexCoord3dv_Hook(const GLdouble* v);
    void glTexCoord3f_Hook(GLfloat s, GLfloat t, GLfloat r);
    void glTexCoord3fv_Hook(const GLfloat* v);
    void glTexCoord3i_Hook(GLint s, GLint t, GLint r);
    void glTexCoord3iv_Hook(const GLint* v);
    void glTexCoord3s_Hook(GLshort s, GLshort t, GLshort r);
    void glTexCoord3sv_Hook(const GLshort* v);
    void glTexCoord4d_Hook(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
    void glTexCoord4dv_Hook(const GLdouble* v);
    void glTexCoord4f_Hook(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
    void glTexCoord4fv_Hook(const GLfloat* v);
    void glTexCoord4i_Hook(GLint s, GLint t, GLint r, GLint q);
    void glTexCoord4iv_Hook(const GLint* v);
    void glTexCoord4s_Hook(GLshort s, GLshort t, GLshort r, GLshort q);
    void glTexCoord4sv_Hook(const GLshort* v);
    void glTexCoordPointer_Hook(GLint size, GLenum type, GLsizei stride, const void* pointer);
    void glTexEnvf_Hook(GLenum target, GLenum pname, GLfloat param);
    void glTexEnvfv_Hook(GLenum target, GLenum pname, const GLfloat* params);
    void glTexEnvi_Hook(GLenum target, GLenum pname, GLint param);
    void glTexEnviv_Hook(GLenum target, GLenum pname, const GLint* params);
    void glTexGend_Hook(GLenum coord, GLenum pname, GLdouble param);
    void glTexGendv_Hook(GLenum coord, GLenum pname, const GLdouble* params);
    void glTexGenf_Hook(GLenum coord, GLenum pname, GLfloat param);
    void glTexGenfv_Hook(GLenum coord, GLenum pname, const GLfloat* params);
    void glTexGeni_Hook(GLenum coord, GLenum pname, GLint param);
    void glTexGeniv_Hook(GLenum coord, GLenum pname, const GLint* params);
    void glTexImage1D_Hook(
        GLenum target,
        GLint level,
        GLint internalformat,
        GLsizei width,
        GLint border,
        GLenum format,
        GLenum type,
        const void* pixels);
    void glTexImage2D_Hook(
        GLenum target,
        GLint level,
        GLint internalformat,
        GLsizei width,
        GLsizei height,
        GLint border,
        GLenum format,
        GLenum type,
        const void* pixels);
    void glTexParameterf_Hook(GLenum target, GLenum pname, GLfloat param);
    void glTexParameterfv_Hook(GLenum target, GLenum pname, const GLfloat* params);
    void glTexParameteri_Hook(GLenum target, GLenum pname, GLint param);
    void glTexParameteriv_Hook(GLenum target, GLenum pname, const GLint* params);
    void glTexSubImage1D_Hook(
        GLenum target,
        GLint level,
        GLint xoffset,
        GLsizei width,
        GLenum format,
        GLenum type,
        const void* pixels);
    void glTexSubImage2D_Hook(
        GLenum target,
        GLint level,
        GLint xoffset,
        GLint yoffset,
        GLsizei width,
        GLsizei height,
        GLenum format,
        GLenum type,
        const void* pixels);
    void glTranslated_Hook(GLdouble x, GLdouble y, GLdouble z);
    void glTranslatef_Hook(GLfloat x, GLfloat y, GLfloat z);
    void glVertex2d_Hook(GLdouble x, GLdouble y);
    void glVertex2dv_Hook(const GLdouble* v);
    void glVertex2f_Hook(GLfloat x, GLfloat y);
    void glVertex2fv_Hook(const GLfloat* v);
    void glVertex2i_Hook(GLint x, GLint y);
    void glVertex2iv_Hook(const GLint* v);
    void glVertex2s_Hook(GLshort x, GLshort y);
    void glVertex2sv_Hook(const GLshort* v);
    void glVertex3d_Hook(GLdouble x, GLdouble y, GLdouble z);
    void glVertex3dv_Hook(const GLdouble* v);
    void glVertex3f_Hook(GLfloat x, GLfloat y, GLfloat z);
    void glVertex3fv_Hook(const GLfloat* v);
    void glVertex3i_Hook(GLint x, GLint y, GLint z);
    void glVertex3iv_Hook(const GLint* v);
    void glVertex3s_Hook(GLshort x, GLshort y, GLshort z);
    void glVertex3sv_Hook(const GLshort* v);
    void glVertex4d_Hook(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
    void glVertex4dv_Hook(const GLdouble* v);
    void glVertex4f_Hook(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
    void glVertex4fv_Hook(const GLfloat* v);
    void glVertex4i_Hook(GLint x, GLint y, GLint z, GLint w);
    void glVertex4iv_Hook(const GLint* v);
    void glVertex4s_Hook(GLshort x, GLshort y, GLshort z, GLshort w);
    void glVertex4sv_Hook(const GLshort* v);
    void glVertexPointer_Hook(GLint size, GLenum type, GLsizei stride, const void* pointer);
    void glViewport_Hook(GLint x, GLint y, GLsizei width, GLsizei height);
  
    // GL_VERSION_1_2
    void glBlendColor_Hook(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
    void glBlendEquation_Hook(GLenum mode);
    void glDrawRangeElements_Hook(
        GLenum mode,
        GLuint start,
        GLuint end,
        GLsizei count,
        GLenum type,
        const GLvoid* indices);
    void glTexImage3D_Hook(
        GLenum target,
        GLint level,
        GLint internalformat,
        GLsizei width,
        GLsizei height,
        GLsizei depth,
        GLint border,
        GLenum format,
        GLenum type,
        const GLvoid* pixels);
    void glTexSubImage3D_Hook(
        GLenum target,
        GLint level,
        GLint xoffset,
        GLint yoffset,
        GLint zoffset,
        GLsizei width,
        GLsizei height,
        GLsizei depth,
        GLenum format,
        GLenum type,
        const GLvoid* pixels);
    void glCopyTexSubImage3D_Hook(
        GLenum target,
        GLint level,
        GLint xoffset,
        GLint yoffset,
        GLint zoffset,
        GLint x,
        GLint y,
        GLsizei width,
        GLsizei height);
  
    // GL_VERSION_1_2 deprecated functions
    /* Not currently supported
    void glColorTable_Hook(GLenum target, GLenum internalformat, GLsizei width,
                            GLenum format, GLenum type, const GLvoid *table);
    void glColorTableParameterfv_Hook(GLenum target, GLenum pname, const GLfloat *params);
    void glColorTableParameteriv_Hook(GLenum target, GLenum pname, const GLint *params);
    void glCopyColorTable_Hook(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
    void glGetColorTable_Hook(GLenum target, GLenum format, GLenum type, GLvoid *table);
    void glGetColorTableParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);
    void glGetColorTableParameteriv_Hook(GLenum target, GLenum pname, GLint *params);
    void glColorSubTable_Hook(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type,
                              const GLvoid *data);
    void glCopyColorSubTable_Hook(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
    void glConvolutionFilter1D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLenum
                                    format, GLenum type, const GLvoid *image);
    void glConvolutionFilter2D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei
                                    height, GLenum format, GLenum type, const GLvoid *image);
    void glConvolutionParameterf_Hook(GLenum target, GLenum pname, GLfloat params);
    void glConvolutionParameterfv_Hook(GLenum target, GLenum pname, const GLfloat *params);
    void glConvolutionParameteri_Hook(GLenum target, GLenum pname, GLint params);
    void glConvolutionParameteriv_Hook(GLenum target, GLenum pname, const GLint *params);
    void glCopyConvolutionFilter1D_Hook(GLenum target, GLenum internalformat,
                                        GLint x, GLint y, GLsizei width);
    void glCopyConvolutionFilter2D_Hook(GLenum target, GLenum internalformat,
                                        GLint x, GLint y, GLsizei width, GLsizei height);
    void glGetConvolutionFilter_Hook(GLenum target, GLenum format, GLenum type, GLvoid *image);
    void glGetConvolutionParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);
    void glGetConvolutionParameteriv_Hook(GLenum target, GLenum pname, GLint *params);
    void glGetSeparableFilter_Hook(GLenum target, GLenum format, GLenum type,
                                   GLvoid *row, GLvoid *column, GLvoid *span);
    void glSeparableFilter2D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei height,
                                 GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
    void glGetHistogram_Hook(GLenum target, GLboolean reset, GLenum format,
                             GLenum type, GLvoid *values);
    void glGetHistogramParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);
    void glGetHistogramParameteriv_Hook(GLenum target, GLenum pname, GLint *params);
    void glGetMinmax_Hook(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
    void glGetMinmaxParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);
    void glGetMinmaxParameteriv_Hook(GLenum target, GLenum pname, GLint *params);
    void glHistogram_Hook(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
    void glMinmax_Hook(GLenum target, GLenum internalformat, GLboolean sink);
    void glResetHistogram_Hook(GLenum target);
    void glResetMinmax_Hook(GLenum target);
    */
  
    // GL_VERSION_1_3
    void glActiveTexture_Hook(GLenum texture);
    void glSampleCoverage_Hook(GLclampf value, GLboolean invert);
    void glCompressedTexImage3D_Hook(
        GLenum target,
        GLint level,
        GLenum internalformat,
        GLsizei width,
        GLsizei height,
        GLsizei depth,
        GLint border,
        GLsizei imageSize,
        const GLvoid* data);
    void glCompressedTexImage2D_Hook(
        GLenum target,
        GLint level,
        GLenum internalformat,
        GLsizei width,
        GLsizei height,
        GLint border,
        GLsizei imageSize,
        const GLvoid* data);
    void glCompressedTexImage1D_Hook(
        GLenum target,
        GLint level,
        GLenum internalformat,
        GLsizei width,
        GLint border,
        GLsizei imageSize,
        const GLvoid* data);
    void glCompressedTexSubImage3D_Hook(
        GLenum target,
        GLint level,
        GLint xoffset,
        GLint yoffset,
        GLint zoffset,
        GLsizei width,
        GLsizei height,
        GLsizei depth,
        GLenum format,
        GLsizei imageSize,
        const GLvoid* data);
    void glCompressedTexSubImage2D_Hook(
        GLenum target,
        GLint level,
        GLint xoffset,
        GLint yoffset,
        GLsizei width,
        GLsizei height,
        GLenum format,
        GLsizei imageSize,
        const GLvoid* data);
    void glCompressedTexSubImage1D_Hook(
        GLenum target,
        GLint level,
        GLint xoffset,
        GLsizei width,
        GLenum format,
        GLsizei imageSize,
        const GLvoid* data);
    void glGetCompressedTexImage_Hook(GLenum target, GLint level, GLvoid* img);
  
    // GL_VERSION_1_3 deprecated functions
    void glClientActiveTexture_Hook(GLenum texture);
    void glMultiTexCoord1d_Hook(GLenum target, GLdouble s);
    void glMultiTexCoord1dv_Hook(GLenum target, const GLdouble* v);
    void glMultiTexCoord1f_Hook(GLenum target, GLfloat s);
    void glMultiTexCoord1fv_Hook(GLenum target, const GLfloat* v);
    void glMultiTexCoord1i_Hook(GLenum target, GLint s);
    void glMultiTexCoord1iv_Hook(GLenum target, const GLint* v);
    void glMultiTexCoord1s_Hook(GLenum target, GLshort s);
    void glMultiTexCoord1sv_Hook(GLenum target, const GLshort* v);
    void glMultiTexCoord2d_Hook(GLenum target, GLdouble s, GLdouble t);
    void glMultiTexCoord2dv_Hook(GLenum target, const GLdouble* v);
    void glMultiTexCoord2f_Hook(GLenum target, GLfloat s, GLfloat t);
    void glMultiTexCoord2fv_Hook(GLenum target, const GLfloat* v);
    void glMultiTexCoord2i_Hook(GLenum target, GLint s, GLint t);
    void glMultiTexCoord2iv_Hook(GLenum target, const GLint* v);
    void glMultiTexCoord2s_Hook(GLenum target, GLshort s, GLshort t);
    void glMultiTexCoord2sv_Hook(GLenum target, const GLshort* v);
    void glMultiTexCoord3d_Hook(GLenum target, GLdouble s, GLdouble t, GLdouble r);
    void glMultiTexCoord3dv_Hook(GLenum target, const GLdouble* v);
    void glMultiTexCoord3f_Hook(GLenum target, GLfloat s, GLfloat t, GLfloat r);
    void glMultiTexCoord3fv_Hook(GLenum target, const GLfloat* v);
    void glMultiTexCoord3i_Hook(GLenum target, GLint s, GLint t, GLint r);
    void glMultiTexCoord3iv_Hook(GLenum target, const GLint* v);
    void glMultiTexCoord3s_Hook(GLenum target, GLshort s, GLshort t, GLshort r);
    void glMultiTexCoord3sv_Hook(GLenum target, const GLshort* v);
    void glMultiTexCoord4d_Hook(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
    void glMultiTexCoord4dv_Hook(GLenum target, const GLdouble* v);
    void glMultiTexCoord4f_Hook(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
    void glMultiTexCoord4fv_Hook(GLenum target, const GLfloat* v);
    void glMultiTexCoord4i_Hook(GLenum target, GLint s, GLint t, GLint r, GLint q);
    void glMultiTexCoord4iv_Hook(GLenum target, const GLint* v);
    void glMultiTexCoord4s_Hook(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
    void glMultiTexCoord4sv_Hook(GLenum target, const GLshort* v);
    void glLoadTransposeMatrixf_Hook(const GLfloat* m);
    void glLoadTransposeMatrixd_Hook(const GLdouble* m);
    void glMultTransposeMatrixf_Hook(const GLfloat* m);
    void glMultTransposeMatrixd_Hook(const GLdouble* m);
  
    // GL_VERSION_1_4
    void glBlendFuncSeparate_Hook(
        GLenum sfactorRGB,
        GLenum dfactorRGB,
        GLenum sfactorAlpha,
        GLenum dfactorAlpha);
    void
    glMultiDrawArrays_Hook(GLenum mode, const GLint* first, const GLsizei* count, GLsizei primcount);
    void glMultiDrawElements_Hook(
        GLenum mode,
        const GLsizei* count,
        GLenum type,
        const GLvoid** indices,
        GLsizei primcount);
    void glPointParameterf_Hook(GLenum pname, GLfloat param);
    void glPointParameterfv_Hook(GLenum pname, const GLfloat* params);
    void glPointParameteri_Hook(GLenum pname, GLint param);
    void glPointParameteriv_Hook(GLenum pname, const GLint* params);
  
    // GL_VERSION_1_4 deprecated functions
    void glFogCoordf_Hook(GLfloat coord);
    void glFogCoordfv_Hook(const GLfloat* coord);
    void glFogCoordd_Hook(GLdouble coord);
    void glFogCoorddv_Hook(const GLdouble* coord);
    void glFogCoordPointer_Hook(GLenum type, GLsizei stride, const GLvoid* pointer);
    void glSecondaryColor3b_Hook(GLbyte red, GLbyte green, GLbyte blue);
    void glSecondaryColor3bv_Hook(const GLbyte* v);
    void glSecondaryColor3d_Hook(GLdouble red, GLdouble green, GLdouble blue);
    void glSecondaryColor3dv_Hook(const GLdouble* v);
    void glSecondaryColor3f_Hook(GLfloat red, GLfloat green, GLfloat blue);
    void glSecondaryColor3fv_Hook(const GLfloat* v);
    void glSecondaryColor3i_Hook(GLint red, GLint green, GLint blue);
    void glSecondaryColor3iv_Hook(const GLint* v);
    void glSecondaryColor3s_Hook(GLshort red, GLshort green, GLshort blue);
    void glSecondaryColor3sv_Hook(const GLshort* v);
    void glSecondaryColor3ub_Hook(GLubyte red, GLubyte green, GLubyte blue);
    void glSecondaryColor3ubv_Hook(const GLubyte* v);
    void glSecondaryColor3ui_Hook(GLuint red, GLuint green, GLuint blue);
    void glSecondaryColor3uiv_Hook(const GLuint* v);
    void glSecondaryColor3us_Hook(GLushort red, GLushort green, GLushort blue);
    void glSecondaryColor3usv_Hook(const GLushort* v);
    void glSecondaryColorPointer_Hook(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
    void glWindowPos2d_Hook(GLdouble x, GLdouble y);
    void glWindowPos2dv_Hook(const GLdouble* v);
    void glWindowPos2f_Hook(GLfloat x, GLfloat y);
    void glWindowPos2fv_Hook(const GLfloat* v);
    void glWindowPos2i_Hook(GLint x, GLint y);
    void glWindowPos2iv_Hook(const GLint* v);
    void glWindowPos2s_Hook(GLshort x, GLshort y);
    void glWindowPos2sv_Hook(const GLshort* v);
    void glWindowPos3d_Hook(GLdouble x, GLdouble y, GLdouble z);
    void glWindowPos3dv_Hook(const GLdouble* v);
    void glWindowPos3f_Hook(GLfloat x, GLfloat y, GLfloat z);
    void glWindowPos3fv_Hook(const GLfloat* v);
    void glWindowPos3i_Hook(GLint x, GLint y, GLint z);
    void glWindowPos3iv_Hook(const GLint* v);
    void glWindowPos3s_Hook(GLshort x, GLshort y, GLshort z);
    void glWindowPos3sv_Hook(const GLshort* v);
  
    // GL_VERSION_1_5
    void glGenQueries_Hook(GLsizei n, GLuint* ids);
    void glDeleteQueries_Hook(GLsizei n, const GLuint* ids);
    GLboolean glIsQuery_Hook(GLuint id);
    void glBeginQuery_Hook(GLenum target, GLuint id);
    void glEndQuery_Hook(GLenum target);
    void glGetQueryiv_Hook(GLenum target, GLenum pname, GLint* params);
    void glGetQueryObjectiv_Hook(GLuint id, GLenum pname, GLint* params);
    void glGetQueryObjectuiv_Hook(GLuint id, GLenum pname, GLuint* params);
    void glBindBuffer_Hook(GLenum target, GLuint buffer);
    void glDeleteBuffers_Hook(GLsizei n, const GLuint* buffers);
    void glGenBuffers_Hook(GLsizei n, GLuint* buffers);
    GLboolean glIsBuffer_Hook(GLuint buffer);
    void glBufferData_Hook(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
    void glBufferSubData_Hook(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
    void glGetBufferSubData_Hook(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data);
    GLvoid* glMapBuffer_Hook(GLenum target, GLenum access);
    GLboolean glUnmapBuffer_Hook(GLenum target);
    void glGetBufferParameteriv_Hook(GLenum target, GLenum pname, GLint* params);
    void glGetBufferPointerv_Hook(GLenum target, GLenum pname, GLvoid** params);
  
    // GL_VERSION_2_0
    void glBlendEquationSeparate_Hook(GLenum modeRGB, GLenum modeAlpha);
    void glDrawBuffers_Hook(GLsizei n, const GLenum* bufs);
    void glStencilOpSeparate_Hook(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
    void glStencilFuncSeparate_Hook(GLenum face, GLenum func, GLint ref, GLuint mask);
    void glStencilMaskSeparate_Hook(GLenum face, GLuint mask);
    void glAttachShader_Hook(GLuint program, GLuint shader);
    void glBindAttribLocation_Hook(GLuint program, GLuint index, const GLchar* name);
    void glCompileShader_Hook(GLuint shader);
    GLuint glCreateProgram_Hook(void);
    GLuint glCreateShader_Hook(GLenum type);
    void glDeleteProgram_Hook(GLuint program);
    void glDeleteShader_Hook(GLuint shader);
    void glDetachShader_Hook(GLuint program, GLuint shader);
    void glDisableVertexAttribArray_Hook(GLuint index);
    void glEnableVertexAttribArray_Hook(GLuint index);
    void glGetActiveAttrib_Hook(
        GLuint program,
        GLuint index,
        GLsizei bufSize,
        GLsizei* length,
        GLint* size,
        GLenum* type,
        GLchar* name);
    void glGetActiveUniform_Hook(
        GLuint program,
        GLuint index,
        GLsizei bufSize,
        GLsizei* length,
        GLint* size,
        GLenum* type,
        GLchar* name);
    void glGetAttachedShaders_Hook(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* obj);
    GLint glGetAttribLocation_Hook(GLuint program, const GLchar* name);
    void glGetProgramiv_Hook(GLuint program, GLenum pname, GLint* params);
    void glGetProgramInfoLog_Hook(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
    void glGetShaderiv_Hook(GLuint shader, GLenum pname, GLint* params);
    void glGetShaderInfoLog_Hook(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
    void glGetShaderSource_Hook(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source);
    GLint glGetUniformLocation_Hook(GLuint program, const GLchar* name);
    void glGetUniformfv_Hook(GLuint program, GLint location, GLfloat* params);
    void glGetUniformiv_Hook(GLuint program, GLint location, GLint* params);
    void glGetVertexAttribdv_Hook(GLuint index, GLenum pname, GLdouble* params);
    void glGetVertexAttribfv_Hook(GLuint index, GLenum pname, GLfloat* params);
    void glGetVertexAttribiv_Hook(GLuint index, GLenum pname, GLint* params);
    void glGetVertexAttribPointerv_Hook(GLuint index, GLenum pname, GLvoid** pointer);
    GLboolean glIsProgram_Hook(GLuint program);
    GLboolean glIsShader_Hook(GLuint shader);
    void glLinkProgram_Hook(GLuint program);
    void
    glShaderSource_Hook(GLuint shader, GLsizei count, const GLchar** string, const GLint* length);
    void glUseProgram_Hook(GLuint program);
    void glUniform1f_Hook(GLint location, GLfloat v0);
    void glUniform2f_Hook(GLint location, GLfloat v0, GLfloat v1);
    void glUniform3f_Hook(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
    void glUniform4f_Hook(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
    void glUniform1i_Hook(GLint location, GLint v0);
    void glUniform2i_Hook(GLint location, GLint v0, GLint v1);
    void glUniform3i_Hook(GLint location, GLint v0, GLint v1, GLint v2);
    void glUniform4i_Hook(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
    void glUniform1fv_Hook(GLint location, GLsizei count, const GLfloat* value);
    void glUniform2fv_Hook(GLint location, GLsizei count, const GLfloat* value);
    void glUniform3fv_Hook(GLint location, GLsizei count, const GLfloat* value);
    void glUniform4fv_Hook(GLint location, GLsizei count, const GLfloat* value);
    void glUniform1iv_Hook(GLint location, GLsizei count, const GLint* value);
    void glUniform2iv_Hook(GLint location, GLsizei count, const GLint* value);
    void glUniform3iv_Hook(GLint location, GLsizei count, const GLint* value);
    void glUniform4iv_Hook(GLint location, GLsizei count, const GLint* value);
    void
    glUniformMatrix2fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
    void
    glUniformMatrix3fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
    void
    glUniformMatrix4fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
    void glValidateProgram_Hook(GLuint program);
    void glVertexAttrib1d_Hook(GLuint index, GLdouble x);
    void glVertexAttrib1dv_Hook(GLuint index, const GLdouble* v);
    void glVertexAttrib1f_Hook(GLuint index, GLfloat x);
    void glVertexAttrib1fv_Hook(GLuint index, const GLfloat* v);
    void glVertexAttrib1s_Hook(GLuint index, GLshort x);
    void glVertexAttrib1sv_Hook(GLuint index, const GLshort* v);
    void glVertexAttrib2d_Hook(GLuint index, GLdouble x, GLdouble y);
    void glVertexAttrib2dv_Hook(GLuint index, const GLdouble* v);
    void glVertexAttrib2f_Hook(GLuint index, GLfloat x, GLfloat y);
    void glVertexAttrib2fv_Hook(GLuint index, const GLfloat* v);
    void glVertexAttrib2s_Hook(GLuint index, GLshort x, GLshort y);
    void glVertexAttrib2sv_Hook(GLuint index, const GLshort* v);
    void glVertexAttrib3d_Hook(GLuint index, GLdouble x, GLdouble y, GLdouble z);
    void glVertexAttrib3dv_Hook(GLuint index, const GLdouble* v);
    void glVertexAttrib3f_Hook(GLuint index, GLfloat x, GLfloat y, GLfloat z);
    void glVertexAttrib3fv_Hook(GLuint index, const GLfloat* v);
    void glVertexAttrib3s_Hook(GLuint index, GLshort x, GLshort y, GLshort z);
    void glVertexAttrib3sv_Hook(GLuint index, const GLshort* v);
    void glVertexAttrib4Nbv_Hook(GLuint index, const GLbyte* v);
    void glVertexAttrib4Niv_Hook(GLuint index, const GLint* v);
    void glVertexAttrib4Nsv_Hook(GLuint index, const GLshort* v);
    void glVertexAttrib4Nub_Hook(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
    void glVertexAttrib4Nubv_Hook(GLuint index, const GLubyte* v);
    void glVertexAttrib4Nuiv_Hook(GLuint index, const GLuint* v);
    void glVertexAttrib4Nusv_Hook(GLuint index, const GLushort* v);
    void glVertexAttrib4bv_Hook(GLuint index, const GLbyte* v);
    void glVertexAttrib4d_Hook(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
    void glVertexAttrib4dv_Hook(GLuint index, const GLdouble* v);
    void glVertexAttrib4f_Hook(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
    void glVertexAttrib4fv_Hook(GLuint index, const GLfloat* v);
    void glVertexAttrib4iv_Hook(GLuint index, const GLint* v);
    void glVertexAttrib4s_Hook(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
    void glVertexAttrib4sv_Hook(GLuint index, const GLshort* v);
    void glVertexAttrib4ubv_Hook(GLuint index, const GLubyte* v);
    void glVertexAttrib4uiv_Hook(GLuint index, const GLuint* v);
    void glVertexAttrib4usv_Hook(GLuint index, const GLushort* v);
    void glVertexAttribPointer_Hook(
        GLuint index,
        GLint size,
        GLenum type,
        GLboolean normalized,
        GLsizei stride,
        const GLvoid* pointer);
  
    // GL_VERSION_2_1
    void glUniformMatrix2x3fv_Hook(
        GLint location,
        GLsizei count,
        GLboolean transpose,
        const GLfloat* value);
    void glUniformMatrix3x2fv_Hook(
        GLint location,
        GLsizei count,
        GLboolean transpose,
        const GLfloat* value);
    void glUniformMatrix2x4fv_Hook(
        GLint location,
        GLsizei count,
        GLboolean transpose,
        const GLfloat* value);
    void glUniformMatrix4x2fv_Hook(
        GLint location,
        GLsizei count,
        GLboolean transpose,
        const GLfloat* value);
    void glUniformMatrix3x4fv_Hook(
        GLint location,
        GLsizei count,
        GLboolean transpose,
        const GLfloat* value);
    void glUniformMatrix4x3fv_Hook(
        GLint location,
        GLsizei count,
        GLboolean transpose,
        const GLfloat* value);
  
    // GL_VERSION_3_0
    void glColorMaski_Hook(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
    void glGetBooleani_v_Hook(GLenum target, GLuint index, GLboolean* data);
    void glGetIntegeri_v_Hook(GLenum target, GLuint index, GLint* data);
    void glEnablei_Hook(GLenum target, GLuint index);
    void glDisablei_Hook(GLenum target, GLuint index);
    GLboolean glIsEnabledi_Hook(GLenum target, GLuint index);
    void glBeginTransformFeedback_Hook(GLenum primitiveMode);
    void glEndTransformFeedback_Hook(void);
    void glBindBufferRange_Hook(
        GLenum target,
        GLuint index,
        GLuint buffer,
        GLintptr offset,
        GLsizeiptr size);
    void glBindBufferBase_Hook(GLenum target, GLuint index, GLuint buffer);
    void glTransformFeedbackVaryings_Hook(
        GLuint program,
        GLsizei count,
        const GLchar** varyings,
        GLenum bufferMode);
    void glGetTransformFeedbackVarying_Hook(
        GLuint program,
        GLuint index,
        GLsizei bufSize,
        GLsizei* length,
        GLsizei* size,
        GLenum* type,
        GLchar* name);
    void glClampColor_Hook(GLenum target, GLenum clamp);
    void glBeginConditionalRender_Hook(GLuint id, GLenum mode);
    void glEndConditionalRender_Hook(void);
    void glVertexAttribIPointer_Hook(
        GLuint index,
        GLint size,
        GLenum type,
        GLsizei stride,
        const GLvoid* pointer);
    void glGetVertexAttribIiv_Hook(GLuint index, GLenum pname, GLint* params);
    void glGetVertexAttribIuiv_Hook(GLuint index, GLenum pname, GLuint* params);
    void glVertexAttribI1i_Hook(GLuint index, GLint x);
    void glVertexAttribI2i_Hook(GLuint index, GLint x, GLint y);
    void glVertexAttribI3i_Hook(GLuint index, GLint x, GLint y, GLint z);
    void glVertexAttribI4i_Hook(GLuint index, GLint x, GLint y, GLint z, GLint w);
    void glVertexAttribI1ui_Hook(GLuint index, GLuint x);
    void glVertexAttribI2ui_Hook(GLuint index, GLuint x, GLuint y);
    void glVertexAttribI3ui_Hook(GLuint index, GLuint x, GLuint y, GLuint z);
    void glVertexAttribI4ui_Hook(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
    void glVertexAttribI1iv_Hook(GLuint index, const GLint* v);
    void glVertexAttribI2iv_Hook(GLuint index, const GLint* v);
    void glVertexAttribI3iv_Hook(GLuint index, const GLint* v);
    void glVertexAttribI4iv_Hook(GLuint index, const GLint* v);
    void glVertexAttribI1uiv_Hook(GLuint index, const GLuint* v);
    void glVertexAttribI2uiv_Hook(GLuint index, const GLuint* v);
    void glVertexAttribI3uiv_Hook(GLuint index, const GLuint* v);
    void glVertexAttribI4uiv_Hook(GLuint index, const GLuint* v);
    void glVertexAttribI4bv_Hook(GLuint index, const GLbyte* v);
    void glVertexAttribI4sv_Hook(GLuint index, const GLshort* v);
    void glVertexAttribI4ubv_Hook(GLuint index, const GLubyte* v);
    void glVertexAttribI4usv_Hook(GLuint index, const GLushort* v);
    void glGetUniformuiv_Hook(GLuint program, GLint location, GLuint* params);
    void glBindFragDataLocation_Hook(GLuint program, GLuint color, const GLchar* name);
    GLint glGetFragDataLocation_Hook(GLuint program, const GLchar* name);
    void glUniform1ui_Hook(GLint location, GLuint v0);
    void glUniform2ui_Hook(GLint location, GLuint v0, GLuint v1);
    void glUniform3ui_Hook(GLint location, GLuint v0, GLuint v1, GLuint v2);
    void glUniform4ui_Hook(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
    void glUniform1uiv_Hook(GLint location, GLsizei count, const GLuint* value);
    void glUniform2uiv_Hook(GLint location, GLsizei count, const GLuint* value);
    void glUniform3uiv_Hook(GLint location, GLsizei count, const GLuint* value);
    void glUniform4uiv_Hook(GLint location, GLsizei count, const GLuint* value);
    void glTexParameterIiv_Hook(GLenum target, GLenum pname, const GLint* params);
    void glTexParameterIuiv_Hook(GLenum target, GLenum pname, const GLuint* params);
    void glGetTexParameterIiv_Hook(GLenum target, GLenum pname, GLint* params);
    void glGetTexParameterIuiv_Hook(GLenum target, GLenum pname, GLuint* params);
    void glClearBufferiv_Hook(GLenum buffer, GLint drawbuffer, const GLint* value);
    void glClearBufferuiv_Hook(GLenum buffer, GLint drawbuffer, const GLuint* value);
    void glClearBufferfv_Hook(GLenum buffer, GLint drawbuffer, const GLfloat* value);
    void glClearBufferfi_Hook(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
    const GLubyte* glGetStringi_Hook(GLenum name, GLuint index);
  
    // GL_VERSION_3_1
    void glDrawArraysInstanced_Hook(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
    void glDrawElementsInstanced_Hook(
        GLenum mode,
        GLsizei count,
        GLenum type,
        const GLvoid* indices,
        GLsizei primcount);
    void glTexBuffer_Hook(GLenum target, GLenum internalformat, GLuint buffer);
    void glPrimitiveRestartIndex_Hook(GLuint index);
  
    // GL_VERSION_3_2
    void glGetInteger64i_v_Hook(GLenum target, GLuint index, GLint64* data);
    void glGetBufferParameteri64v_Hook(GLenum target, GLenum pname, GLint64* params);
    void glFramebufferTexture_Hook(GLenum target, GLenum attachment, GLuint texture, GLint level);
  
    // GL_VERSION_3_3
    void glVertexAttribDivisor_Hook(GLuint index, GLuint divisor);
  
    // GL_VERSION_4_0
    void glMinSampleShading_Hook(GLclampf value);
    void glBlendEquationi_Hook(GLuint buf, GLenum mode);
    void glBlendEquationSeparatei_Hook(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
    void glBlendFunci_Hook(GLuint buf, GLenum src, GLenum dst);
    void glBlendFuncSeparatei_Hook(
        GLuint buf,
        GLenum srcRGB,
        GLenum dstRGB,
        GLenum srcAlpha,
        GLenum dstAlpha);
  
    // GL_AMD_debug_output
    void glDebugMessageEnableAMD_Hook(
        GLenum category,
        GLenum severity,
        GLsizei count,
        const GLuint* ids,
        GLboolean enabled);
    void glDebugMessageInsertAMD_Hook(
        GLenum category,
        GLenum severity,
        GLuint id,
        GLsizei length,
        const GLchar* buf);
    void glDebugMessageCallbackAMD_Hook(GLDEBUGPROCAMD callback, GLvoid* userParam);
    GLuint glGetDebugMessageLogAMD_Hook(
        GLuint count,
        GLsizei bufsize,
        GLenum* categories,
        GLuint* severities,
        GLuint* ids,
        GLsizei* lengths,
        GLchar* message);
  
  #if defined(GLE_CGL_ENABLED)
    // GL_APPLE_element_array
    void glElementPointerAPPLE_Hook(GLenum type, const GLvoid* pointer);
    void glDrawElementArrayAPPLE_Hook(GLenum mode, GLint first, GLsizei count);
    void glDrawRangeElementArrayAPPLE_Hook(
        GLenum mode,
        GLuint start,
        GLuint end,
        GLint first,
        GLsizei count);
    void glMultiDrawElementArrayAPPLE_Hook(
        GLenum mode,
        const GLint* first,
        const GLsizei* count,
        GLsizei primcount);
    void glMultiDrawRangeElementArrayAPPLE_Hook(
        GLenum mode,
        GLuint start,
        GLuint end,
        const GLint* first,
        const GLsizei* count,
        GLsizei primcount);
  
    // GL_APPLE_fence
    void glGenFencesAPPLE_Hook(GLsizei n, GLuint* fences);
    void glDeleteFencesAPPLE_Hook(GLsizei n, const GLuint* fences);
    void glSetFenceAPPLE_Hook(GLuint fence);
    GLboolean glIsFenceAPPLE_Hook(GLuint fence);
    GLboolean glTestFenceAPPLE_Hook(GLuint fence);
    void glFinishFenceAPPLE_Hook(GLuint fence);
    GLboolean glTestObjectAPPLE_Hook(GLenum object, GLuint name);
    void glFinishObjectAPPLE_Hook(GLenum object, GLint name);
  
    // GL_APPLE_flush_buffer_range
    void glBufferParameteriAPPLE_Hook(GLenum target, GLenum pname, GLint param);
    void glFlushMappedBufferRangeAPPLE_Hook(GLenum target, GLintptr offset, GLsizeiptr size);
  
    // GL_APPLE_object_purgeable
    GLenum glObjectPurgeableAPPLE_Hook(GLenum objectType, GLuint name, GLenum option);
    GLenum glObjectUnpurgeableAPPLE_Hook(GLenum objectType, GLuint name, GLenum option);
    void
    glGetObjectParameterivAPPLE_Hook(GLenum objectType, GLuint name, GLenum pname, GLint* params);
  
    // GL_APPLE_texture_range
    void glTextureRangeAPPLE_Hook(GLenum target, GLsizei length, const GLvoid* pointer);
    void glGetTexParameterPointervAPPLE_Hook(GLenum target, GLenum pname, GLvoid** params);
  
    // GL_APPLE_vertex_array_object
    void glBindVertexArrayAPPLE_Hook(GLuint array);
    void glDeleteVertexArraysAPPLE_Hook(GLsizei n, const GLuint* arrays);
    void glGenVertexArraysAPPLE_Hook(GLsizei n, GLuint* arrays);
    GLboolean glIsVertexArrayAPPLE_Hook(GLuint array);
  
    // GL_APPLE_vertex_array_range
    void glVertexArrayRangeAPPLE_Hook(GLsizei length, GLvoid* pointer);
    void glFlushVertexArrayRangeAPPLE_Hook(GLsizei length, GLvoid* pointer);
    void glVertexArrayParameteriAPPLE_Hook(GLenum pname, GLint param);
  
    // GL_APPLE_vertex_program_evaluators
    void glEnableVertexAttribAPPLE_Hook(GLuint index, GLenum pname);
    void glDisableVertexAttribAPPLE_Hook(GLuint index, GLenum pname);
    GLboolean glIsVertexAttribEnabledAPPLE_Hook(GLuint index, GLenum pname);
    void glMapVertexAttrib1dAPPLE_Hook(
        GLuint index,
        GLuint size,
        GLdouble u1,
        GLdouble u2,
        GLint stride,
        GLint order,
        const GLdouble* points);
    void glMapVertexAttrib1fAPPLE_Hook(
        GLuint index,
        GLuint size,
        GLfloat u1,
        GLfloat u2,
        GLint stride,
        GLint order,
        const GLfloat* points);
    void glMapVertexAttrib2dAPPLE_Hook(
        GLuint index,
        GLuint size,
        GLdouble u1,
        GLdouble u2,
        GLint ustride,
        GLint uorder,
        GLdouble v1,
        GLdouble v2,
        GLint vstride,
        GLint vorder,
        const GLdouble* points);
    void glMapVertexAttrib2fAPPLE_Hook(
        GLuint index,
        GLuint size,
        GLfloat u1,
        GLfloat u2,
        GLint ustride,
        GLint uorder,
        GLfloat v1,
        GLfloat v2,
        GLint vstride,
        GLint vorder,
        const GLfloat* points);
  #endif // GLE_CGL_ENABLED
  
    // GL_ARB_copy_buffer
    void glCopyBufferSubData_Hook(
        GLenum readtarget,
        GLenum writetarget,
        GLintptr readoffset,
        GLintptr writeoffset,
        GLsizeiptr size);
  
    // GL_ARB_debug_output
    void glDebugMessageControlARB_Hook(
        GLenum source,
        GLenum type,
        GLenum severity,
        GLsizei count,
        const GLuint* ids,
        GLboolean enabled);
    void glDebugMessageInsertARB_Hook(
        GLenum source,
        GLenum type,
        GLuint id,
        GLenum severity,
        GLsizei length,
        const GLchar* buf);
    void glDebugMessageCallbackARB_Hook(GLDEBUGPROCARB callback, const GLvoid* userParam);
    GLuint glGetDebugMessageLogARB_Hook(
        GLuint count,
        GLsizei bufsize,
        GLenum* sources,
        GLenum* types,
        GLuint* ids,
        GLenum* severities,
        GLsizei* lengths,
        GLchar* messageLog);
  
    // GL_ARB_ES2_compatibility
    void glReleaseShaderCompiler_Hook();
    void glShaderBinary_Hook(
        GLsizei count,
        const GLuint* shaders,
        GLenum binaryformat,
        const GLvoid* binary,
        GLsizei length);
    void glGetShaderPrecisionFormat_Hook(
        GLenum shadertype,
        GLenum precisiontype,
        GLint* range,
        GLint* precision);
    void glDepthRangef_Hook(GLclampf n, GLclampf f);
    void glClearDepthf_Hook(GLclampf d);
  
    // GL_ARB_framebuffer_object
    GLboolean glIsRenderbuffer_Hook(GLuint renderbuffer);
    void glBindRenderbuffer_Hook(GLenum target, GLuint renderbuffer);
    void glDeleteRenderbuffers_Hook(GLsizei n, const GLuint* renderbuffers);
    void glGenRenderbuffers_Hook(GLsizei n, GLuint* renderbuffers);
    void
    glRenderbufferStorage_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
    void glGetRenderbufferParameteriv_Hook(GLenum target, GLenum pname, GLint* params);
    GLboolean glIsFramebuffer_Hook(GLuint framebuffer);
    void glBindFramebuffer_Hook(GLenum target, GLuint framebuffer);
    void glDeleteFramebuffers_Hook(GLsizei n, const GLuint* framebuffers);
    void glGenFramebuffers_Hook(GLsizei n, GLuint* framebuffers);
    GLenum glCheckFramebufferStatus_Hook(GLenum target);
    void glFramebufferTexture1D_Hook(
        GLenum target,
        GLenum attachment,
        GLenum textarget,
        GLuint texture,
        GLint level);
    void glFramebufferTexture2D_Hook(
        GLenum target,
        GLenum attachment,
        GLenum textarget,
        GLuint texture,
        GLint level);
    void glFramebufferTexture3D_Hook(
        GLenum target,
        GLenum attachment,
        GLenum textarget,
        GLuint texture,
        GLint level,
        GLint zoffset);
    void glFramebufferRenderbuffer_Hook(
        GLenum target,
        GLenum attachment,
        GLenum renderbuffertarget,
        GLuint renderbuffer);
    void glGetFramebufferAttachmentParameteriv_Hook(
        GLenum target,
        GLenum attachment,
        GLenum pname,
        GLint* params);
    void glGenerateMipmap_Hook(GLenum target);
    void glBlitFramebuffer_Hook(
        GLint srcX0,
        GLint srcY0,
        GLint srcX1,
        GLint srcY1,
        GLint dstX0,
        GLint dstY0,
        GLint dstX1,
        GLint dstY1,
        GLbitfield mask,
        GLenum filter);
    void glRenderbufferStorageMultisample_Hook(
        GLenum target,
        GLsizei samples,
        GLenum internalformat,
        GLsizei width,
        GLsizei height);
    void glFramebufferTextureLayer_Hook(
        GLenum target,
        GLenum attachment,
        GLuint texture,
        GLint level,
        GLint layer);
  
    // GL_ARB_texture_multisample
    void glTexImage2DMultisample_Hook(
        GLenum target,
        GLsizei samples,
        GLint internalformat,
        GLsizei width,
        GLsizei height,
        GLboolean fixedsamplelocations);
    void glTexImage3DMultisample_Hook(
        GLenum target,
        GLsizei samples,
        GLint internalformat,
        GLsizei width,
        GLsizei height,
        GLsizei depth,
        GLboolean fixedsamplelocations);
    void glGetMultisamplefv_Hook(GLenum pname, GLuint index, GLfloat* val);
    void glSampleMaski_Hook(GLuint index, GLbitfield mask);
  
    // GL_ARB_texture_storage
    void glTexStorage1D_Hook(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
    void glTexStorage2D_Hook(
        GLenum target,
        GLsizei levels,
        GLenum internalformat,
        GLsizei width,
        GLsizei height);
    void glTexStorage3D_Hook(
        GLenum target,
        GLsizei levels,
        GLenum internalformat,
        GLsizei width,
        GLsizei height,
        GLsizei depth);
    void glTextureStorage1DEXT_Hook(
        GLuint texture,
        GLenum target,
        GLsizei levels,
        GLenum internalformat,
        GLsizei width);
    void glTextureStorage2DEXT_Hook(
        GLuint texture,
        GLenum target,
        GLsizei levels,
        GLenum internalformat,
        GLsizei width,
        GLsizei height);
    void glTextureStorage3DEXT_Hook(
        GLuint texture,
        GLenum target,
        GLsizei levels,
        GLenum internalformat,
        GLsizei width,
        GLsizei height,
        GLsizei depth);
  
    // GL_ARB_texture_storage_multisample
    void glTexStorage2DMultisample_Hook(
        GLenum target,
        GLsizei samples,
        GLenum internalformat,
        GLsizei width,
        GLsizei height,
        GLboolean fixedsamplelocations);
    void glTexStorage3DMultisample_Hook(
        GLenum target,
        GLsizei samples,
        GLenum internalformat,
        GLsizei width,
        GLsizei height,
        GLsizei depth,
        GLboolean fixedsamplelocations);
    void glTextureStorage2DMultisampleEXT_Hook(
        GLuint texture,
        GLenum target,
        GLsizei samples,
        GLenum internalformat,
        GLsizei width,
        GLsizei height,
        GLboolean fixedsamplelocations);
    void glTextureStorage3DMultisampleEXT_Hook(
        GLuint texture,
        GLenum target,
        GLsizei samples,
        GLenum internalformat,
        GLsizei width,
        GLsizei height,
        GLsizei depth,
        GLboolean fixedsamplelocations);
  
    // GL_ARB_timer_query
    void glQueryCounter_Hook(GLuint id, GLenum target);
    void glGetQueryObjecti64v_Hook(GLuint id, GLenum pname, GLint64* params);
    void glGetQueryObjectui64v_Hook(GLuint id, GLenum pname, GLuint64* params);
  
    // GL_ARB_vertex_array_object
    void glBindVertexArray_Hook(GLuint array);
    void glDeleteVertexArrays_Hook(GLsizei n, const GLuint* arrays);
    void glGenVertexArrays_Hook(GLsizei n, GLuint* arrays);
    GLboolean glIsVertexArray_Hook(GLuint array);
  
    // GL_EXT_draw_buffers2
    void glColorMaskIndexedEXT_Hook(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
    void glGetBooleanIndexedvEXT_Hook(GLenum target, GLuint index, GLboolean* data);
    void glGetIntegerIndexedvEXT_Hook(GLenum target, GLuint index, GLint* data);
    void glEnableIndexedEXT_Hook(GLenum target, GLuint index);
    void glDisableIndexedEXT_Hook(GLenum target, GLuint index);
    GLboolean glIsEnabledIndexedEXT_Hook(GLenum target, GLuint index);
  
    // GL_KHR_debug
    void glDebugMessageControl_Hook(
        GLenum source,
        GLenum type,
        GLenum severity,
        GLsizei count,
        const GLuint* ids,
        GLboolean enabled);
    void glDebugMessageInsert_Hook(
        GLenum source,
        GLenum type,
        GLuint id,
        GLenum severity,
        GLsizei length,
        const char* buf);
    void glDebugMessageCallback_Hook(GLDEBUGPROC callback, const void* userParam);
    GLuint glGetDebugMessageLog_Hook(
        GLuint count,
        GLsizei bufSize,
        GLenum* sources,
        GLenum* types,
        GLuint* ids,
        GLenum* severities,
        GLsizei* lengths,
        char* messageLog);
    void glPushDebugGroup_Hook(GLenum source, GLuint id, GLsizei length, const char* message);
    void glPopDebugGroup_Hook(void);
    void glObjectLabel_Hook(GLenum identifier, GLuint name, GLsizei length, const char* label);
    void glGetObjectLabel_Hook(
        GLenum identifier,
        GLuint name,
        GLsizei bufSize,
        GLsizei* length,
        char* label);
    void glObjectPtrLabel_Hook(void* ptr, GLsizei length, const char* label);
    void glGetObjectPtrLabel_Hook(void* ptr, GLsizei bufSize, GLsizei* length, char* label);
  
    // GL_WIN_swap_hint
    void glAddSwapHintRectWIN_Hook(GLint x, GLint y, GLsizei width, GLsizei height);
  
  #if defined(GLE_WGL_ENABLED)
    void PostWGLHook(const char* functionName);
  
    // WGL
    /* Hooking of these is currently disabled.
    BOOL  wglCopyContext_Hook(HGLRC, HGLRC, UINT);
    HGLRC wglCreateContext_Hook(HDC);
    HGLRC wglCreateLayerContext_Hook(HDC, int);
    BOOL  wglDeleteContext_Hook(HGLRC);
    HGLRC wglGetCurrentContext_Hook(VOID);
    HDC   wglGetCurrentDC_Hook(VOID);
    PROC  wglGetProcAddress_Hook(LPCSTR);
    BOOL  wglMakeCurrent_Hook(HDC, HGLRC);
    BOOL  wglShareLists_Hook(HGLRC, HGLRC);
    BOOL  wglUseFontBitmapsA_Hook(HDC, DWORD, DWORD, DWORD);
    BOOL  wglUseFontBitmapsW_Hook(HDC, DWORD, DWORD, DWORD);
    BOOL  wglUseFontOutlinesA_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);
    BOOL  wglUseFontOutlinesW_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);
    BOOL  wglDescribeLayerPlane_Hook(HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR);
    int   wglSetLayerPaletteEntries_Hook(HDC, int, int, int, CONST COLORREF *);
    int   wglGetLayerPaletteEntries_Hook(HDC, int, int, int, COLORREF *);
    BOOL  wglRealizeLayerPalette_Hook(HDC, int, BOOL);
    BOOL  wglSwapLayerBuffers_Hook(HDC, UINT);
    DWORD wglSwapMultipleBuffers_Hook(UINT, CONST WGLSWAP *);
    */
  
    // WGL_ARB_buffer_region
    HANDLE wglCreateBufferRegionARB_Hook(HDC hDC, int iLayerPlane, UINT uType);
    VOID wglDeleteBufferRegionARB_Hook(HANDLE hRegion);
    BOOL wglSaveBufferRegionARB_Hook(HANDLE hRegion, int x, int y, int width, int height);
    BOOL wglRestoreBufferRegionARB_Hook(
        HANDLE hRegion,
        int x,
        int y,
        int width,
        int height,
        int xSrc,
        int ySrc);
  
    // WGL_ARB_extensions_string
    const char* wglGetExtensionsStringARB_Hook(HDC hdc);
  
    // WGL_ARB_pixel_format
    BOOL wglGetPixelFormatAttribivARB_Hook(
        HDC hdc,
        int iPixelFormat,
        int iLayerPlane,
        UINT nAttributes,
        const int* piAttributes,
        int* piValues);
    BOOL wglGetPixelFormatAttribfvARB_Hook(
        HDC hdc,
        int iPixelFormat,
        int iLayerPlane,
        UINT nAttributes,
        const int* piAttributes,
        FLOAT* pfValues);
    BOOL wglChoosePixelFormatARB_Hook(
        HDC hdc,
        const int* piAttribIList,
        const FLOAT* pfAttribFList,
        UINT nMaxFormats,
        int* piFormats,
        UINT* nNumFormats);
  
    // WGL_ARB_make_current_read
    BOOL wglMakeContextCurrentARB_Hook(HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
    HDC wglGetCurrentReadDCARB_Hook(void);
  
    // WGL_ARB_pbuffer
    HPBUFFERARB wglCreatePbufferARB_Hook(
        HDC hDC,
        int iPixelFormat,
        int iWidth,
        int iHeight,
        const int* piAttribList);
    HDC wglGetPbufferDCARB_Hook(HPBUFFERARB hPbuffer);
    int wglReleasePbufferDCARB_Hook(HPBUFFERARB hPbuffer, HDC hDC);
    BOOL wglDestroyPbufferARB_Hook(HPBUFFERARB hPbuffer);
    BOOL wglQueryPbufferARB_Hook(HPBUFFERARB hPbuffer, int iAttribute, int* piValue);
  
    // WGL_ARB_render_texture
    BOOL wglBindTexImageARB_Hook(HPBUFFERARB hPbuffer, int iBuffer);
    BOOL wglReleaseTexImageARB_Hook(HPBUFFERARB hPbuffer, int iBuffer);
    BOOL wglSetPbufferAttribARB_Hook(HPBUFFERARB hPbuffer, const int* piAttribList);
  
    // WGL_NV_present_video
    int wglEnumerateVideoDevicesNV_Hook(HDC hDC, HVIDEOOUTPUTDEVICENV* phDeviceList);
    BOOL wglBindVideoDeviceNV_Hook(
        HDC hDC,
        unsigned int uVideoSlot,
        HVIDEOOUTPUTDEVICENV hVideoDevice,
        const int* piAttribList);
    BOOL wglQueryCurrentContextNV_Hook(int iAttribute, int* piValue);
  
    // WGL_ARB_create_context
    HGLRC wglCreateContextAttribsARB_Hook(HDC hDC, HGLRC hShareContext, const int* attribList);
  
    // WGL_EXT_extensions_string
    const char* wglGetExtensionsStringEXT_Hook();
  
    // WGL_EXT_swap_control
    BOOL wglSwapIntervalEXT_Hook(int interval);
    int wglGetSwapIntervalEXT_Hook();
  
    // WGL_OML_sync_control
    BOOL wglGetSyncValuesOML_Hook(HDC hdc, INT64* ust, INT64* msc, INT64* sbc);
    BOOL wglGetMscRateOML_Hook(HDC hdc, INT32* numerator, INT32* denominator);
    INT64 wglSwapBuffersMscOML_Hook(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);
    INT64 wglSwapLayerBuffersMscOML_Hook(
        HDC hdc,
        int fuPlanes,
        INT64 target_msc,
        INT64 divisor,
        INT64 remainder);
    BOOL wglWaitForMscOML_Hook(
        HDC hdc,
        INT64 target_msc,
        INT64 divisor,
        INT64 remainder,
        INT64* ust,
        INT64* msc,
        INT64* sbc);
    BOOL wglWaitForSbcOML_Hook(HDC hdc, INT64 target_sbc, INT64* ust, INT64* msc, INT64* sbc);
  
    // WGL_NV_video_output
    BOOL wglGetVideoDeviceNV_Hook(HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice);
    BOOL wglReleaseVideoDeviceNV_Hook(HPVIDEODEV hVideoDevice);
    BOOL wglBindVideoImageNV_Hook(HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);
    BOOL wglReleaseVideoImageNV_Hook(HPBUFFERARB hPbuffer, int iVideoBuffer);
    BOOL wglSendPbufferToVideoNV_Hook(
        HPBUFFERARB hPbuffer,
        int iBufferType,
        unsigned long* pulCounterPbuffer,
        BOOL bBlock);
    BOOL wglGetVideoInfoNV_Hook(
        HPVIDEODEV hpVideoDevice,
        unsigned long* pulCounterOutputPbuffer,
        unsigned long* pulCounterOutputVideo);
  
    // WGL_NV_swap_group
    BOOL wglJoinSwapGroupNV_Hook(HDC hDC, GLuint group);
    BOOL wglBindSwapBarrierNV_Hook(GLuint group, GLuint barrier);
    BOOL wglQuerySwapGroupNV_Hook(HDC hDC, GLuint* group, GLuint* barrier);
    BOOL wglQueryMaxSwapGroupsNV_Hook(HDC hDC, GLuint* maxGroups, GLuint* maxBarriers);
    BOOL wglQueryFrameCountNV_Hook(HDC hDC, GLuint* count);
    BOOL wglResetFrameCountNV_Hook(HDC hDC);
  
    // WGL_NV_video_capture
    BOOL wglBindVideoCaptureDeviceNV_Hook(UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);
    UINT wglEnumerateVideoCaptureDevicesNV_Hook(HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList);
    BOOL wglLockVideoCaptureDeviceNV_Hook(HDC hDc, HVIDEOINPUTDEVICENV hDevice);
    BOOL wglQueryVideoCaptureDeviceNV_Hook(
        HDC hDc,
        HVIDEOINPUTDEVICENV hDevice,
        int iAttribute,
        int* piValue);
    BOOL wglReleaseVideoCaptureDeviceNV_Hook(HDC hDc, HVIDEOINPUTDEVICENV hDevice);
  
    // WGL_NV_copy_image
    BOOL wglCopyImageSubDataNV_Hook(
        HGLRC hSrcRC,
        GLuint srcName,
        GLenum srcTarget,
        GLint srcLevel,
        GLint srcX,
        GLint srcY,
        GLint srcZ,
        HGLRC hDstRC,
        GLuint dstName,
        GLenum dstTarget,
        GLint dstLevel,
        GLint dstX,
        GLint dstY,
        GLint dstZ,
        GLsizei width,
        GLsizei height,
        GLsizei depth);
  
    // WGL_NV_DX_interop
    BOOL wglDXSetResourceShareHandleNV_Hook(void* dxObject, HANDLE shareHandle);
    HANDLE wglDXOpenDeviceNV_Hook(void* dxDevice);
    BOOL wglDXCloseDeviceNV_Hook(HANDLE hDevice);
    HANDLE wglDXRegisterObjectNV_Hook(
        HANDLE hDevice,
        void* dxObject,
        GLuint name,
        GLenum type,
        GLenum access);
    BOOL wglDXUnregisterObjectNV_Hook(HANDLE hDevice, HANDLE hObject);
    BOOL wglDXObjectAccessNV_Hook(HANDLE hObject, GLenum access);
    BOOL wglDXLockObjectsNV_Hook(HANDLE hDevice, GLint count, HANDLE* hObjects);
    BOOL wglDXUnlockObjectsNV_Hook(HANDLE hDevice, GLint count, HANDLE* hObjects);
  #endif // GLE_WGL_ENABLED
  
  #if defined(GLE_GLX_ENABLED)
    void PostGLXHook(const char* functionName);
  
    // GLX_VERSION_1_0
    // GLX_VERSION_1_1
    // We don't currently do hooking of these.
  
    // GLX_VERSION_1_2
    ::Display* glXGetCurrentDisplay_Hook(void);
  
    // GLX_VERSION_1_3
    GLXFBConfig*
    glXChooseFBConfig_Hook(::Display* dpy, int screen, const int* attrib_list, int* nelements);
    GLXContext glXCreateNewContext_Hook(
        ::Display* dpy,
        GLXFBConfig config,
        int render_type,
        GLXContext share_list,
        Bool direct);
    GLXPbuffer glXCreatePbuffer_Hook(::Display* dpy, GLXFBConfig config, const int* attrib_list);
    GLXPixmap
    glXCreatePixmap_Hook(::Display* dpy, GLXFBConfig config, Pixmap pixmap, const int* attrib_list);
    GLXWindow
    glXCreateWindow_Hook(::Display* dpy, GLXFBConfig config, Window win, const int* attrib_list);
    void glXDestroyPbuffer_Hook(::Display* dpy, GLXPbuffer pbuf);
    void glXDestroyPixmap_Hook(::Display* dpy, GLXPixmap pixmap);
    void glXDestroyWindow_Hook(::Display* dpy, GLXWindow win);
    GLXDrawable glXGetCurrentReadDrawable_Hook(void);
    int glXGetFBConfigAttrib_Hook(::Display* dpy, GLXFBConfig config, int attribute, int* value);
    GLXFBConfig* glXGetFBConfigs_Hook(::Display* dpy, int screen, int* nelements);
    void glXGetSelectedEvent_Hook(::Display* dpy, GLXDrawable draw, unsigned long* event_mask);
    XVisualInfo* glXGetVisualFromFBConfig_Hook(::Display* dpy, GLXFBConfig config);
    Bool glXMakeContextCurrent_Hook(
        ::Display* display,
        GLXDrawable draw,
        GLXDrawable read,
        GLXContext ctx);
    int glXQueryContext_Hook(::Display* dpy, GLXContext ctx, int attribute, int* value);
    void glXQueryDrawable_Hook(::Display* dpy, GLXDrawable draw, int attribute, unsigned int* value);
    void glXSelectEvent_Hook(::Display* dpy, GLXDrawable draw, unsigned long event_mask);
  
    // GLX_VERSION_1_4
    // We don't do hooking of this.
  
    // GLX_ARB_create_context
    GLXContext glXCreateContextAttribsARB_Hook(
        Display* dpy,
        GLXFBConfig config,
        GLXContext share_context,
        Bool direct,
        const int* attrib_list);
  
    // GLX_EXT_swap_control
    void glXSwapIntervalEXT_Hook(::Display* dpy, GLXDrawable drawable, int interval);
  
    // GLX_OML_sync_control
    Bool glXGetMscRateOML_Hook(
        ::Display* dpy,
        GLXDrawable drawable,
        int32_t* numerator,
        int32_t* denominator);
    Bool glXGetSyncValuesOML_Hook(
        ::Display* dpy,
        GLXDrawable drawable,
        int64_t* ust,
        int64_t* msc,
        int64_t* sbc);
    int64_t glXSwapBuffersMscOML_Hook(
        ::Display* dpy,
        GLXDrawable drawable,
        int64_t target_msc,
        int64_t divisor,
        int64_t remainder);
    Bool glXWaitForMscOML_Hook(
        ::Display* dpy,
        GLXDrawable drawable,
        int64_t target_msc,
        int64_t divisor,
        int64_t remainder,
        int64_t* ust,
        int64_t* msc,
        int64_t* sbc);
    Bool glXWaitForSbcOML_Hook(
        ::Display* dpy,
        GLXDrawable drawable,
        int64_t target_sbc,
        int64_t* ust,
        int64_t* msc,
        int64_t* sbc);
  
    // GLX_MESA_swap_control
    int glXGetSwapIntervalMESA_Hook();
    int glXSwapIntervalMESA_Hook(unsigned int interval);
  
  #endif // GLE_GLX_ENABLED
  
  #endif // #if defined(GLE_HOOKING_ENABLED)
  
    // GL_VERSION_1_1
    // These are not represented by function pointers.
  
    // GL_VERSION_1_2
    PFNGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D_Impl;
    PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements_Impl;
    PFNGLTEXIMAGE3DPROC glTexImage3D_Impl;
    PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D_Impl;
  
    // GL_VERSION_1_2 deprecated functions
    /* Not currently supported
    PFNGLCOLORTABLEPROC glColorTable_Impl;
    PFNGLCOLORTABLEPARAMETERFVPROC glColorTableParameterfv_Impl;
    PFNGLCOLORTABLEPARAMETERIVPROC glColorTableParameteriv_Impl;
    PFNGLCOPYCOLORTABLEPROC glCopyColorTable_Impl;
    PFNGLGETCOLORTABLEPROC glGetColorTable_Impl;
    PFNGLGETCOLORTABLEPARAMETERFVPROC glGetColorTableParameterfv_Impl;
    PFNGLGETCOLORTABLEPARAMETERIVPROC glGetColorTableParameteriv_Impl;
    PFNGLCOLORSUBTABLEPROC glColorSubTable_Impl;
    PFNGLCOPYCOLORSUBTABLEPROC glCopyColorSubTable_Impl;
    PFNGLCONVOLUTIONFILTER1DPROC glConvolutionFilter1D_Impl;
    PFNGLCONVOLUTIONFILTER2DPROC glConvolutionFilter2D_Impl;
    PFNGLCONVOLUTIONPARAMETERFPROC glConvolutionParameterf_Impl;
    PFNGLCONVOLUTIONPARAMETERFVPROC glConvolutionParameterfv_Impl;
    PFNGLCONVOLUTIONPARAMETERIPROC glConvolutionParameteri_Impl;
    PFNGLCONVOLUTIONPARAMETERIVPROC glConvolutionParameteriv_Impl;
    PFNGLCOPYCONVOLUTIONFILTER1DPROC glCopyConvolutionFilter1D_Impl;
    PFNGLCOPYCONVOLUTIONFILTER2DPROC glCopyConvolutionFilter2D_Impl;
    PFNGLGETCONVOLUTIONFILTERPROC glGetConvolutionFilter_Impl;
    PFNGLGETCONVOLUTIONPARAMETERFVPROC glGetConvolutionParameterfv_Impl;
    PFNGLGETCONVOLUTIONPARAMETERIVPROC glGetConvolutionParameteriv_Impl;
    PFNGLGETSEPARABLEFILTERPROC glGetSeparableFilter_Impl;
    PFNGLSEPARABLEFILTER2DPROC glSeparableFilter2D_Impl;
    PFNGLGETHISTOGRAMPROC glGetHistogram_Impl;
    PFNGLGETHISTOGRAMPARAMETERFVPROC glGetHistogramParameterfv_Impl;
    PFNGLGETHISTOGRAMPARAMETERIVPROC glGetHistogramParameteriv_Impl;
    PFNGLGETMINMAXPROC glGetMinmax_Impl;
    PFNGLGETMINMAXPARAMETERFVPROC glGetMinmaxParameterfv_Impl;
    PFNGLGETMINMAXPARAMETERIVPROC glGetMinmaxParameteriv_Impl;
    PFNGLHISTOGRAMPROC glHistogram_Impl;
    PFNGLMINMAXPROC glMinmax_Impl;
    PFNGLRESETHISTOGRAMPROC glResetHistogram_Impl;
    PFNGLRESETMINMAXPROC glResetMinmax_Impl;
    */
  
    // GL_VERSION_1_3
    PFNGLACTIVETEXTUREPROC glActiveTexture_Impl;
    PFNGLCLIENTACTIVETEXTUREPROC glClientActiveTexture_Impl;
    PFNGLCOMPRESSEDTEXIMAGE1DPROC glCompressedTexImage1D_Impl;
    PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D_Impl;
    PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D_Impl;
    PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glCompressedTexSubImage1D_Impl;
    PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D_Impl;
    PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D_Impl;
    PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage_Impl;
    PFNGLLOADTRANSPOSEMATRIXDPROC glLoadTransposeMatrixd_Impl;
    PFNGLLOADTRANSPOSEMATRIXFPROC glLoadTransposeMatrixf_Impl;
    PFNGLMULTTRANSPOSEMATRIXDPROC glMultTransposeMatrixd_Impl;
    PFNGLMULTTRANSPOSEMATRIXFPROC glMultTransposeMatrixf_Impl;
    PFNGLMULTITEXCOORD1DPROC glMultiTexCoord1d_Impl;
    PFNGLMULTITEXCOORD1DVPROC glMultiTexCoord1dv_Impl;
    PFNGLMULTITEXCOORD1FPROC glMultiTexCoord1f_Impl;
    PFNGLMULTITEXCOORD1FVPROC glMultiTexCoord1fv_Impl;
    PFNGLMULTITEXCOORD1IPROC glMultiTexCoord1i_Impl;
    PFNGLMULTITEXCOORD1IVPROC glMultiTexCoord1iv_Impl;
    PFNGLMULTITEXCOORD1SPROC glMultiTexCoord1s_Impl;
    PFNGLMULTITEXCOORD1SVPROC glMultiTexCoord1sv_Impl;
    PFNGLMULTITEXCOORD2DPROC glMultiTexCoord2d_Impl;
    PFNGLMULTITEXCOORD2DVPROC glMultiTexCoord2dv_Impl;
    PFNGLMULTITEXCOORD2FPROC glMultiTexCoord2f_Impl;
    PFNGLMULTITEXCOORD2FVPROC glMultiTexCoord2fv_Impl;
    PFNGLMULTITEXCOORD2IPROC glMultiTexCoord2i_Impl;
    PFNGLMULTITEXCOORD2IVPROC glMultiTexCoord2iv_Impl;
    PFNGLMULTITEXCOORD2SPROC glMultiTexCoord2s_Impl;
    PFNGLMULTITEXCOORD2SVPROC glMultiTexCoord2sv_Impl;
    PFNGLMULTITEXCOORD3DPROC glMultiTexCoord3d_Impl;
    PFNGLMULTITEXCOORD3DVPROC glMultiTexCoord3dv_Impl;
    PFNGLMULTITEXCOORD3FPROC glMultiTexCoord3f_Impl;
    PFNGLMULTITEXCOORD3FVPROC glMultiTexCoord3fv_Impl;
    PFNGLMULTITEXCOORD3IPROC glMultiTexCoord3i_Impl;
    PFNGLMULTITEXCOORD3IVPROC glMultiTexCoord3iv_Impl;
    PFNGLMULTITEXCOORD3SPROC glMultiTexCoord3s_Impl;
    PFNGLMULTITEXCOORD3SVPROC glMultiTexCoord3sv_Impl;
    PFNGLMULTITEXCOORD4DPROC glMultiTexCoord4d_Impl;
    PFNGLMULTITEXCOORD4DVPROC glMultiTexCoord4dv_Impl;
    PFNGLMULTITEXCOORD4FPROC glMultiTexCoord4f_Impl;
    PFNGLMULTITEXCOORD4FVPROC glMultiTexCoord4fv_Impl;
    PFNGLMULTITEXCOORD4IPROC glMultiTexCoord4i_Impl;
    PFNGLMULTITEXCOORD4IVPROC glMultiTexCoord4iv_Impl;
    PFNGLMULTITEXCOORD4SPROC glMultiTexCoord4s_Impl;
    PFNGLMULTITEXCOORD4SVPROC glMultiTexCoord4sv_Impl;
    PFNGLSAMPLECOVERAGEPROC glSampleCoverage_Impl;
  
    // GL_VERSION_1_4
    PFNGLBLENDCOLORPROC glBlendColor_Impl;
    PFNGLBLENDEQUATIONPROC glBlendEquation_Impl;
    PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate_Impl;
    PFNGLFOGCOORDPOINTERPROC glFogCoordPointer_Impl;
    PFNGLFOGCOORDDPROC glFogCoordd_Impl;
    PFNGLFOGCOORDDVPROC glFogCoorddv_Impl;
    PFNGLFOGCOORDFPROC glFogCoordf_Impl;
    PFNGLFOGCOORDFVPROC glFogCoordfv_Impl;
    PFNGLMULTIDRAWARRAYSPROC glMultiDrawArrays_Impl;
    PFNGLMULTIDRAWELEMENTSPROC glMultiDrawElements_Impl;
    PFNGLPOINTPARAMETERFPROC glPointParameterf_Impl;
    PFNGLPOINTPARAMETERFVPROC glPointParameterfv_Impl;
    PFNGLPOINTPARAMETERIPROC glPointParameteri_Impl;
    PFNGLPOINTPARAMETERIVPROC glPointParameteriv_Impl;
    PFNGLSECONDARYCOLOR3BPROC glSecondaryColor3b_Impl;
    PFNGLSECONDARYCOLOR3BVPROC glSecondaryColor3bv_Impl;
    PFNGLSECONDARYCOLOR3DPROC glSecondaryColor3d_Impl;
    PFNGLSECONDARYCOLOR3DVPROC glSecondaryColor3dv_Impl;
    PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f_Impl;
    PFNGLSECONDARYCOLOR3FVPROC glSecondaryColor3fv_Impl;
    PFNGLSECONDARYCOLOR3IPROC glSecondaryColor3i_Impl;
    PFNGLSECONDARYCOLOR3IVPROC glSecondaryColor3iv_Impl;
    PFNGLSECONDARYCOLOR3SPROC glSecondaryColor3s_Impl;
    PFNGLSECONDARYCOLOR3SVPROC glSecondaryColor3sv_Impl;
    PFNGLSECONDARYCOLOR3UBPROC glSecondaryColor3ub_Impl;
    PFNGLSECONDARYCOLOR3UBVPROC glSecondaryColor3ubv_Impl;
    PFNGLSECONDARYCOLOR3UIPROC glSecondaryColor3ui_Impl;
    PFNGLSECONDARYCOLOR3UIVPROC glSecondaryColor3uiv_Impl;
    PFNGLSECONDARYCOLOR3USPROC glSecondaryColor3us_Impl;
    PFNGLSECONDARYCOLOR3USVPROC glSecondaryColor3usv_Impl;
    PFNGLSECONDARYCOLORPOINTERPROC glSecondaryColorPointer_Impl;
    PFNGLWINDOWPOS2DPROC glWindowPos2d_Impl;
    PFNGLWINDOWPOS2DVPROC glWindowPos2dv_Impl;
    PFNGLWINDOWPOS2FPROC glWindowPos2f_Impl;
    PFNGLWINDOWPOS2FVPROC glWindowPos2fv_Impl;
    PFNGLWINDOWPOS2IPROC glWindowPos2i_Impl;
    PFNGLWINDOWPOS2IVPROC glWindowPos2iv_Impl;
    PFNGLWINDOWPOS2SPROC glWindowPos2s_Impl;
    PFNGLWINDOWPOS2SVPROC glWindowPos2sv_Impl;
    PFNGLWINDOWPOS3DPROC glWindowPos3d_Impl;
    PFNGLWINDOWPOS3DVPROC glWindowPos3dv_Impl;
    PFNGLWINDOWPOS3FPROC glWindowPos3f_Impl;
    PFNGLWINDOWPOS3FVPROC glWindowPos3fv_Impl;
    PFNGLWINDOWPOS3IPROC glWindowPos3i_Impl;
    PFNGLWINDOWPOS3IVPROC glWindowPos3iv_Impl;
    PFNGLWINDOWPOS3SPROC glWindowPos3s_Impl;
    PFNGLWINDOWPOS3SVPROC glWindowPos3sv_Impl;
  
    // GL_VERSION_1_5
    PFNGLBEGINQUERYPROC glBeginQuery_Impl;
    PFNGLBINDBUFFERPROC glBindBuffer_Impl;
    PFNGLBUFFERDATAPROC glBufferData_Impl;
    PFNGLBUFFERSUBDATAPROC glBufferSubData_Impl;
    PFNGLDELETEBUFFERSPROC glDeleteBuffers_Impl;
    PFNGLDELETEQUERIESPROC glDeleteQueries_Impl;
    PFNGLENDQUERYPROC glEndQuery_Impl;
    PFNGLGENBUFFERSPROC glGenBuffers_Impl;
    PFNGLGENQUERIESPROC glGenQueries_Impl;
    PFNGLGETBUFFERPARAMETERIVPROC glGetBufferParameteriv_Impl;
    PFNGLGETBUFFERPOINTERVPROC glGetBufferPointerv_Impl;
    PFNGLGETBUFFERSUBDATAPROC glGetBufferSubData_Impl;
    PFNGLGETQUERYOBJECTIVPROC glGetQueryObjectiv_Impl;
    PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv_Impl;
    PFNGLGETQUERYIVPROC glGetQueryiv_Impl;
    PFNGLISBUFFERPROC glIsBuffer_Impl;
    PFNGLISQUERYPROC glIsQuery_Impl;
    PFNGLMAPBUFFERPROC glMapBuffer_Impl;
    PFNGLUNMAPBUFFERPROC glUnmapBuffer_Impl;
  
    // GL_VERSION_2_0
    PFNGLATTACHSHADERPROC glAttachShader_Impl;
    PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation_Impl;
    PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate_Impl;
    PFNGLCOMPILESHADERPROC glCompileShader_Impl;
    PFNGLCREATEPROGRAMPROC glCreateProgram_Impl;
    PFNGLCREATESHADERPROC glCreateShader_Impl;
    PFNGLDELETEPROGRAMPROC glDeleteProgram_Impl;
    PFNGLDELETESHADERPROC glDeleteShader_Impl;
    PFNGLDETACHSHADERPROC glDetachShader_Impl;
    PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray_Impl;
    PFNGLDRAWBUFFERSPROC glDrawBuffers_Impl;
    PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray_Impl;
    PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib_Impl;
    PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform_Impl;
    PFNGLGETATTACHEDSHADERSPROC glGetAttachedShaders_Impl;
    PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation_Impl;
    PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog_Impl;
    PFNGLGETPROGRAMIVPROC glGetProgramiv_Impl;
    PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog_Impl;
    PFNGLGETSHADERSOURCEPROC glGetShaderSource_Impl;
    PFNGLGETSHADERIVPROC glGetShaderiv_Impl;
    PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation_Impl;
    PFNGLGETUNIFORMFVPROC glGetUniformfv_Impl;
    PFNGLGETUNIFORMIVPROC glGetUniformiv_Impl;
    PFNGLGETVERTEXATTRIBPOINTERVPROC glGetVertexAttribPointerv_Impl;
    PFNGLGETVERTEXATTRIBDVPROC glGetVertexAttribdv_Impl;
    PFNGLGETVERTEXATTRIBFVPROC glGetVertexAttribfv_Impl;
    PFNGLGETVERTEXATTRIBIVPROC glGetVertexAttribiv_Impl;
    PFNGLISPROGRAMPROC glIsProgram_Impl;
    PFNGLISSHADERPROC glIsShader_Impl;
    PFNGLLINKPROGRAMPROC glLinkProgram_Impl;
    PFNGLSHADERSOURCEPROC glShaderSource_Impl;
    PFNGLSTENCILFUNCSEPARATEPROC glStencilFuncSeparate_Impl;
    PFNGLSTENCILMASKSEPARATEPROC glStencilMaskSeparate_Impl;
    PFNGLSTENCILOPSEPARATEPROC glStencilOpSeparate_Impl;
    PFNGLUNIFORM1FPROC glUniform1f_Impl;
    PFNGLUNIFORM1FVPROC glUniform1fv_Impl;
    PFNGLUNIFORM1IPROC glUniform1i_Impl;
    PFNGLUNIFORM1IVPROC glUniform1iv_Impl;
    PFNGLUNIFORM2FPROC glUniform2f_Impl;
    PFNGLUNIFORM2FVPROC glUniform2fv_Impl;
    PFNGLUNIFORM2IPROC glUniform2i_Impl;
    PFNGLUNIFORM2IVPROC glUniform2iv_Impl;
    PFNGLUNIFORM3FPROC glUniform3f_Impl;
    PFNGLUNIFORM3FVPROC glUniform3fv_Impl;
    PFNGLUNIFORM3IPROC glUniform3i_Impl;
    PFNGLUNIFORM3IVPROC glUniform3iv_Impl;
    PFNGLUNIFORM4FPROC glUniform4f_Impl;
    PFNGLUNIFORM4FVPROC glUniform4fv_Impl;
    PFNGLUNIFORM4IPROC glUniform4i_Impl;
    PFNGLUNIFORM4IVPROC glUniform4iv_Impl;
    PFNGLUNIFORMMATRIX2FVPROC glUniformMatrix2fv_Impl;
    PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv_Impl;
    PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv_Impl;
    PFNGLUSEPROGRAMPROC glUseProgram_Impl;
    PFNGLVALIDATEPROGRAMPROC glValidateProgram_Impl;
    PFNGLVERTEXATTRIB1DPROC glVertexAttrib1d_Impl;
    PFNGLVERTEXATTRIB1DVPROC glVertexAttrib1dv_Impl;
    PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f_Impl;
    PFNGLVERTEXATTRIB1FVPROC glVertexAttrib1fv_Impl;
    PFNGLVERTEXATTRIB1SPROC glVertexAttrib1s_Impl;
    PFNGLVERTEXATTRIB1SVPROC glVertexAttrib1sv_Impl;
    PFNGLVERTEXATTRIB2DPROC glVertexAttrib2d_Impl;
    PFNGLVERTEXATTRIB2DVPROC glVertexAttrib2dv_Impl;
    PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f_Impl;
    PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv_Impl;
    PFNGLVERTEXATTRIB2SPROC glVertexAttrib2s_Impl;
    PFNGLVERTEXATTRIB2SVPROC glVertexAttrib2sv_Impl;
    PFNGLVERTEXATTRIB3DPROC glVertexAttrib3d_Impl;
    PFNGLVERTEXATTRIB3DVPROC glVertexAttrib3dv_Impl;
    PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f_Impl;
    PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv_Impl;
    PFNGLVERTEXATTRIB3SPROC glVertexAttrib3s_Impl;
    PFNGLVERTEXATTRIB3SVPROC glVertexAttrib3sv_Impl;
    PFNGLVERTEXATTRIB4NBVPROC glVertexAttrib4Nbv_Impl;
    PFNGLVERTEXATTRIB4NIVPROC glVertexAttrib4Niv_Impl;
    PFNGLVERTEXATTRIB4NSVPROC glVertexAttrib4Nsv_Impl;
    PFNGLVERTEXATTRIB4NUBPROC glVertexAttrib4Nub_Impl;
    PFNGLVERTEXATTRIB4NUBVPROC glVertexAttrib4Nubv_Impl;
    PFNGLVERTEXATTRIB4NUIVPROC glVertexAttrib4Nuiv_Impl;
    PFNGLVERTEXATTRIB4NUSVPROC glVertexAttrib4Nusv_Impl;
    PFNGLVERTEXATTRIB4BVPROC glVertexAttrib4bv_Impl;
    PFNGLVERTEXATTRIB4DPROC glVertexAttrib4d_Impl;
    PFNGLVERTEXATTRIB4DVPROC glVertexAttrib4dv_Impl;
    PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f_Impl;
    PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv_Impl;
    PFNGLVERTEXATTRIB4IVPROC glVertexAttrib4iv_Impl;
    PFNGLVERTEXATTRIB4SPROC glVertexAttrib4s_Impl;
    PFNGLVERTEXATTRIB4SVPROC glVertexAttrib4sv_Impl;
    PFNGLVERTEXATTRIB4UBVPROC glVertexAttrib4ubv_Impl;
    PFNGLVERTEXATTRIB4UIVPROC glVertexAttrib4uiv_Impl;
    PFNGLVERTEXATTRIB4USVPROC glVertexAttrib4usv_Impl;
    PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer_Impl;
  
    // GL_VERSION_2_1
    PFNGLUNIFORMMATRIX2X3FVPROC glUniformMatrix2x3fv_Impl;
    PFNGLUNIFORMMATRIX2X4FVPROC glUniformMatrix2x4fv_Impl;
    PFNGLUNIFORMMATRIX3X2FVPROC glUniformMatrix3x2fv_Impl;
    PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv_Impl;
    PFNGLUNIFORMMATRIX4X2FVPROC glUniformMatrix4x2fv_Impl;
    PFNGLUNIFORMMATRIX4X3FVPROC glUniformMatrix4x3fv_Impl;
  
    // GL_VERSION_3_0
    PFNGLBEGINCONDITIONALRENDERPROC glBeginConditionalRender_Impl;
    PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback_Impl;
    PFNGLBINDFRAGDATALOCATIONPROC glBindFragDataLocation_Impl;
    PFNGLCLAMPCOLORPROC glClampColor_Impl;
    PFNGLCLEARBUFFERFIPROC glClearBufferfi_Impl;
    PFNGLCLEARBUFFERFVPROC glClearBufferfv_Impl;
    PFNGLCLEARBUFFERIVPROC glClearBufferiv_Impl;
    PFNGLCLEARBUFFERUIVPROC glClearBufferuiv_Impl;
    PFNGLCOLORMASKIPROC glColorMaski_Impl;
    PFNGLDISABLEIPROC glDisablei_Impl;
    PFNGLENABLEIPROC glEnablei_Impl;
    PFNGLENDCONDITIONALRENDERPROC glEndConditionalRender_Impl;
    PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback_Impl;
    PFNGLBINDBUFFERRANGEPROC glBindBufferRange_Impl;
    PFNGLBINDBUFFERBASEPROC glBindBufferBase_Impl;
    PFNGLGETBOOLEANI_VPROC glGetBooleani_v_Impl;
    PFNGLGETINTEGERI_VPROC glGetIntegeri_v_Impl;
    PFNGLGETFRAGDATALOCATIONPROC glGetFragDataLocation_Impl;
    PFNGLGETSTRINGIPROC glGetStringi_Impl;
    PFNGLGETTEXPARAMETERIIVPROC glGetTexParameterIiv_Impl;
    PFNGLGETTEXPARAMETERIUIVPROC glGetTexParameterIuiv_Impl;
    PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glGetTransformFeedbackVarying_Impl;
    PFNGLGETUNIFORMUIVPROC glGetUniformuiv_Impl;
    PFNGLGETVERTEXATTRIBIIVPROC glGetVertexAttribIiv_Impl;
    PFNGLGETVERTEXATTRIBIUIVPROC glGetVertexAttribIuiv_Impl;
    PFNGLISENABLEDIPROC glIsEnabledi_Impl;
    PFNGLTEXPARAMETERIIVPROC glTexParameterIiv_Impl;
    PFNGLTEXPARAMETERIUIVPROC glTexParameterIuiv_Impl;
    PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings_Impl;
    PFNGLUNIFORM1UIPROC glUniform1ui_Impl;
    PFNGLUNIFORM1UIVPROC glUniform1uiv_Impl;
    PFNGLUNIFORM2UIPROC glUniform2ui_Impl;
    PFNGLUNIFORM2UIVPROC glUniform2uiv_Impl;
    PFNGLUNIFORM3UIPROC glUniform3ui_Impl;
    PFNGLUNIFORM3UIVPROC glUniform3uiv_Impl;
    PFNGLUNIFORM4UIPROC glUniform4ui_Impl;
    PFNGLUNIFORM4UIVPROC glUniform4uiv_Impl;
    PFNGLVERTEXATTRIBI1IPROC glVertexAttribI1i_Impl;
    PFNGLVERTEXATTRIBI1IVPROC glVertexAttribI1iv_Impl;
    PFNGLVERTEXATTRIBI1UIPROC glVertexAttribI1ui_Impl;
    PFNGLVERTEXATTRIBI1UIVPROC glVertexAttribI1uiv_Impl;
    PFNGLVERTEXATTRIBI2IPROC glVertexAttribI2i_Impl;
    PFNGLVERTEXATTRIBI2IVPROC glVertexAttribI2iv_Impl;
    PFNGLVERTEXATTRIBI2UIPROC glVertexAttribI2ui_Impl;
    PFNGLVERTEXATTRIBI2UIVPROC glVertexAttribI2uiv_Impl;
    PFNGLVERTEXATTRIBI3IPROC glVertexAttribI3i_Impl;
    PFNGLVERTEXATTRIBI3IVPROC glVertexAttribI3iv_Impl;
    PFNGLVERTEXATTRIBI3UIPROC glVertexAttribI3ui_Impl;
    PFNGLVERTEXATTRIBI3UIVPROC glVertexAttribI3uiv_Impl;
    PFNGLVERTEXATTRIBI4BVPROC glVertexAttribI4bv_Impl;
    PFNGLVERTEXATTRIBI4IPROC glVertexAttribI4i_Impl;
    PFNGLVERTEXATTRIBI4IVPROC glVertexAttribI4iv_Impl;
    PFNGLVERTEXATTRIBI4SVPROC glVertexAttribI4sv_Impl;
    PFNGLVERTEXATTRIBI4UBVPROC glVertexAttribI4ubv_Impl;
    PFNGLVERTEXATTRIBI4UIPROC glVertexAttribI4ui_Impl;
    PFNGLVERTEXATTRIBI4UIVPROC glVertexAttribI4uiv_Impl;
    PFNGLVERTEXATTRIBI4USVPROC glVertexAttribI4usv_Impl;
    PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer_Impl;
  
    // GL_VERSION_3_1
    PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced_Impl;
    PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced_Impl;
    PFNGLPRIMITIVERESTARTINDEXPROC glPrimitiveRestartIndex_Impl;
    PFNGLTEXBUFFERPROC glTexBuffer_Impl;
  
    // GL_VERSION_3_2
    PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture_Impl;
    PFNGLGETBUFFERPARAMETERI64VPROC glGetBufferParameteri64v_Impl;
    PFNGLGETINTEGER64I_VPROC glGetInteger64i_v_Impl;
  
    // GL_VERSION_3_3
    PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor_Impl;
  
    // GL_VERSION_4_0
    PFNGLBLENDEQUATIONSEPARATEIPROC glBlendEquationSeparatei_Impl;
    PFNGLBLENDEQUATIONIPROC glBlendEquationi_Impl;
    PFNGLBLENDFUNCSEPARATEIPROC glBlendFuncSeparatei_Impl;
    PFNGLBLENDFUNCIPROC glBlendFunci_Impl;
    PFNGLMINSAMPLESHADINGPROC glMinSampleShading_Impl;
  
    // GL_VERSION_4_2
    PFNGLMEMORYBARRIER glMemoryBarrier_Impl;
  
    // GL_VERSION_4_3
    PFNGLDISPATCHCOMPUTEPROC glDispatchCompute_Impl;
    PFNGLBINDIMAGETEXTUREPROC glBindImageTexture_Impl;
  
    // GL_AMD_debug_output
    PFNGLDEBUGMESSAGECALLBACKAMDPROC glDebugMessageCallbackAMD_Impl;
    PFNGLDEBUGMESSAGEENABLEAMDPROC glDebugMessageEnableAMD_Impl;
    PFNGLDEBUGMESSAGEINSERTAMDPROC glDebugMessageInsertAMD_Impl;
    PFNGLGETDEBUGMESSAGELOGAMDPROC glGetDebugMessageLogAMD_Impl;
  
  #if defined(GLE_CGL_ENABLED)
    // GL_APPLE_aux_depth_stencil
    // (no functions)
  
    // GL_APPLE_client_storage
    // (no functions)
  
    // GL_APPLE_element_array
    PFNGLDRAWELEMENTARRAYAPPLEPROC glDrawElementArrayAPPLE_Impl;
    PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC glDrawRangeElementArrayAPPLE_Impl;
    PFNGLELEMENTPOINTERAPPLEPROC glElementPointerAPPLE_Impl;
    PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC glMultiDrawElementArrayAPPLE_Impl;
    PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC glMultiDrawRangeElementArrayAPPLE_Impl;
  
    // GL_APPLE_fence
    PFNGLDELETEFENCESAPPLEPROC glDeleteFencesAPPLE_Impl;
    PFNGLFINISHFENCEAPPLEPROC glFinishFenceAPPLE_Impl;
    PFNGLFINISHOBJECTAPPLEPROC glFinishObjectAPPLE_Impl;
    PFNGLGENFENCESAPPLEPROC glGenFencesAPPLE_Impl;
    PFNGLISFENCEAPPLEPROC glIsFenceAPPLE_Impl;
    PFNGLSETFENCEAPPLEPROC glSetFenceAPPLE_Impl;
    PFNGLTESTFENCEAPPLEPROC glTestFenceAPPLE_Impl;
    PFNGLTESTOBJECTAPPLEPROC glTestObjectAPPLE_Impl;
  
    // GL_APPLE_float_pixels
    // (no functions)
  
    // GL_APPLE_flush_buffer_range
    PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE_Impl;
    PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE_Impl;
  
    // GL_APPLE_object_purgeable
    PFNGLGETOBJECTPARAMETERIVAPPLEPROC glGetObjectParameterivAPPLE_Impl;
    PFNGLOBJECTPURGEABLEAPPLEPROC glObjectPurgeableAPPLE_Impl;
    PFNGLOBJECTUNPURGEABLEAPPLEPROC glObjectUnpurgeableAPPLE_Impl;
  
    // GL_APPLE_pixel_buffer
    // (no functions)
  
    // GL_APPLE_rgb_422
    // (no functions)
  
    // GL_APPLE_row_bytes
    // (no functions)
  
    // GL_APPLE_specular_vector
    // (no functions)
  
    // GL_APPLE_texture_range
    PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC glGetTexParameterPointervAPPLE_Impl;
    PFNGLTEXTURERANGEAPPLEPROC glTextureRangeAPPLE_Impl;
  
    // GL_APPLE_transform_hint
    // (no functions)
  
    // GL_APPLE_vertex_array_object
    PFNGLBINDVERTEXARRAYAPPLEPROC glBindVertexArrayAPPLE_Impl;
    PFNGLDELETEVERTEXARRAYSAPPLEPROC glDeleteVertexArraysAPPLE_Impl;
    PFNGLGENVERTEXARRAYSAPPLEPROC glGenVertexArraysAPPLE_Impl;
    PFNGLISVERTEXARRAYAPPLEPROC glIsVertexArrayAPPLE_Impl;
  
    // GL_APPLE_vertex_array_range
    PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC glFlushVertexArrayRangeAPPLE_Impl;
    PFNGLVERTEXARRAYPARAMETERIAPPLEPROC glVertexArrayParameteriAPPLE_Impl;
    PFNGLVERTEXARRAYRANGEAPPLEPROC glVertexArrayRangeAPPLE_Impl;
  
    // GL_APPLE_vertex_program_evaluators
    PFNGLDISABLEVERTEXATTRIBAPPLEPROC glDisableVertexAttribAPPLE_Impl;
    PFNGLENABLEVERTEXATTRIBAPPLEPROC glEnableVertexAttribAPPLE_Impl;
    PFNGLISVERTEXATTRIBENABLEDAPPLEPROC glIsVertexAttribEnabledAPPLE_Impl;
    PFNGLMAPVERTEXATTRIB1DAPPLEPROC glMapVertexAttrib1dAPPLE_Impl;
    PFNGLMAPVERTEXATTRIB1FAPPLEPROC glMapVertexAttrib1fAPPLE_Impl;
    PFNGLMAPVERTEXATTRIB2DAPPLEPROC glMapVertexAttrib2dAPPLE_Impl;
    PFNGLMAPVERTEXATTRIB2FAPPLEPROC glMapVertexAttrib2fAPPLE_Impl;
  #endif // GLE_CGL_ENABLED
  
    // GL_ARB_copy_buffer
    PFNGLCOPYBUFFERSUBDATAPROC glCopyBufferSubData_Impl;
  
    // GL_ARB_debug_output
    PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB_Impl;
    PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB_Impl;
    PFNGLDEBUGMESSAGEINSERTARBPROC glDebugMessageInsertARB_Impl;
    PFNGLGETDEBUGMESSAGELOGARBPROC glGetDebugMessageLogARB_Impl;
  
    // GL_ARB_ES2_compatibility
    PFNGLCLEARDEPTHFPROC glClearDepthf_Impl;
    PFNGLDEPTHRANGEFPROC glDepthRangef_Impl;
    PFNGLGETSHADERPRECISIONFORMATPROC glGetShaderPrecisionFormat_Impl;
    PFNGLRELEASESHADERCOMPILERPROC glReleaseShaderCompiler_Impl;
    PFNGLSHADERBINARYPROC glShaderBinary_Impl;
  
    // GL_ARB_framebuffer_object
    PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer_Impl;
    PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer_Impl;
    PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer_Impl;
    PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus_Impl;
    PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers_Impl;
    PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers_Impl;
    PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer_Impl;
    PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D_Impl;
    PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D_Impl;
    PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D_Impl;
    PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer_Impl;
    PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers_Impl;
    PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers_Impl;
    PFNGLGENERATEMIPMAPPROC glGenerateMipmap_Impl;
    PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv_Impl;
    PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv_Impl;
    PFNGLISFRAMEBUFFERPROC glIsFramebuffer_Impl;
    PFNGLISRENDERBUFFERPROC glIsRenderbuffer_Impl;
    PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage_Impl;
    PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample_Impl;
  
    // GL_ARB_framebuffer_sRGB
    // (no functions)
  
    // GL_ARB_texture_multisample
    PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv_Impl;
    PFNGLSAMPLEMASKIPROC glSampleMaski_Impl;
    PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample_Impl;
    PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample_Impl;
  
    // GL_ARB_texture_non_power_of_two
    // (no functions)
  
    // GL_ARB_texture_rectangle
    // (no functions)
  
    // GL_ARB_texture_storage
    PFNGLTEXSTORAGE1DPROC glTexStorage1D_Impl;
    PFNGLTEXSTORAGE2DPROC glTexStorage2D_Impl;
    PFNGLTEXSTORAGE3DPROC glTexStorage3D_Impl;
    PFNGLTEXTURESTORAGE1DEXTPROC glTextureStorage1DEXT_Impl;
    PFNGLTEXTURESTORAGE2DEXTPROC glTextureStorage2DEXT_Impl;
    PFNGLTEXTURESTORAGE3DEXTPROC glTextureStorage3DEXT_Impl;
  
    // GL_ARB_texture_storage_multisample
    PFNGLTEXSTORAGE2DMULTISAMPLEPROC glTexStorage2DMultisample_Impl;
    PFNGLTEXSTORAGE3DMULTISAMPLEPROC glTexStorage3DMultisample_Impl;
    PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC glTextureStorage2DMultisampleEXT_Impl;
    PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC glTextureStorage3DMultisampleEXT_Impl;
  
    // GL_ARB_timer_query
    PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v_Impl;
    PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v_Impl;
    PFNGLQUERYCOUNTERPROC glQueryCounter_Impl;
  
    // GL_ARB_vertex_array_object
    PFNGLBINDVERTEXARRAYPROC glBindVertexArray_Impl;
    PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays_Impl;
    PFNGLGENVERTEXARRAYSPROC glGenVertexArrays_Impl;
    PFNGLISVERTEXARRAYPROC glIsVertexArray_Impl;
  
    // GL_EXT_draw_buffers2
    PFNGLCOLORMASKINDEXEDEXTPROC glColorMaskIndexedEXT_Impl;
    PFNGLDISABLEINDEXEDEXTPROC glDisableIndexedEXT_Impl;
    PFNGLENABLEINDEXEDEXTPROC glEnableIndexedEXT_Impl;
    PFNGLGETBOOLEANINDEXEDVEXTPROC glGetBooleanIndexedvEXT_Impl;
    PFNGLGETINTEGERINDEXEDVEXTPROC glGetIntegerIndexedvEXT_Impl;
    PFNGLISENABLEDINDEXEDEXTPROC glIsEnabledIndexedEXT_Impl;
  
    // GL_EXT_texture_filter_anisotropic
    // (no functions)
  
    // GL_KHR_debug
    PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback_Impl;
    PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl_Impl;
    PFNGLDEBUGMESSAGEINSERTPROC glDebugMessageInsert_Impl;
    PFNGLGETDEBUGMESSAGELOGPROC glGetDebugMessageLog_Impl;
    PFNGLGETOBJECTLABELPROC glGetObjectLabel_Impl;
    PFNGLGETOBJECTPTRLABELPROC glGetObjectPtrLabel_Impl;
    PFNGLOBJECTLABELPROC glObjectLabel_Impl;
    PFNGLOBJECTPTRLABELPROC glObjectPtrLabel_Impl;
    PFNGLPOPDEBUGGROUPPROC glPopDebugGroup_Impl;
    PFNGLPUSHDEBUGGROUPPROC glPushDebugGroup_Impl;
  
    // GL_KHR_robust_buffer_access_behavior
  
    // GL_WIN_swap_hint
    PFNGLADDSWAPHINTRECTWINPROC glAddSwapHintRectWIN_Impl;
  
  #if defined(GLE_WGL_ENABLED)
    // WGL
    // We don't declare pointers for these because we statically link to the implementations, same as
    // with the OpenGL 1.1 functions.
    // BOOL  wglCopyContext_Hook(HGLRC, HGLRC, UINT);
    // HGLRC wglCreateContext_Hook(HDC);
    // HGLRC wglCreateLayerContext_Hook(HDC, int);
    // BOOL  wglDeleteContext_Hook(HGLRC);
    // HGLRC wglGetCurrentContext_Hook(VOID);
    // HDC   wglGetCurrentDC_Hook(VOID);
    // PROC  wglGetProcAddress_Hook(LPCSTR);
    // BOOL  wglMakeCurrent_Hook(HDC, HGLRC);
    // BOOL  wglShareLists_Hook(HGLRC, HGLRC);
    // BOOL  wglUseFontBitmapsA_Hook(HDC, DWORD, DWORD, DWORD);
    // BOOL  wglUseFontBitmapsW_Hook(HDC, DWORD, DWORD, DWORD);
    // BOOL  wglUseFontOutlinesA_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int,
    // LPGLYPHMETRICSFLOAT); BOOL  wglUseFontOutlinesW_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT,
    // int, LPGLYPHMETRICSFLOAT); BOOL  wglDescribeLayerPlane_Hook(HDC, int, int, UINT,
    // LPLAYERPLANEDESCRIPTOR); int   wglSetLayerPaletteEntries_Hook(HDC, int, int, int, CONST
    // COLORREF *); int   wglGetLayerPaletteEntries_Hook(HDC, int, int, int, COLORREF *); BOOL
    // wglRealizeLayerPalette_Hook(HDC, int, BOOL); BOOL  wglSwapLayerBuffers_Hook(HDC, UINT); DWORD
    // wglSwapMultipleBuffers_Hook(UINT, CONST WGLSWAP *);
  
  #if 0
          PFNWGLCOPYCONTEXTPROC            wglCopyContext_Impl;
          PFNWGLCREATECONTEXTPROC          wglCreateContext_Impl;
          PFNWGLCREATELAYERCONTEXTPROC     wglCreateLayerContext_Impl;
          PFNWGLDELETECONTEXTPROC          wglDeleteContext_Impl;
          PFNWGLGETCURRENTCONTEXTPROC      wglGetCurrentContext_Impl;
          PFNWGLGETCURRENTDCPROC           wglGetCurrentDC_Impl;
          PFNWGLGETPROCADDRESSPROC         wglGetProcAddress_Impl;
          PFNWGLMAKECURRENTPROC            wglMakeCurrent_Impl;
          PFNWGLSHARELISTSPROC             wglShareLists_Impl;
          PFNWGLUSEFONTBITMAPSAPROC        wglUseFontBitmapsA_Impl;
          PFNWGLUSEFONTBITMAPSWPROC        wglUseFontBitmapsW_Impl;
          PFNWGLUSEFONTOUTLINESAPROC       wglUseFontOutlinesA_Impl;
          PFNWGLUSEFONTOUTLINESWPROC       wglUseFontOutlinesW_Impl;
          PFNWGLDESCRIBELAYERPLANEPROC     wglDescribeLayerPlane_Impl;
          PFNWGLSETLAYERPALETTEENTRIESPROC wglSetLayerPaletteEntries_Impl;
          PFNWGLGETLAYERPALETTEENTRIESPROC wglGetLayerPaletteEntries_Impl;
          PFNWGLREALIZELAYERPALETTEPROC    wglRealizeLayerPalette_Impl;
          PFNWGLSWAPLAYERBUFFERSPROC       wglSwapLayerBuffers_Impl;
          PFNWGLSWAPMULTIPLEBUFFERSPROC    wglSwapMultipleBuffers_Impl;
  #endif
  
    // WGL_ARB_buffer_region
    PFNWGLCREATEBUFFERREGIONARBPROC wglCreateBufferRegionARB_Impl;
    PFNWGLDELETEBUFFERREGIONARBPROC wglDeleteBufferRegionARB_Impl;
    PFNWGLSAVEBUFFERREGIONARBPROC wglSaveBufferRegionARB_Impl;
    PFNWGLRESTOREBUFFERREGIONARBPROC wglRestoreBufferRegionARB_Impl;
  
    // WGL_ARB_extensions_string
    PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB_Impl;
  
    // WGL_ARB_pixel_format
    PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB_Impl;
    PFNWGLGETPIXELFORMATATTRIBFVARBPROC wglGetPixelFormatAttribfvARB_Impl;
    PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB_Impl;
  
    // WGL_ARB_make_current_read
    PFNWGLMAKECONTEXTCURRENTARBPROC wglMakeContextCurrentARB_Impl;
    PFNWGLGETCURRENTREADDCARBPROC wglGetCurrentReadDCARB_Impl;
  
    // WGL_ARB_pbuffer
    PFNWGLCREATEPBUFFERARBPROC wglCreatePbufferARB_Impl;
    PFNWGLGETPBUFFERDCARBPROC wglGetPbufferDCARB_Impl;
    PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDCARB_Impl;
    PFNWGLDESTROYPBUFFERARBPROC wglDestroyPbufferARB_Impl;
    PFNWGLQUERYPBUFFERARBPROC wglQueryPbufferARB_Impl;
  
    // WGL_ARB_render_texture
    PFNWGLBINDTEXIMAGEARBPROC wglBindTexImageARB_Impl;
    PFNWGLRELEASETEXIMAGEARBPROC wglReleaseTexImageARB_Impl;
    PFNWGLSETPBUFFERATTRIBARBPROC wglSetPbufferAttribARB_Impl;
  
    // WGL_ARB_pixel_format_float
    // (no functions)
  
    // WGL_ARB_framebuffer_sRGB
    // (no functions)
  
    // WGL_NV_present_video
    PFNWGLENUMERATEVIDEODEVICESNVPROC wglEnumerateVideoDevicesNV_Impl;
    PFNWGLBINDVIDEODEVICENVPROC wglBindVideoDeviceNV_Impl;
    PFNWGLQUERYCURRENTCONTEXTNVPROC wglQueryCurrentContextNV_Impl;
  
    // WGL_ARB_create_context
    PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB_Impl;
  
    // WGL_ARB_create_context_profile
    // (no functions)
  
    // WGL_ARB_create_context_robustness
    // (no functions)
  
    // WGL_EXT_extensions_string
    PFNWGLGETEXTENSIONSSTRINGEXTPROC wglGetExtensionsStringEXT_Impl;
  
    // WGL_EXT_swap_control
    PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT_Impl;
    PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT_Impl;
  
    // WGL_OML_sync_control
    PFNWGLGETSYNCVALUESOMLPROC wglGetSyncValuesOML_Impl;
    PFNWGLGETMSCRATEOMLPROC wglGetMscRateOML_Impl;
    PFNWGLSWAPBUFFERSMSCOMLPROC wglSwapBuffersMscOML_Impl;
    PFNWGLSWAPLAYERBUFFERSMSCOMLPROC wglSwapLayerBuffersMscOML_Impl;
    PFNWGLWAITFORMSCOMLPROC wglWaitForMscOML_Impl;
    PFNWGLWAITFORSBCOMLPROC wglWaitForSbcOML_Impl;
  
    // WGL_NV_video_output
    PFNWGLGETVIDEODEVICENVPROC wglGetVideoDeviceNV_Impl;
    PFNWGLRELEASEVIDEODEVICENVPROC wglReleaseVideoDeviceNV_Impl;
    PFNWGLBINDVIDEOIMAGENVPROC wglBindVideoImageNV_Impl;
    PFNWGLRELEASEVIDEOIMAGENVPROC wglReleaseVideoImageNV_Impl;
    PFNWGLSENDPBUFFERTOVIDEONVPROC wglSendPbufferToVideoNV_Impl;
    PFNWGLGETVIDEOINFONVPROC wglGetVideoInfoNV_Impl;
  
    // WGL_NV_swap_group
    PFNWGLJOINSWAPGROUPNVPROC wglJoinSwapGroupNV_Impl;
    PFNWGLBINDSWAPBARRIERNVPROC wglBindSwapBarrierNV_Impl;
    PFNWGLQUERYSWAPGROUPNVPROC wglQuerySwapGroupNV_Impl;
    PFNWGLQUERYMAXSWAPGROUPSNVPROC wglQueryMaxSwapGroupsNV_Impl;
    PFNWGLQUERYFRAMECOUNTNVPROC wglQueryFrameCountNV_Impl;
    PFNWGLRESETFRAMECOUNTNVPROC wglResetFrameCountNV_Impl;
  
    // WGL_NV_video_capture
    PFNWGLBINDVIDEOCAPTUREDEVICENVPROC wglBindVideoCaptureDeviceNV_Impl;
    PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC wglEnumerateVideoCaptureDevicesNV_Impl;
    PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC wglLockVideoCaptureDeviceNV_Impl;
    PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC wglQueryVideoCaptureDeviceNV_Impl;
    PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC wglReleaseVideoCaptureDeviceNV_Impl;
  
    // WGL_NV_copy_image
    PFNWGLCOPYIMAGESUBDATANVPROC wglCopyImageSubDataNV_Impl;
  
    // WGL_NV_DX_interop
    PFNWGLDXCLOSEDEVICENVPROC wglDXCloseDeviceNV_Impl;
    PFNWGLDXLOCKOBJECTSNVPROC wglDXLockObjectsNV_Impl;
    PFNWGLDXOBJECTACCESSNVPROC wglDXObjectAccessNV_Impl;
    PFNWGLDXOPENDEVICENVPROC wglDXOpenDeviceNV_Impl;
    PFNWGLDXREGISTEROBJECTNVPROC wglDXRegisterObjectNV_Impl;
    PFNWGLDXSETRESOURCESHAREHANDLENVPROC wglDXSetResourceShareHandleNV_Impl;
    PFNWGLDXUNLOCKOBJECTSNVPROC wglDXUnlockObjectsNV_Impl;
    PFNWGLDXUNREGISTEROBJECTNVPROC wglDXUnregisterObjectNV_Impl;
  
  #endif // GLE_WGL_ENABLED
  
  #if defined(GLE_GLX_ENABLED)
    // GLX_VERSION_1_1
    // We don't create any pointers, because we assume these functions are always present.
  
    // GLX_VERSION_1_2
    PFNGLXGETCURRENTDISPLAYPROC glXGetCurrentDisplay_Impl;
  
    // GLX_VERSION_1_3
    PFNGLXCHOOSEFBCONFIGPROC glXChooseFBConfig_Impl;
    PFNGLXCREATENEWCONTEXTPROC glXCreateNewContext_Impl;
    PFNGLXCREATEPBUFFERPROC glXCreatePbuffer_Impl;
    PFNGLXCREATEPIXMAPPROC glXCreatePixmap_Impl;
    PFNGLXCREATEWINDOWPROC glXCreateWindow_Impl;
    PFNGLXDESTROYPBUFFERPROC glXDestroyPbuffer_Impl;
    PFNGLXDESTROYPIXMAPPROC glXDestroyPixmap_Impl;
    PFNGLXDESTROYWINDOWPROC glXDestroyWindow_Impl;
    PFNGLXGETCURRENTREADDRAWABLEPROC glXGetCurrentReadDrawable_Impl;
    PFNGLXGETFBCONFIGATTRIBPROC glXGetFBConfigAttrib_Impl;
    PFNGLXGETFBCONFIGSPROC glXGetFBConfigs_Impl;
    PFNGLXGETSELECTEDEVENTPROC glXGetSelectedEvent_Impl;
    PFNGLXGETVISUALFROMFBCONFIGPROC glXGetVisualFromFBConfig_Impl;
    PFNGLXMAKECONTEXTCURRENTPROC glXMakeContextCurrent_Impl;
    PFNGLXQUERYCONTEXTPROC glXQueryContext_Impl;
    PFNGLXQUERYDRAWABLEPROC glXQueryDrawable_Impl;
    PFNGLXSELECTEVENTPROC glXSelectEvent_Impl;
  
    // GLX_VERSION_1_4
    // Nothing to declare
  
    // GLX_ARB_create_context
    PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB_Impl;
  
    // GLX_EXT_swap_control
    PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT_Impl;
  
    // GLX_OML_sync_control
    PFNGLXGETMSCRATEOMLPROC glXGetMscRateOML_Impl;
    PFNGLXGETSYNCVALUESOMLPROC glXGetSyncValuesOML_Impl;
    PFNGLXSWAPBUFFERSMSCOMLPROC glXSwapBuffersMscOML_Impl;
    PFNGLXWAITFORMSCOMLPROC glXWaitForMscOML_Impl;
    PFNGLXWAITFORSBCOMLPROC glXWaitForSbcOML_Impl;
  
    // GLX_MESA_swap_control
    PFNGLXGETSWAPINTERVALMESAPROC glXGetSwapIntervalMESA_Impl;
    PFNGLXSWAPINTERVALMESAPROC glXSwapIntervalMESA_Impl;
  
  #endif // GLE_GLX_ENABLED
  
    // Boolean extension support indicators. Each of these identifies the
    // presence or absence of the given extension. A better solution here
    // might be to use an STL map<const char*, bool>.
    bool gle_AMD_debug_output;
    // bool gle_AMD_performance_monitor;
    bool gle_APPLE_aux_depth_stencil;
    bool gle_APPLE_client_storage;
    bool gle_APPLE_element_array;
    bool gle_APPLE_fence;
    bool gle_APPLE_float_pixels;
    bool gle_APPLE_flush_buffer_range;
    bool gle_APPLE_object_purgeable;
    bool gle_APPLE_pixel_buffer;
    bool gle_APPLE_rgb_422;
    bool gle_APPLE_row_bytes;
    bool gle_APPLE_specular_vector;
    bool gle_APPLE_texture_range;
    bool gle_APPLE_transform_hint;
    bool gle_APPLE_vertex_array_object;
    bool gle_APPLE_vertex_array_range;
    bool gle_APPLE_vertex_program_evaluators;
    bool gle_APPLE_ycbcr_422;
    bool gle_ARB_copy_buffer;
    bool gle_ARB_debug_output;
    bool gle_ARB_depth_buffer_float;
    // bool gle_ARB_direct_state_access;
    bool gle_ARB_ES2_compatibility;
    bool gle_ARB_framebuffer_object;
    bool gle_ARB_framebuffer_sRGB;
    bool gle_ARB_texture_multisample;
    bool gle_ARB_texture_non_power_of_two;
    bool gle_ARB_texture_rectangle;
    bool gle_ARB_texture_storage;
    bool gle_ARB_texture_storage_multisample;
    bool gle_ARB_timer_query;
    bool gle_ARB_vertex_array_object;
    // bool gle_ARB_vertex_attrib_binding;
    bool gle_EXT_draw_buffers2;
    bool gle_EXT_texture_compression_s3tc;
    bool gle_EXT_texture_filter_anisotropic;
    bool gle_EXT_texture_sRGB;
    // bool gle_KHR_context_flush_control;
    bool gle_KHR_debug;
    // bool gle_KHR_robust_buffer_access_behavior;
    // bool gle_KHR_robustness;
    bool gle_WIN_swap_hint;
  
  #if defined(GLE_WGL_ENABLED)
    bool gle_WGL_ARB_buffer_region;
    bool gle_WGL_ARB_create_context;
    bool gle_WGL_ARB_create_context_profile;
    bool gle_WGL_ARB_create_context_robustness;
    bool gle_WGL_ARB_extensions_string;
    bool gle_WGL_ARB_framebuffer_sRGB;
    bool gle_WGL_ARB_make_current_read;
    bool gle_WGL_ARB_pbuffer;
    bool gle_WGL_ARB_pixel_format;
    bool gle_WGL_ARB_pixel_format_float;
    bool gle_WGL_ARB_render_texture;
    bool gle_WGL_ATI_render_texture_rectangle;
    bool gle_WGL_EXT_extensions_string;
    bool gle_WGL_EXT_swap_control;
    bool gle_WGL_NV_copy_image;
    bool gle_WGL_NV_DX_interop;
    bool gle_WGL_NV_DX_interop2;
    bool gle_WGL_NV_present_video;
    bool gle_WGL_NV_render_texture_rectangle;
    bool gle_WGL_NV_swap_group;
    bool gle_WGL_NV_video_capture;
    bool gle_WGL_NV_video_output;
    bool gle_WGL_OML_sync_control;
  #elif defined(GLE_GLX_ENABLED)
    bool gle_GLX_ARB_create_context;
    bool gle_GLX_ARB_create_context_profile;
    bool gle_GLX_ARB_create_context_robustness;
    bool gle_GLX_EXT_swap_control;
    bool gle_GLX_OML_sync_control;
    bool gle_MESA_swap_control;
  #endif
  
  }; // class GLEContext
  
  } // namespace OVR
  
  #endif // OVR_CAPI_GLE_h
  