/**
 * @file llglheaders.h
 * @brief LLGL definitions
 *
 * $LicenseInfo:firstyear=2001&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */

#ifndef LL_LLGLHEADERS_H
#define LL_LLGLHEADERS_H

#if LL_MESA || LL_LINUX || __FreeBSD__
//----------------------------------------------------------------------------
// MESA headers
// quotes so we get libraries/.../GL/ version
#define GL_GLEXT_PROTOTYPES 1
#include "GL/gl.h"
#include "GL/glext.h"
#include "GL/glu.h"

// The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly
# define __APPLE__
# include "GL/glh_extensions.h"
# undef __APPLE__

#elif LL_LINUX
#define GL_GLEXT_PROTOTYPES
#define GLX_GLEXT_PROTOTYPES

#include "GL/gl.h"
#include "GL/glext.h"
#include "GL/glu.h"

// The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly
# define __APPLE__
# include "GL/glh_extensions.h"
# undef __APPLE__

# include "GL/glx.h"
# include "GL/glxext.h"

#elif LL_WINDOWS
//----------------------------------------------------------------------------
// LL_WINDOWS

// windows gl headers depend on things like APIENTRY, so include windows.
#include "llwin32headerslean.h"

//----------------------------------------------------------------------------
#include <GL/gl.h>
#include <GL/glu.h>

// quotes so we get libraries/.../GL/ version
#include "GL/glext.h"
#include "GL/glh_extensions.h"

// WGL_AMD_gpu_association
extern PFNWGLGETGPUIDSAMDPROC                          wglGetGPUIDsAMD;
extern PFNWGLGETGPUINFOAMDPROC                         wglGetGPUInfoAMD;
extern PFNWGLGETCONTEXTGPUIDAMDPROC                    wglGetContextGPUIDAMD;
extern PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC            wglCreateAssociatedContextAMD;
extern PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC     wglCreateAssociatedContextAttribsAMD;
extern PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC            wglDeleteAssociatedContextAMD;
extern PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC       wglMakeAssociatedContextCurrentAMD;
extern PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC        wglGetCurrentAssociatedContextAMD;
extern PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC             wglBlitContextFramebufferAMD;

// WGL_EXT_swap_control
extern PFNWGLSWAPINTERVALEXTPROC    wglSwapIntervalEXT;
extern PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT;

// WGL_ARB_create_context
extern PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB;

// GL_VERSION_1_3
extern PFNGLACTIVETEXTUREPROC               glActiveTexture;
extern PFNGLSAMPLECOVERAGEPROC              glSampleCoverage;
extern PFNGLCOMPRESSEDTEXIMAGE3DPROC        glCompressedTexImage3D;
extern PFNGLCOMPRESSEDTEXIMAGE2DPROC        glCompressedTexImage2D;
extern PFNGLCOMPRESSEDTEXIMAGE1DPROC        glCompressedTexImage1D;
extern PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC     glCompressedTexSubImage3D;
extern PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC     glCompressedTexSubImage2D;
extern PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC     glCompressedTexSubImage1D;
extern PFNGLGETCOMPRESSEDTEXIMAGEPROC       glGetCompressedTexImage;
extern PFNGLCLIENTACTIVETEXTUREPROC         glClientActiveTexture;
extern PFNGLMULTITEXCOORD1DPROC             glMultiTexCoord1d;
extern PFNGLMULTITEXCOORD1DVPROC            glMultiTexCoord1dv;
extern PFNGLMULTITEXCOORD1FPROC             glMultiTexCoord1f;
extern PFNGLMULTITEXCOORD1FVPROC            glMultiTexCoord1fv;
extern PFNGLMULTITEXCOORD1IPROC             glMultiTexCoord1i;
extern PFNGLMULTITEXCOORD1IVPROC            glMultiTexCoord1iv;
extern PFNGLMULTITEXCOORD1SPROC             glMultiTexCoord1s;
extern PFNGLMULTITEXCOORD1SVPROC            glMultiTexCoord1sv;
extern PFNGLMULTITEXCOORD2DPROC             glMultiTexCoord2d;
extern PFNGLMULTITEXCOORD2DVPROC            glMultiTexCoord2dv;
extern PFNGLMULTITEXCOORD2FPROC             glMultiTexCoord2f;
extern PFNGLMULTITEXCOORD2FVPROC            glMultiTexCoord2fv;
extern PFNGLMULTITEXCOORD2IPROC             glMultiTexCoord2i;
extern PFNGLMULTITEXCOORD2IVPROC            glMultiTexCoord2iv;
extern PFNGLMULTITEXCOORD2SPROC             glMultiTexCoord2s;
extern PFNGLMULTITEXCOORD2SVPROC            glMultiTexCoord2sv;
extern PFNGLMULTITEXCOORD3DPROC             glMultiTexCoord3d;
extern PFNGLMULTITEXCOORD3DVPROC            glMultiTexCoord3dv;
extern PFNGLMULTITEXCOORD3FPROC             glMultiTexCoord3f;
extern PFNGLMULTITEXCOORD3FVPROC            glMultiTexCoord3fv;
extern PFNGLMULTITEXCOORD3IPROC             glMultiTexCoord3i;
extern PFNGLMULTITEXCOORD3IVPROC            glMultiTexCoord3iv;
extern PFNGLMULTITEXCOORD3SPROC             glMultiTexCoord3s;
extern PFNGLMULTITEXCOORD3SVPROC            glMultiTexCoord3sv;
extern PFNGLMULTITEXCOORD4DPROC             glMultiTexCoord4d;
extern PFNGLMULTITEXCOORD4DVPROC            glMultiTexCoord4dv;
extern PFNGLMULTITEXCOORD4FPROC             glMultiTexCoord4f;
extern PFNGLMULTITEXCOORD4FVPROC            glMultiTexCoord4fv;
extern PFNGLMULTITEXCOORD4IPROC             glMultiTexCoord4i;
extern PFNGLMULTITEXCOORD4IVPROC            glMultiTexCoord4iv;
extern PFNGLMULTITEXCOORD4SPROC             glMultiTexCoord4s;
extern PFNGLMULTITEXCOORD4SVPROC            glMultiTexCoord4sv;
extern PFNGLLOADTRANSPOSEMATRIXFPROC        glLoadTransposeMatrixf;
extern PFNGLLOADTRANSPOSEMATRIXDPROC        glLoadTransposeMatrixd;
extern PFNGLMULTTRANSPOSEMATRIXFPROC        glMultTransposeMatrixf;
extern PFNGLMULTTRANSPOSEMATRIXDPROC        glMultTransposeMatrixd;

// GL_VERSION_1_4
extern PFNGLBLENDFUNCSEPARATEPROC       glBlendFuncSeparate;
extern PFNGLMULTIDRAWARRAYSPROC         glMultiDrawArrays;
extern PFNGLMULTIDRAWELEMENTSPROC       glMultiDrawElements;
extern PFNGLPOINTPARAMETERFPROC         glPointParameterf;
extern PFNGLPOINTPARAMETERFVPROC        glPointParameterfv;
extern PFNGLPOINTPARAMETERIPROC         glPointParameteri;
extern PFNGLPOINTPARAMETERIVPROC        glPointParameteriv;
extern PFNGLFOGCOORDFPROC               glFogCoordf;
extern PFNGLFOGCOORDFVPROC              glFogCoordfv;
extern PFNGLFOGCOORDDPROC               glFogCoordd;
extern PFNGLFOGCOORDDVPROC              glFogCoorddv;
extern PFNGLFOGCOORDPOINTERPROC         glFogCoordPointer;
extern PFNGLSECONDARYCOLOR3BPROC        glSecondaryColor3b;
extern PFNGLSECONDARYCOLOR3BVPROC       glSecondaryColor3bv;
extern PFNGLSECONDARYCOLOR3DPROC        glSecondaryColor3d;
extern PFNGLSECONDARYCOLOR3DVPROC       glSecondaryColor3dv;
extern PFNGLSECONDARYCOLOR3FPROC        glSecondaryColor3f;
extern PFNGLSECONDARYCOLOR3FVPROC       glSecondaryColor3fv;
extern PFNGLSECONDARYCOLOR3IPROC        glSecondaryColor3i;
extern PFNGLSECONDARYCOLOR3IVPROC       glSecondaryColor3iv;
extern PFNGLSECONDARYCOLOR3SPROC        glSecondaryColor3s;
extern PFNGLSECONDARYCOLOR3SVPROC       glSecondaryColor3sv;
extern PFNGLSECONDARYCOLOR3UBPROC       glSecondaryColor3ub;
extern PFNGLSECONDARYCOLOR3UBVPROC      glSecondaryColor3ubv;
extern PFNGLSECONDARYCOLOR3UIPROC       glSecondaryColor3ui;
extern PFNGLSECONDARYCOLOR3UIVPROC      glSecondaryColor3uiv;
extern PFNGLSECONDARYCOLOR3USPROC       glSecondaryColor3us;
extern PFNGLSECONDARYCOLOR3USVPROC      glSecondaryColor3usv;
extern PFNGLSECONDARYCOLORPOINTERPROC   glSecondaryColorPointer;
extern PFNGLWINDOWPOS2DPROC             glWindowPos2d;
extern PFNGLWINDOWPOS2DVPROC            glWindowPos2dv;
extern PFNGLWINDOWPOS2FPROC             glWindowPos2f;
extern PFNGLWINDOWPOS2FVPROC            glWindowPos2fv;
extern PFNGLWINDOWPOS2IPROC             glWindowPos2i;
extern PFNGLWINDOWPOS2IVPROC            glWindowPos2iv;
extern PFNGLWINDOWPOS2SPROC             glWindowPos2s;
extern PFNGLWINDOWPOS2SVPROC            glWindowPos2sv;
extern PFNGLWINDOWPOS3DPROC             glWindowPos3d;
extern PFNGLWINDOWPOS3DVPROC            glWindowPos3dv;
extern PFNGLWINDOWPOS3FPROC             glWindowPos3f;
extern PFNGLWINDOWPOS3FVPROC            glWindowPos3fv;
extern PFNGLWINDOWPOS3IPROC             glWindowPos3i;
extern PFNGLWINDOWPOS3IVPROC            glWindowPos3iv;
extern PFNGLWINDOWPOS3SPROC             glWindowPos3s;
extern PFNGLWINDOWPOS3SVPROC            glWindowPos3sv;

// GL_VERSION_1_5
extern PFNGLGENQUERIESPROC              glGenQueries;
extern PFNGLDELETEQUERIESPROC           glDeleteQueries;
extern PFNGLISQUERYPROC                 glIsQuery;
extern PFNGLBEGINQUERYPROC              glBeginQuery;
extern PFNGLENDQUERYPROC                glEndQuery;
extern PFNGLGETQUERYIVPROC              glGetQueryiv;
extern PFNGLGETQUERYOBJECTIVPROC        glGetQueryObjectiv;
extern PFNGLGETQUERYOBJECTUIVPROC       glGetQueryObjectuiv;
extern PFNGLBINDBUFFERPROC              glBindBuffer;
extern PFNGLDELETEBUFFERSPROC           glDeleteBuffers;
extern PFNGLGENBUFFERSPROC              glGenBuffers;
extern PFNGLISBUFFERPROC                glIsBuffer;
extern PFNGLBUFFERDATAPROC              glBufferData;
extern PFNGLBUFFERSUBDATAPROC           glBufferSubData;
extern PFNGLGETBUFFERSUBDATAPROC        glGetBufferSubData;
extern PFNGLMAPBUFFERPROC               glMapBuffer;
extern PFNGLUNMAPBUFFERPROC             glUnmapBuffer;
extern PFNGLGETBUFFERPARAMETERIVPROC    glGetBufferParameteriv;
extern PFNGLGETBUFFERPOINTERVPROC       glGetBufferPointerv;

// GL_VERSION_2_0
extern PFNGLBLENDEQUATIONSEPARATEPROC           glBlendEquationSeparate;
extern PFNGLDRAWBUFFERSPROC                     glDrawBuffers;
extern PFNGLSTENCILOPSEPARATEPROC               glStencilOpSeparate;
extern PFNGLSTENCILFUNCSEPARATEPROC             glStencilFuncSeparate;
extern PFNGLSTENCILMASKSEPARATEPROC             glStencilMaskSeparate;
extern PFNGLATTACHSHADERPROC                    glAttachShader;
extern PFNGLBINDATTRIBLOCATIONPROC              glBindAttribLocation;
extern PFNGLCOMPILESHADERPROC                   glCompileShader;
extern PFNGLCREATEPROGRAMPROC                   glCreateProgram;
extern PFNGLCREATESHADERPROC                    glCreateShader;
extern PFNGLDELETEPROGRAMPROC                   glDeleteProgram;
extern PFNGLDELETESHADERPROC                    glDeleteShader;
extern PFNGLDETACHSHADERPROC                    glDetachShader;
extern PFNGLDISABLEVERTEXATTRIBARRAYPROC        glDisableVertexAttribArray;
extern PFNGLENABLEVERTEXATTRIBARRAYPROC         glEnableVertexAttribArray;
extern PFNGLGETACTIVEATTRIBPROC                 glGetActiveAttrib;
extern PFNGLGETACTIVEUNIFORMPROC                glGetActiveUniform;
extern PFNGLGETATTACHEDSHADERSPROC              glGetAttachedShaders;
extern PFNGLGETATTRIBLOCATIONPROC               glGetAttribLocation;
extern PFNGLGETPROGRAMIVPROC                    glGetProgramiv;
extern PFNGLGETPROGRAMINFOLOGPROC               glGetProgramInfoLog;
extern PFNGLGETSHADERIVPROC                     glGetShaderiv;
extern PFNGLGETSHADERINFOLOGPROC                glGetShaderInfoLog;
extern PFNGLGETSHADERSOURCEPROC                 glGetShaderSource;
extern PFNGLGETUNIFORMLOCATIONPROC              glGetUniformLocation;
extern PFNGLGETUNIFORMFVPROC                    glGetUniformfv;
extern PFNGLGETUNIFORMIVPROC                    glGetUniformiv;
extern PFNGLGETVERTEXATTRIBDVPROC               glGetVertexAttribdv;
extern PFNGLGETVERTEXATTRIBFVPROC               glGetVertexAttribfv;
extern PFNGLGETVERTEXATTRIBIVPROC               glGetVertexAttribiv;
extern PFNGLGETVERTEXATTRIBPOINTERVPROC         glGetVertexAttribPointerv;
extern PFNGLISPROGRAMPROC                       glIsProgram;
extern PFNGLISSHADERPROC                        glIsShader;
extern PFNGLLINKPROGRAMPROC                     glLinkProgram;
extern PFNGLSHADERSOURCEPROC                    glShaderSource;
extern PFNGLUSEPROGRAMPROC                      glUseProgram;
extern PFNGLUNIFORM1FPROC                       glUniform1f;
extern PFNGLUNIFORM2FPROC                       glUniform2f;
extern PFNGLUNIFORM3FPROC                       glUniform3f;
extern PFNGLUNIFORM4FPROC                       glUniform4f;
extern PFNGLUNIFORM1IPROC                       glUniform1i;
extern PFNGLUNIFORM2IPROC                       glUniform2i;
extern PFNGLUNIFORM3IPROC                       glUniform3i;
extern PFNGLUNIFORM4IPROC                       glUniform4i;
extern PFNGLUNIFORM1FVPROC                      glUniform1fv;
extern PFNGLUNIFORM2FVPROC                      glUniform2fv;
extern PFNGLUNIFORM3FVPROC                      glUniform3fv;
extern PFNGLUNIFORM4FVPROC                      glUniform4fv;
extern PFNGLUNIFORM1IVPROC                      glUniform1iv;
extern PFNGLUNIFORM2IVPROC                      glUniform2iv;
extern PFNGLUNIFORM3IVPROC                      glUniform3iv;
extern PFNGLUNIFORM4IVPROC                      glUniform4iv;
extern PFNGLUNIFORMMATRIX2FVPROC                glUniformMatrix2fv;
extern PFNGLUNIFORMMATRIX3FVPROC                glUniformMatrix3fv;
extern PFNGLUNIFORMMATRIX4FVPROC                glUniformMatrix4fv;
extern PFNGLVALIDATEPROGRAMPROC                 glValidateProgram;
extern PFNGLVERTEXATTRIB1DPROC                  glVertexAttrib1d;
extern PFNGLVERTEXATTRIB1DVPROC                 glVertexAttrib1dv;
extern PFNGLVERTEXATTRIB1FPROC                  glVertexAttrib1f;
extern PFNGLVERTEXATTRIB1FVPROC                 glVertexAttrib1fv;
extern PFNGLVERTEXATTRIB1SPROC                  glVertexAttrib1s;
extern PFNGLVERTEXATTRIB1SVPROC                 glVertexAttrib1sv;
extern PFNGLVERTEXATTRIB2DPROC                  glVertexAttrib2d;
extern PFNGLVERTEXATTRIB2DVPROC                 glVertexAttrib2dv;
extern PFNGLVERTEXATTRIB2FPROC                  glVertexAttrib2f;
extern PFNGLVERTEXATTRIB2FVPROC                 glVertexAttrib2fv;
extern PFNGLVERTEXATTRIB2SPROC                  glVertexAttrib2s;
extern PFNGLVERTEXATTRIB2SVPROC                 glVertexAttrib2sv;
extern PFNGLVERTEXATTRIB3DPROC                  glVertexAttrib3d;
extern PFNGLVERTEXATTRIB3DVPROC                 glVertexAttrib3dv;
extern PFNGLVERTEXATTRIB3FPROC                  glVertexAttrib3f;
extern PFNGLVERTEXATTRIB3FVPROC                 glVertexAttrib3fv;
extern PFNGLVERTEXATTRIB3SPROC                  glVertexAttrib3s;
extern PFNGLVERTEXATTRIB3SVPROC                 glVertexAttrib3sv;
extern PFNGLVERTEXATTRIB4NBVPROC                glVertexAttrib4Nbv;
extern PFNGLVERTEXATTRIB4NIVPROC                glVertexAttrib4Niv;
extern PFNGLVERTEXATTRIB4NSVPROC                glVertexAttrib4Nsv;
extern PFNGLVERTEXATTRIB4NUBPROC                glVertexAttrib4Nub;
extern PFNGLVERTEXATTRIB4NUBVPROC               glVertexAttrib4Nubv;
extern PFNGLVERTEXATTRIB4NUIVPROC               glVertexAttrib4Nuiv;
extern PFNGLVERTEXATTRIB4NUSVPROC               glVertexAttrib4Nusv;
extern PFNGLVERTEXATTRIB4BVPROC                 glVertexAttrib4bv;
extern PFNGLVERTEXATTRIB4DPROC                  glVertexAttrib4d;
extern PFNGLVERTEXATTRIB4DVPROC                 glVertexAttrib4dv;
extern PFNGLVERTEXATTRIB4FPROC                  glVertexAttrib4f;
extern PFNGLVERTEXATTRIB4FVPROC                 glVertexAttrib4fv;
extern PFNGLVERTEXATTRIB4IVPROC                 glVertexAttrib4iv;
extern PFNGLVERTEXATTRIB4SPROC                  glVertexAttrib4s;
extern PFNGLVERTEXATTRIB4SVPROC                 glVertexAttrib4sv;
extern PFNGLVERTEXATTRIB4UBVPROC                glVertexAttrib4ubv;
extern PFNGLVERTEXATTRIB4UIVPROC                glVertexAttrib4uiv;
extern PFNGLVERTEXATTRIB4USVPROC                glVertexAttrib4usv;
extern PFNGLVERTEXATTRIBPOINTERPROC             glVertexAttribPointer;

// GL_VERSION_2_1
extern PFNGLUNIFORMMATRIX2X3FVPROC glUniformMatrix2x3fv;
extern PFNGLUNIFORMMATRIX3X2FVPROC glUniformMatrix3x2fv;
extern PFNGLUNIFORMMATRIX2X4FVPROC glUniformMatrix2x4fv;
extern PFNGLUNIFORMMATRIX4X2FVPROC glUniformMatrix4x2fv;
extern PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv;
extern PFNGLUNIFORMMATRIX4X3FVPROC glUniformMatrix4x3fv;

// GL_VERSION_3_0
extern PFNGLCOLORMASKIPROC                              glColorMaski;
extern PFNGLGETBOOLEANI_VPROC                           glGetBooleani_v;
extern PFNGLGETINTEGERI_VPROC                           glGetIntegeri_v;
extern PFNGLENABLEIPROC                                 glEnablei;
extern PFNGLDISABLEIPROC                                glDisablei;
extern PFNGLISENABLEDIPROC                              glIsEnabledi;
extern PFNGLBEGINTRANSFORMFEEDBACKPROC                  glBeginTransformFeedback;
extern PFNGLENDTRANSFORMFEEDBACKPROC                    glEndTransformFeedback;
extern PFNGLBINDBUFFERRANGEPROC                         glBindBufferRange;
extern PFNGLBINDBUFFERBASEPROC                          glBindBufferBase;
extern PFNGLTRANSFORMFEEDBACKVARYINGSPROC               glTransformFeedbackVaryings;
extern PFNGLGETTRANSFORMFEEDBACKVARYINGPROC             glGetTransformFeedbackVarying;
extern PFNGLCLAMPCOLORPROC                              glClampColor;
extern PFNGLBEGINCONDITIONALRENDERPROC                  glBeginConditionalRender;
extern PFNGLENDCONDITIONALRENDERPROC                    glEndConditionalRender;
extern PFNGLVERTEXATTRIBIPOINTERPROC                    glVertexAttribIPointer;
extern PFNGLGETVERTEXATTRIBIIVPROC                      glGetVertexAttribIiv;
extern PFNGLGETVERTEXATTRIBIUIVPROC                     glGetVertexAttribIuiv;
extern PFNGLVERTEXATTRIBI1IPROC                         glVertexAttribI1i;
extern PFNGLVERTEXATTRIBI2IPROC                         glVertexAttribI2i;
extern PFNGLVERTEXATTRIBI3IPROC                         glVertexAttribI3i;
extern PFNGLVERTEXATTRIBI4IPROC                         glVertexAttribI4i;
extern PFNGLVERTEXATTRIBI1UIPROC                        glVertexAttribI1ui;
extern PFNGLVERTEXATTRIBI2UIPROC                        glVertexAttribI2ui;
extern PFNGLVERTEXATTRIBI3UIPROC                        glVertexAttribI3ui;
extern PFNGLVERTEXATTRIBI4UIPROC                        glVertexAttribI4ui;
extern PFNGLVERTEXATTRIBI1IVPROC                        glVertexAttribI1iv;
extern PFNGLVERTEXATTRIBI2IVPROC                        glVertexAttribI2iv;
extern PFNGLVERTEXATTRIBI3IVPROC                        glVertexAttribI3iv;
extern PFNGLVERTEXATTRIBI4IVPROC                        glVertexAttribI4iv;
extern PFNGLVERTEXATTRIBI1UIVPROC                       glVertexAttribI1uiv;
extern PFNGLVERTEXATTRIBI2UIVPROC                       glVertexAttribI2uiv;
extern PFNGLVERTEXATTRIBI3UIVPROC                       glVertexAttribI3uiv;
extern PFNGLVERTEXATTRIBI4UIVPROC                       glVertexAttribI4uiv;
extern PFNGLVERTEXATTRIBI4BVPROC                        glVertexAttribI4bv;
extern PFNGLVERTEXATTRIBI4SVPROC                        glVertexAttribI4sv;
extern PFNGLVERTEXATTRIBI4UBVPROC                       glVertexAttribI4ubv;
extern PFNGLVERTEXATTRIBI4USVPROC                       glVertexAttribI4usv;
extern PFNGLGETUNIFORMUIVPROC                           glGetUniformuiv;
extern PFNGLBINDFRAGDATALOCATIONPROC                    glBindFragDataLocation;
extern PFNGLGETFRAGDATALOCATIONPROC                     glGetFragDataLocation;
extern PFNGLUNIFORM1UIPROC                              glUniform1ui;
extern PFNGLUNIFORM2UIPROC                              glUniform2ui;
extern PFNGLUNIFORM3UIPROC                              glUniform3ui;
extern PFNGLUNIFORM4UIPROC                              glUniform4ui;
extern PFNGLUNIFORM1UIVPROC                             glUniform1uiv;
extern PFNGLUNIFORM2UIVPROC                             glUniform2uiv;
extern PFNGLUNIFORM3UIVPROC                             glUniform3uiv;
extern PFNGLUNIFORM4UIVPROC                             glUniform4uiv;
extern PFNGLTEXPARAMETERIIVPROC                         glTexParameterIiv;
extern PFNGLTEXPARAMETERIUIVPROC                        glTexParameterIuiv;
extern PFNGLGETTEXPARAMETERIIVPROC                      glGetTexParameterIiv;
extern PFNGLGETTEXPARAMETERIUIVPROC                     glGetTexParameterIuiv;
extern PFNGLCLEARBUFFERIVPROC                           glClearBufferiv;
extern PFNGLCLEARBUFFERUIVPROC                          glClearBufferuiv;
extern PFNGLCLEARBUFFERFVPROC                           glClearBufferfv;
extern PFNGLCLEARBUFFERFIPROC                           glClearBufferfi;
extern PFNGLGETSTRINGIPROC                              glGetStringi;
extern PFNGLISRENDERBUFFERPROC                          glIsRenderbuffer;
extern PFNGLBINDRENDERBUFFERPROC                        glBindRenderbuffer;
extern PFNGLDELETERENDERBUFFERSPROC                     glDeleteRenderbuffers;
extern PFNGLGENRENDERBUFFERSPROC                        glGenRenderbuffers;
extern PFNGLRENDERBUFFERSTORAGEPROC                     glRenderbufferStorage;
extern PFNGLGETRENDERBUFFERPARAMETERIVPROC              glGetRenderbufferParameteriv;
extern PFNGLISFRAMEBUFFERPROC                           glIsFramebuffer;
extern PFNGLBINDFRAMEBUFFERPROC                         glBindFramebuffer;
extern PFNGLDELETEFRAMEBUFFERSPROC                      glDeleteFramebuffers;
extern PFNGLGENFRAMEBUFFERSPROC                         glGenFramebuffers;
extern PFNGLCHECKFRAMEBUFFERSTATUSPROC                  glCheckFramebufferStatus;
extern PFNGLFRAMEBUFFERTEXTURE1DPROC                    glFramebufferTexture1D;
extern PFNGLFRAMEBUFFERTEXTURE2DPROC                    glFramebufferTexture2D;
extern PFNGLFRAMEBUFFERTEXTURE3DPROC                    glFramebufferTexture3D;
extern PFNGLFRAMEBUFFERRENDERBUFFERPROC                 glFramebufferRenderbuffer;
extern PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC     glGetFramebufferAttachmentParameteriv;
extern PFNGLGENERATEMIPMAPPROC                          glGenerateMipmap;
extern PFNGLBLITFRAMEBUFFERPROC                         glBlitFramebuffer;
extern PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC          glRenderbufferStorageMultisample;
extern PFNGLFRAMEBUFFERTEXTURELAYERPROC                 glFramebufferTextureLayer;
extern PFNGLMAPBUFFERRANGEPROC                          glMapBufferRange;
extern PFNGLFLUSHMAPPEDBUFFERRANGEPROC                  glFlushMappedBufferRange;
extern PFNGLBINDVERTEXARRAYPROC                         glBindVertexArray;
extern PFNGLDELETEVERTEXARRAYSPROC                      glDeleteVertexArrays;
extern PFNGLGENVERTEXARRAYSPROC                         glGenVertexArrays;
extern PFNGLISVERTEXARRAYPROC                           glIsVertexArray;

// GL_VERSION_3_1
extern PFNGLDRAWARRAYSINSTANCEDPROC         glDrawArraysInstanced;
extern PFNGLDRAWELEMENTSINSTANCEDPROC       glDrawElementsInstanced;
extern PFNGLTEXBUFFERPROC                   glTexBuffer;
extern PFNGLPRIMITIVERESTARTINDEXPROC       glPrimitiveRestartIndex;
extern PFNGLCOPYBUFFERSUBDATAPROC           glCopyBufferSubData;
extern PFNGLGETUNIFORMINDICESPROC           glGetUniformIndices;
extern PFNGLGETACTIVEUNIFORMSIVPROC         glGetActiveUniformsiv;
extern PFNGLGETACTIVEUNIFORMNAMEPROC        glGetActiveUniformName;
extern PFNGLGETUNIFORMBLOCKINDEXPROC        glGetUniformBlockIndex;
extern PFNGLGETACTIVEUNIFORMBLOCKIVPROC     glGetActiveUniformBlockiv;
extern PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC   glGetActiveUniformBlockName;
extern PFNGLUNIFORMBLOCKBINDINGPROC         glUniformBlockBinding;

// GL_VERSION_3_2
extern PFNGLDRAWELEMENTSBASEVERTEXPROC          glDrawElementsBaseVertex;
extern PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC     glDrawRangeElementsBaseVertex;
extern PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glDrawElementsInstancedBaseVertex;
extern PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC     glMultiDrawElementsBaseVertex;
extern PFNGLPROVOKINGVERTEXPROC                 glProvokingVertex;
extern PFNGLFENCESYNCPROC                       glFenceSync;
extern PFNGLISSYNCPROC                          glIsSync;
extern PFNGLDELETESYNCPROC                      glDeleteSync;
extern PFNGLCLIENTWAITSYNCPROC                  glClientWaitSync;
extern PFNGLWAITSYNCPROC                        glWaitSync;
extern PFNGLGETINTEGER64VPROC                   glGetInteger64v;
extern PFNGLGETSYNCIVPROC                       glGetSynciv;
extern PFNGLGETINTEGER64I_VPROC                 glGetInteger64i_v;
extern PFNGLGETBUFFERPARAMETERI64VPROC          glGetBufferParameteri64v;
extern PFNGLFRAMEBUFFERTEXTUREPROC              glFramebufferTexture;
extern PFNGLTEXIMAGE2DMULTISAMPLEPROC           glTexImage2DMultisample;
extern PFNGLTEXIMAGE3DMULTISAMPLEPROC           glTexImage3DMultisample;
extern PFNGLGETMULTISAMPLEFVPROC                glGetMultisamplefv;
extern PFNGLSAMPLEMASKIPROC                     glSampleMaski;

// GL_VERSION_3_3
extern PFNGLBINDFRAGDATALOCATIONINDEXEDPROC  glBindFragDataLocationIndexed;
extern PFNGLGETFRAGDATAINDEXPROC             glGetFragDataIndex;
extern PFNGLGENSAMPLERSPROC                  glGenSamplers;
extern PFNGLDELETESAMPLERSPROC               glDeleteSamplers;
extern PFNGLISSAMPLERPROC                    glIsSampler;
extern PFNGLBINDSAMPLERPROC                  glBindSampler;
extern PFNGLSAMPLERPARAMETERIPROC            glSamplerParameteri;
extern PFNGLSAMPLERPARAMETERIVPROC           glSamplerParameteriv;
extern PFNGLSAMPLERPARAMETERFPROC            glSamplerParameterf;
extern PFNGLSAMPLERPARAMETERFVPROC           glSamplerParameterfv;
extern PFNGLSAMPLERPARAMETERIIVPROC          glSamplerParameterIiv;
extern PFNGLSAMPLERPARAMETERIUIVPROC         glSamplerParameterIuiv;
extern PFNGLGETSAMPLERPARAMETERIVPROC        glGetSamplerParameteriv;
extern PFNGLGETSAMPLERPARAMETERIIVPROC       glGetSamplerParameterIiv;
extern PFNGLGETSAMPLERPARAMETERFVPROC        glGetSamplerParameterfv;
extern PFNGLGETSAMPLERPARAMETERIUIVPROC      glGetSamplerParameterIuiv;
extern PFNGLQUERYCOUNTERPROC                 glQueryCounter;
extern PFNGLGETQUERYOBJECTI64VPROC           glGetQueryObjecti64v;
extern PFNGLGETQUERYOBJECTUI64VPROC          glGetQueryObjectui64v;
extern PFNGLVERTEXATTRIBDIVISORPROC          glVertexAttribDivisor;
extern PFNGLVERTEXATTRIBP1UIPROC             glVertexAttribP1ui;
extern PFNGLVERTEXATTRIBP1UIVPROC            glVertexAttribP1uiv;
extern PFNGLVERTEXATTRIBP2UIPROC             glVertexAttribP2ui;
extern PFNGLVERTEXATTRIBP2UIVPROC            glVertexAttribP2uiv;
extern PFNGLVERTEXATTRIBP3UIPROC             glVertexAttribP3ui;
extern PFNGLVERTEXATTRIBP3UIVPROC            glVertexAttribP3uiv;
extern PFNGLVERTEXATTRIBP4UIPROC             glVertexAttribP4ui;
extern PFNGLVERTEXATTRIBP4UIVPROC            glVertexAttribP4uiv;
extern PFNGLVERTEXP2UIPROC                   glVertexP2ui;
extern PFNGLVERTEXP2UIVPROC                  glVertexP2uiv;
extern PFNGLVERTEXP3UIPROC                   glVertexP3ui;
extern PFNGLVERTEXP3UIVPROC                  glVertexP3uiv;
extern PFNGLVERTEXP4UIPROC                   glVertexP4ui;
extern PFNGLVERTEXP4UIVPROC                  glVertexP4uiv;
extern PFNGLTEXCOORDP1UIPROC                 glTexCoordP1ui;
extern PFNGLTEXCOORDP1UIVPROC                glTexCoordP1uiv;
extern PFNGLTEXCOORDP2UIPROC                 glTexCoordP2ui;
extern PFNGLTEXCOORDP2UIVPROC                glTexCoordP2uiv;
extern PFNGLTEXCOORDP3UIPROC                 glTexCoordP3ui;
extern PFNGLTEXCOORDP3UIVPROC                glTexCoordP3uiv;
extern PFNGLTEXCOORDP4UIPROC                 glTexCoordP4ui;
extern PFNGLTEXCOORDP4UIVPROC                glTexCoordP4uiv;
extern PFNGLMULTITEXCOORDP1UIPROC            glMultiTexCoordP1ui;
extern PFNGLMULTITEXCOORDP1UIVPROC           glMultiTexCoordP1uiv;
extern PFNGLMULTITEXCOORDP2UIPROC            glMultiTexCoordP2ui;
extern PFNGLMULTITEXCOORDP2UIVPROC           glMultiTexCoordP2uiv;
extern PFNGLMULTITEXCOORDP3UIPROC            glMultiTexCoordP3ui;
extern PFNGLMULTITEXCOORDP3UIVPROC           glMultiTexCoordP3uiv;
extern PFNGLMULTITEXCOORDP4UIPROC            glMultiTexCoordP4ui;
extern PFNGLMULTITEXCOORDP4UIVPROC           glMultiTexCoordP4uiv;
extern PFNGLNORMALP3UIPROC                   glNormalP3ui;
extern PFNGLNORMALP3UIVPROC                  glNormalP3uiv;
extern PFNGLCOLORP3UIPROC                    glColorP3ui;
extern PFNGLCOLORP3UIVPROC                   glColorP3uiv;
extern PFNGLCOLORP4UIPROC                    glColorP4ui;
extern PFNGLCOLORP4UIVPROC                   glColorP4uiv;
extern PFNGLSECONDARYCOLORP3UIPROC           glSecondaryColorP3ui;
extern PFNGLSECONDARYCOLORP3UIVPROC          glSecondaryColorP3uiv;

// GL_VERSION_4_0
extern PFNGLMINSAMPLESHADINGPROC                glMinSampleShading;
extern PFNGLBLENDEQUATIONIPROC                  glBlendEquationi;
extern PFNGLBLENDEQUATIONSEPARATEIPROC          glBlendEquationSeparatei;
extern PFNGLBLENDFUNCIPROC                      glBlendFunci;
extern PFNGLBLENDFUNCSEPARATEIPROC              glBlendFuncSeparatei;
extern PFNGLDRAWARRAYSINDIRECTPROC              glDrawArraysIndirect;
extern PFNGLDRAWELEMENTSINDIRECTPROC            glDrawElementsIndirect;
extern PFNGLUNIFORM1DPROC                       glUniform1d;
extern PFNGLUNIFORM2DPROC                       glUniform2d;
extern PFNGLUNIFORM3DPROC                       glUniform3d;
extern PFNGLUNIFORM4DPROC                       glUniform4d;
extern PFNGLUNIFORM1DVPROC                      glUniform1dv;
extern PFNGLUNIFORM2DVPROC                      glUniform2dv;
extern PFNGLUNIFORM3DVPROC                      glUniform3dv;
extern PFNGLUNIFORM4DVPROC                      glUniform4dv;
extern PFNGLUNIFORMMATRIX2DVPROC                glUniformMatrix2dv;
extern PFNGLUNIFORMMATRIX3DVPROC                glUniformMatrix3dv;
extern PFNGLUNIFORMMATRIX4DVPROC                glUniformMatrix4dv;
extern PFNGLUNIFORMMATRIX2X3DVPROC              glUniformMatrix2x3dv;
extern PFNGLUNIFORMMATRIX2X4DVPROC              glUniformMatrix2x4dv;
extern PFNGLUNIFORMMATRIX3X2DVPROC              glUniformMatrix3x2dv;
extern PFNGLUNIFORMMATRIX3X4DVPROC              glUniformMatrix3x4dv;
extern PFNGLUNIFORMMATRIX4X2DVPROC              glUniformMatrix4x2dv;
extern PFNGLUNIFORMMATRIX4X3DVPROC              glUniformMatrix4x3dv;
extern PFNGLGETUNIFORMDVPROC                    glGetUniformdv;
extern PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC    glGetSubroutineUniformLocation;
extern PFNGLGETSUBROUTINEINDEXPROC              glGetSubroutineIndex;
extern PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC    glGetActiveSubroutineUniformiv;
extern PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC  glGetActiveSubroutineUniformName;
extern PFNGLGETACTIVESUBROUTINENAMEPROC         glGetActiveSubroutineName;
extern PFNGLUNIFORMSUBROUTINESUIVPROC           glUniformSubroutinesuiv;
extern PFNGLGETUNIFORMSUBROUTINEUIVPROC         glGetUniformSubroutineuiv;
extern PFNGLGETPROGRAMSTAGEIVPROC               glGetProgramStageiv;
extern PFNGLPATCHPARAMETERIPROC                 glPatchParameteri;
extern PFNGLPATCHPARAMETERFVPROC                glPatchParameterfv;
extern PFNGLBINDTRANSFORMFEEDBACKPROC           glBindTransformFeedback;
extern PFNGLDELETETRANSFORMFEEDBACKSPROC        glDeleteTransformFeedbacks;
extern PFNGLGENTRANSFORMFEEDBACKSPROC           glGenTransformFeedbacks;
extern PFNGLISTRANSFORMFEEDBACKPROC             glIsTransformFeedback;
extern PFNGLPAUSETRANSFORMFEEDBACKPROC          glPauseTransformFeedback;
extern PFNGLRESUMETRANSFORMFEEDBACKPROC         glResumeTransformFeedback;
extern PFNGLDRAWTRANSFORMFEEDBACKPROC           glDrawTransformFeedback;
extern PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC     glDrawTransformFeedbackStream;
extern PFNGLBEGINQUERYINDEXEDPROC               glBeginQueryIndexed;
extern PFNGLENDQUERYINDEXEDPROC                 glEndQueryIndexed;
extern PFNGLGETQUERYINDEXEDIVPROC               glGetQueryIndexediv;

 // GL_VERSION_4_1
extern PFNGLRELEASESHADERCOMPILERPROC           glReleaseShaderCompiler;
extern PFNGLSHADERBINARYPROC                    glShaderBinary;
extern PFNGLGETSHADERPRECISIONFORMATPROC        glGetShaderPrecisionFormat;
extern PFNGLDEPTHRANGEFPROC                     glDepthRangef;
extern PFNGLCLEARDEPTHFPROC                     glClearDepthf;
extern PFNGLGETPROGRAMBINARYPROC                glGetProgramBinary;
extern PFNGLPROGRAMBINARYPROC                   glProgramBinary;
extern PFNGLPROGRAMPARAMETERIPROC               glProgramParameteri;
extern PFNGLUSEPROGRAMSTAGESPROC                glUseProgramStages;
extern PFNGLACTIVESHADERPROGRAMPROC             glActiveShaderProgram;
extern PFNGLCREATESHADERPROGRAMVPROC            glCreateShaderProgramv;
extern PFNGLBINDPROGRAMPIPELINEPROC             glBindProgramPipeline;
extern PFNGLDELETEPROGRAMPIPELINESPROC          glDeleteProgramPipelines;
extern PFNGLGENPROGRAMPIPELINESPROC             glGenProgramPipelines;
extern PFNGLISPROGRAMPIPELINEPROC               glIsProgramPipeline;
extern PFNGLGETPROGRAMPIPELINEIVPROC            glGetProgramPipelineiv;
extern PFNGLPROGRAMUNIFORM1IPROC                glProgramUniform1i;
extern PFNGLPROGRAMUNIFORM1IVPROC               glProgramUniform1iv;
extern PFNGLPROGRAMUNIFORM1FPROC                glProgramUniform1f;
extern PFNGLPROGRAMUNIFORM1FVPROC               glProgramUniform1fv;
extern PFNGLPROGRAMUNIFORM1DPROC                glProgramUniform1d;
extern PFNGLPROGRAMUNIFORM1DVPROC               glProgramUniform1dv;
extern PFNGLPROGRAMUNIFORM1UIPROC               glProgramUniform1ui;
extern PFNGLPROGRAMUNIFORM1UIVPROC              glProgramUniform1uiv;
extern PFNGLPROGRAMUNIFORM2IPROC                glProgramUniform2i;
extern PFNGLPROGRAMUNIFORM2IVPROC               glProgramUniform2iv;
extern PFNGLPROGRAMUNIFORM2FPROC                glProgramUniform2f;
extern PFNGLPROGRAMUNIFORM2FVPROC               glProgramUniform2fv;
extern PFNGLPROGRAMUNIFORM2DPROC                glProgramUniform2d;
extern PFNGLPROGRAMUNIFORM2DVPROC               glProgramUniform2dv;
extern PFNGLPROGRAMUNIFORM2UIPROC               glProgramUniform2ui;
extern PFNGLPROGRAMUNIFORM2UIVPROC              glProgramUniform2uiv;
extern PFNGLPROGRAMUNIFORM3IPROC                glProgramUniform3i;
extern PFNGLPROGRAMUNIFORM3IVPROC               glProgramUniform3iv;
extern PFNGLPROGRAMUNIFORM3FPROC                glProgramUniform3f;
extern PFNGLPROGRAMUNIFORM3FVPROC               glProgramUniform3fv;
extern PFNGLPROGRAMUNIFORM3DPROC                glProgramUniform3d;
extern PFNGLPROGRAMUNIFORM3DVPROC               glProgramUniform3dv;
extern PFNGLPROGRAMUNIFORM3UIPROC               glProgramUniform3ui;
extern PFNGLPROGRAMUNIFORM3UIVPROC              glProgramUniform3uiv;
extern PFNGLPROGRAMUNIFORM4IPROC                glProgramUniform4i;
extern PFNGLPROGRAMUNIFORM4IVPROC               glProgramUniform4iv;
extern PFNGLPROGRAMUNIFORM4FPROC                glProgramUniform4f;
extern PFNGLPROGRAMUNIFORM4FVPROC               glProgramUniform4fv;
extern PFNGLPROGRAMUNIFORM4DPROC                glProgramUniform4d;
extern PFNGLPROGRAMUNIFORM4DVPROC               glProgramUniform4dv;
extern PFNGLPROGRAMUNIFORM4UIPROC               glProgramUniform4ui;
extern PFNGLPROGRAMUNIFORM4UIVPROC              glProgramUniform4uiv;
extern PFNGLPROGRAMUNIFORMMATRIX2FVPROC         glProgramUniformMatrix2fv;
extern PFNGLPROGRAMUNIFORMMATRIX3FVPROC         glProgramUniformMatrix3fv;
extern PFNGLPROGRAMUNIFORMMATRIX4FVPROC         glProgramUniformMatrix4fv;
extern PFNGLPROGRAMUNIFORMMATRIX2DVPROC         glProgramUniformMatrix2dv;
extern PFNGLPROGRAMUNIFORMMATRIX3DVPROC         glProgramUniformMatrix3dv;
extern PFNGLPROGRAMUNIFORMMATRIX4DVPROC         glProgramUniformMatrix4dv;
extern PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC       glProgramUniformMatrix2x3fv;
extern PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC       glProgramUniformMatrix3x2fv;
extern PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC       glProgramUniformMatrix2x4fv;
extern PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC       glProgramUniformMatrix4x2fv;
extern PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC       glProgramUniformMatrix3x4fv;
extern PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC       glProgramUniformMatrix4x3fv;
extern PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC       glProgramUniformMatrix2x3dv;
extern PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC       glProgramUniformMatrix3x2dv;
extern PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC       glProgramUniformMatrix2x4dv;
extern PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC       glProgramUniformMatrix4x2dv;
extern PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC       glProgramUniformMatrix3x4dv;
extern PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC       glProgramUniformMatrix4x3dv;
extern PFNGLVALIDATEPROGRAMPIPELINEPROC         glValidateProgramPipeline;
extern PFNGLGETPROGRAMPIPELINEINFOLOGPROC       glGetProgramPipelineInfoLog;
extern PFNGLVERTEXATTRIBL1DPROC                 glVertexAttribL1d;
extern PFNGLVERTEXATTRIBL2DPROC                 glVertexAttribL2d;
extern PFNGLVERTEXATTRIBL3DPROC                 glVertexAttribL3d;
extern PFNGLVERTEXATTRIBL4DPROC                 glVertexAttribL4d;
extern PFNGLVERTEXATTRIBL1DVPROC                glVertexAttribL1dv;
extern PFNGLVERTEXATTRIBL2DVPROC                glVertexAttribL2dv;
extern PFNGLVERTEXATTRIBL3DVPROC                glVertexAttribL3dv;
extern PFNGLVERTEXATTRIBL4DVPROC                glVertexAttribL4dv;
extern PFNGLVERTEXATTRIBLPOINTERPROC            glVertexAttribLPointer;
extern PFNGLGETVERTEXATTRIBLDVPROC              glGetVertexAttribLdv;
extern PFNGLVIEWPORTARRAYVPROC                  glViewportArrayv;
extern PFNGLVIEWPORTINDEXEDFPROC                glViewportIndexedf;
extern PFNGLVIEWPORTINDEXEDFVPROC               glViewportIndexedfv;
extern PFNGLSCISSORARRAYVPROC                   glScissorArrayv;
extern PFNGLSCISSORINDEXEDPROC                  glScissorIndexed;
extern PFNGLSCISSORINDEXEDVPROC                 glScissorIndexedv;
extern PFNGLDEPTHRANGEARRAYVPROC                glDepthRangeArrayv;
extern PFNGLDEPTHRANGEINDEXEDPROC               glDepthRangeIndexed;
extern PFNGLGETFLOATI_VPROC                     glGetFloati_v;
extern PFNGLGETDOUBLEI_VPROC                    glGetDoublei_v;

// GL_VERSION_4_2
extern PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC             glDrawArraysInstancedBaseInstance;
extern PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC           glDrawElementsInstancedBaseInstance;
extern PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glDrawElementsInstancedBaseVertexBaseInstance;
extern PFNGLGETINTERNALFORMATIVPROC                         glGetInternalformativ;
extern PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC              glGetActiveAtomicCounterBufferiv;
extern PFNGLBINDIMAGETEXTUREPROC                            glBindImageTexture;
extern PFNGLMEMORYBARRIERPROC                               glMemoryBarrier;
extern PFNGLTEXSTORAGE1DPROC                                glTexStorage1D;
extern PFNGLTEXSTORAGE2DPROC                                glTexStorage2D;
extern PFNGLTEXSTORAGE3DPROC                                glTexStorage3D;
extern PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC              glDrawTransformFeedbackInstanced;
extern PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC        glDrawTransformFeedbackStreamInstanced;

// GL_VERSION_4_3
extern PFNGLCLEARBUFFERDATAPROC                             glClearBufferData;
extern PFNGLCLEARBUFFERSUBDATAPROC                          glClearBufferSubData;
extern PFNGLDISPATCHCOMPUTEPROC                             glDispatchCompute;
extern PFNGLDISPATCHCOMPUTEINDIRECTPROC                     glDispatchComputeIndirect;
extern PFNGLCOPYIMAGESUBDATAPROC                            glCopyImageSubData;
extern PFNGLFRAMEBUFFERPARAMETERIPROC                       glFramebufferParameteri;
extern PFNGLGETFRAMEBUFFERPARAMETERIVPROC                   glGetFramebufferParameteriv;
extern PFNGLGETINTERNALFORMATI64VPROC                       glGetInternalformati64v;
extern PFNGLINVALIDATETEXSUBIMAGEPROC                       glInvalidateTexSubImage;
extern PFNGLINVALIDATETEXIMAGEPROC                          glInvalidateTexImage;
extern PFNGLINVALIDATEBUFFERSUBDATAPROC                     glInvalidateBufferSubData;
extern PFNGLINVALIDATEBUFFERDATAPROC                        glInvalidateBufferData;
extern PFNGLINVALIDATEFRAMEBUFFERPROC                       glInvalidateFramebuffer;
extern PFNGLINVALIDATESUBFRAMEBUFFERPROC                    glInvalidateSubFramebuffer;
extern PFNGLMULTIDRAWARRAYSINDIRECTPROC                     glMultiDrawArraysIndirect;
extern PFNGLMULTIDRAWELEMENTSINDIRECTPROC                   glMultiDrawElementsIndirect;
extern PFNGLGETPROGRAMINTERFACEIVPROC                       glGetProgramInterfaceiv;
extern PFNGLGETPROGRAMRESOURCEINDEXPROC                     glGetProgramResourceIndex;
extern PFNGLGETPROGRAMRESOURCENAMEPROC                      glGetProgramResourceName;
extern PFNGLGETPROGRAMRESOURCEIVPROC                        glGetProgramResourceiv;
extern PFNGLGETPROGRAMRESOURCELOCATIONPROC                  glGetProgramResourceLocation;
extern PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC             glGetProgramResourceLocationIndex;
extern PFNGLSHADERSTORAGEBLOCKBINDINGPROC                   glShaderStorageBlockBinding;
extern PFNGLTEXBUFFERRANGEPROC                              glTexBufferRange;
extern PFNGLTEXSTORAGE2DMULTISAMPLEPROC                     glTexStorage2DMultisample;
extern PFNGLTEXSTORAGE3DMULTISAMPLEPROC                     glTexStorage3DMultisample;
extern PFNGLTEXTUREVIEWPROC                                 glTextureView;
extern PFNGLBINDVERTEXBUFFERPROC                            glBindVertexBuffer;
extern PFNGLVERTEXATTRIBFORMATPROC                          glVertexAttribFormat;
extern PFNGLVERTEXATTRIBIFORMATPROC                         glVertexAttribIFormat;
extern PFNGLVERTEXATTRIBLFORMATPROC                         glVertexAttribLFormat;
extern PFNGLVERTEXATTRIBBINDINGPROC                         glVertexAttribBinding;
extern PFNGLVERTEXBINDINGDIVISORPROC                        glVertexBindingDivisor;
extern PFNGLDEBUGMESSAGECONTROLPROC                         glDebugMessageControl;
extern PFNGLDEBUGMESSAGEINSERTPROC                          glDebugMessageInsert;
extern PFNGLDEBUGMESSAGECALLBACKPROC                        glDebugMessageCallback;
extern PFNGLGETDEBUGMESSAGELOGPROC                          glGetDebugMessageLog;
extern PFNGLPUSHDEBUGGROUPPROC                              glPushDebugGroup;
extern PFNGLPOPDEBUGGROUPPROC                               glPopDebugGroup;
extern PFNGLOBJECTLABELPROC                                 glObjectLabel;
extern PFNGLGETOBJECTLABELPROC                              glGetObjectLabel;
extern PFNGLOBJECTPTRLABELPROC                              glObjectPtrLabel;
extern PFNGLGETOBJECTPTRLABELPROC                           glGetObjectPtrLabel;

// GL_VERSION_4_4
extern PFNGLBUFFERSTORAGEPROC       glBufferStorage;
extern PFNGLCLEARTEXIMAGEPROC       glClearTexImage;
extern PFNGLCLEARTEXSUBIMAGEPROC    glClearTexSubImage;
extern PFNGLBINDBUFFERSBASEPROC     glBindBuffersBase;
extern PFNGLBINDBUFFERSRANGEPROC    glBindBuffersRange;
extern PFNGLBINDTEXTURESPROC        glBindTextures;
extern PFNGLBINDSAMPLERSPROC        glBindSamplers;
extern PFNGLBINDIMAGETEXTURESPROC   glBindImageTextures;
extern PFNGLBINDVERTEXBUFFERSPROC   glBindVertexBuffers;

// GL_VERSION_4_5
extern PFNGLCLIPCONTROLPROC                                     glClipControl;
extern PFNGLCREATETRANSFORMFEEDBACKSPROC                        glCreateTransformFeedbacks;
extern PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC                     glTransformFeedbackBufferBase;
extern PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC                    glTransformFeedbackBufferRange;
extern PFNGLGETTRANSFORMFEEDBACKIVPROC                          glGetTransformFeedbackiv;
extern PFNGLGETTRANSFORMFEEDBACKI_VPROC                         glGetTransformFeedbacki_v;
extern PFNGLGETTRANSFORMFEEDBACKI64_VPROC                       glGetTransformFeedbacki64_v;
extern PFNGLCREATEBUFFERSPROC                                   glCreateBuffers;
extern PFNGLNAMEDBUFFERSTORAGEPROC                              glNamedBufferStorage;
extern PFNGLNAMEDBUFFERDATAPROC                                 glNamedBufferData;
extern PFNGLNAMEDBUFFERSUBDATAPROC                              glNamedBufferSubData;
extern PFNGLCOPYNAMEDBUFFERSUBDATAPROC                          glCopyNamedBufferSubData;
extern PFNGLCLEARNAMEDBUFFERDATAPROC                            glClearNamedBufferData;
extern PFNGLCLEARNAMEDBUFFERSUBDATAPROC                         glClearNamedBufferSubData;
extern PFNGLMAPNAMEDBUFFERPROC                                  glMapNamedBuffer;
extern PFNGLMAPNAMEDBUFFERRANGEPROC                             glMapNamedBufferRange;
extern PFNGLUNMAPNAMEDBUFFERPROC                                glUnmapNamedBuffer;
extern PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC                     glFlushMappedNamedBufferRange;
extern PFNGLGETNAMEDBUFFERPARAMETERIVPROC                       glGetNamedBufferParameteriv;
extern PFNGLGETNAMEDBUFFERPARAMETERI64VPROC                     glGetNamedBufferParameteri64v;
extern PFNGLGETNAMEDBUFFERPOINTERVPROC                          glGetNamedBufferPointerv;
extern PFNGLGETNAMEDBUFFERSUBDATAPROC                           glGetNamedBufferSubData;
extern PFNGLCREATEFRAMEBUFFERSPROC                              glCreateFramebuffers;
extern PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC                    glNamedFramebufferRenderbuffer;
extern PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC                      glNamedFramebufferParameteri;
extern PFNGLNAMEDFRAMEBUFFERTEXTUREPROC                         glNamedFramebufferTexture;
extern PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC                    glNamedFramebufferTextureLayer;
extern PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC                      glNamedFramebufferDrawBuffer;
extern PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC                     glNamedFramebufferDrawBuffers;
extern PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC                      glNamedFramebufferReadBuffer;
extern PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC                  glInvalidateNamedFramebufferData;
extern PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC               glInvalidateNamedFramebufferSubData;
extern PFNGLCLEARNAMEDFRAMEBUFFERIVPROC                         glClearNamedFramebufferiv;
extern PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC                        glClearNamedFramebufferuiv;
extern PFNGLCLEARNAMEDFRAMEBUFFERFVPROC                         glClearNamedFramebufferfv;
extern PFNGLCLEARNAMEDFRAMEBUFFERFIPROC                         glClearNamedFramebufferfi;
extern PFNGLBLITNAMEDFRAMEBUFFERPROC                            glBlitNamedFramebuffer;
extern PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC                     glCheckNamedFramebufferStatus;
extern PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC                  glGetNamedFramebufferParameteriv;
extern PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC        glGetNamedFramebufferAttachmentParameteriv;
extern PFNGLCREATERENDERBUFFERSPROC                             glCreateRenderbuffers;
extern PFNGLNAMEDRENDERBUFFERSTORAGEPROC                        glNamedRenderbufferStorage;
extern PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC             glNamedRenderbufferStorageMultisample;
extern PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC                 glGetNamedRenderbufferParameteriv;
extern PFNGLCREATETEXTURESPROC                                  glCreateTextures;
extern PFNGLTEXTUREBUFFERPROC                                   glTextureBuffer;
extern PFNGLTEXTUREBUFFERRANGEPROC                              glTextureBufferRange;
extern PFNGLTEXTURESTORAGE1DPROC                                glTextureStorage1D;
extern PFNGLTEXTURESTORAGE2DPROC                                glTextureStorage2D;
extern PFNGLTEXTURESTORAGE3DPROC                                glTextureStorage3D;
extern PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC                     glTextureStorage2DMultisample;
extern PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC                     glTextureStorage3DMultisample;
extern PFNGLTEXTURESUBIMAGE1DPROC                               glTextureSubImage1D;
extern PFNGLTEXTURESUBIMAGE2DPROC                               glTextureSubImage2D;
extern PFNGLTEXTURESUBIMAGE3DPROC                               glTextureSubImage3D;
extern PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC                     glCompressedTextureSubImage1D;
extern PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC                     glCompressedTextureSubImage2D;
extern PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC                     glCompressedTextureSubImage3D;
extern PFNGLCOPYTEXTURESUBIMAGE1DPROC                           glCopyTextureSubImage1D;
extern PFNGLCOPYTEXTURESUBIMAGE2DPROC                           glCopyTextureSubImage2D;
extern PFNGLCOPYTEXTURESUBIMAGE3DPROC                           glCopyTextureSubImage3D;
extern PFNGLTEXTUREPARAMETERFPROC                               glTextureParameterf;
extern PFNGLTEXTUREPARAMETERFVPROC                              glTextureParameterfv;
extern PFNGLTEXTUREPARAMETERIPROC                               glTextureParameteri;
extern PFNGLTEXTUREPARAMETERIIVPROC                             glTextureParameterIiv;
extern PFNGLTEXTUREPARAMETERIUIVPROC                            glTextureParameterIuiv;
extern PFNGLTEXTUREPARAMETERIVPROC                              glTextureParameteriv;
extern PFNGLGENERATETEXTUREMIPMAPPROC                           glGenerateTextureMipmap;
extern PFNGLBINDTEXTUREUNITPROC                                 glBindTextureUnit;
extern PFNGLGETTEXTUREIMAGEPROC                                 glGetTextureImage;
extern PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC                       glGetCompressedTextureImage;
extern PFNGLGETTEXTURELEVELPARAMETERFVPROC                      glGetTextureLevelParameterfv;
extern PFNGLGETTEXTURELEVELPARAMETERIVPROC                      glGetTextureLevelParameteriv;
extern PFNGLGETTEXTUREPARAMETERFVPROC                           glGetTextureParameterfv;
extern PFNGLGETTEXTUREPARAMETERIIVPROC                          glGetTextureParameterIiv;
extern PFNGLGETTEXTUREPARAMETERIUIVPROC                         glGetTextureParameterIuiv;
extern PFNGLGETTEXTUREPARAMETERIVPROC                           glGetTextureParameteriv;
extern PFNGLCREATEVERTEXARRAYSPROC                              glCreateVertexArrays;
extern PFNGLDISABLEVERTEXARRAYATTRIBPROC                        glDisableVertexArrayAttrib;
extern PFNGLENABLEVERTEXARRAYATTRIBPROC                         glEnableVertexArrayAttrib;
extern PFNGLVERTEXARRAYELEMENTBUFFERPROC                        glVertexArrayElementBuffer;
extern PFNGLVERTEXARRAYVERTEXBUFFERPROC                         glVertexArrayVertexBuffer;
extern PFNGLVERTEXARRAYVERTEXBUFFERSPROC                        glVertexArrayVertexBuffers;
extern PFNGLVERTEXARRAYATTRIBBINDINGPROC                        glVertexArrayAttribBinding;
extern PFNGLVERTEXARRAYATTRIBFORMATPROC                         glVertexArrayAttribFormat;
extern PFNGLVERTEXARRAYATTRIBIFORMATPROC                        glVertexArrayAttribIFormat;
extern PFNGLVERTEXARRAYATTRIBLFORMATPROC                        glVertexArrayAttribLFormat;
extern PFNGLVERTEXARRAYBINDINGDIVISORPROC                       glVertexArrayBindingDivisor;
extern PFNGLGETVERTEXARRAYIVPROC                                glGetVertexArrayiv;
extern PFNGLGETVERTEXARRAYINDEXEDIVPROC                         glGetVertexArrayIndexediv;
extern PFNGLGETVERTEXARRAYINDEXED64IVPROC                       glGetVertexArrayIndexed64iv;
extern PFNGLCREATESAMPLERSPROC                                  glCreateSamplers;
extern PFNGLCREATEPROGRAMPIPELINESPROC                          glCreateProgramPipelines;
extern PFNGLCREATEQUERIESPROC                                   glCreateQueries;
extern PFNGLGETQUERYBUFFEROBJECTI64VPROC                        glGetQueryBufferObjecti64v;
extern PFNGLGETQUERYBUFFEROBJECTIVPROC                          glGetQueryBufferObjectiv;
extern PFNGLGETQUERYBUFFEROBJECTUI64VPROC                       glGetQueryBufferObjectui64v;
extern PFNGLGETQUERYBUFFEROBJECTUIVPROC                         glGetQueryBufferObjectuiv;
extern PFNGLMEMORYBARRIERBYREGIONPROC                           glMemoryBarrierByRegion;
extern PFNGLGETTEXTURESUBIMAGEPROC                              glGetTextureSubImage;
extern PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC                    glGetCompressedTextureSubImage;
extern PFNGLGETGRAPHICSRESETSTATUSPROC                          glGetGraphicsResetStatus;
extern PFNGLGETNCOMPRESSEDTEXIMAGEPROC                          glGetnCompressedTexImage;
extern PFNGLGETNTEXIMAGEPROC                                    glGetnTexImage;
extern PFNGLGETNUNIFORMDVPROC                                   glGetnUniformdv;
extern PFNGLGETNUNIFORMFVPROC                                   glGetnUniformfv;
extern PFNGLGETNUNIFORMIVPROC                                   glGetnUniformiv;
extern PFNGLGETNUNIFORMUIVPROC                                  glGetnUniformuiv;
extern PFNGLREADNPIXELSPROC                                     glReadnPixels;
extern PFNGLGETNMAPDVPROC                                       glGetnMapdv;
extern PFNGLGETNMAPFVPROC                                       glGetnMapfv;
extern PFNGLGETNMAPIVPROC                                       glGetnMapiv;
extern PFNGLGETNPIXELMAPFVPROC                                  glGetnPixelMapfv;
extern PFNGLGETNPIXELMAPUIVPROC                                 glGetnPixelMapuiv;
extern PFNGLGETNPIXELMAPUSVPROC                                 glGetnPixelMapusv;
extern PFNGLGETNPOLYGONSTIPPLEPROC                              glGetnPolygonStipple;
extern PFNGLGETNCOLORTABLEPROC                                  glGetnColorTable;
extern PFNGLGETNCONVOLUTIONFILTERPROC                           glGetnConvolutionFilter;
extern PFNGLGETNSEPARABLEFILTERPROC                             glGetnSeparableFilter;
extern PFNGLGETNHISTOGRAMPROC                                   glGetnHistogram;
extern PFNGLGETNMINMAXPROC                                      glGetnMinmax;
extern PFNGLTEXTUREBARRIERPROC                                  glTextureBarrier;

// GL_VERSION_4_6
extern PFNGLSPECIALIZESHADERPROC                glSpecializeShader;
extern PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC    glMultiDrawArraysIndirectCount;
extern PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC  glMultiDrawElementsIndirectCount;
extern PFNGLPOLYGONOFFSETCLAMPPROC              glPolygonOffsetClamp;


#elif LL_DARWIN
//----------------------------------------------------------------------------
// LL_DARWIN

#define GL_GLEXT_LEGACY
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>

#define GL_EXT_separate_specular_color 1
#define GL_GLEXT_PROTOTYPES
#include <OpenGL/glext.h>

#define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
#include <OpenGL/gl3.h>

#include "GL/glh_extensions.h"

#if 0
// These symbols don't exist on 10.3.9, so they have to be declared weak.  Redeclaring them here fixes the problem.
// Note that they also must not be called on 10.3.9.  This should be taken care of by a runtime check for the existence of the GL extension.
#include <AvailabilityMacros.h>

//GL_EXT_blend_func_separate
extern void glBlendFuncSeparateEXT(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha) ;

// GL_EXT_framebuffer_object
extern GLboolean glIsRenderbufferEXT(GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glBindRenderbufferEXT(GLenum target, GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glDeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glGenRenderbuffersEXT(GLsizei n, GLuint *renderbuffers) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern GLboolean glIsFramebufferEXT(GLuint framebuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glBindFramebufferEXT(GLenum target, GLuint framebuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glDeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glGenFramebuffersEXT(GLsizei n, GLuint *framebuffers) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern GLenum glCheckFramebufferStatusEXT(GLenum target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;
extern void glGenerateMipmapEXT(GLenum target) AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;

#ifndef GL_ARB_framebuffer_object
#define glGenerateMipmap glGenerateMipmapEXT
#define GL_MAX_SAMPLES  0x8D57
#endif

#ifdef __cplusplus
extern "C" {
#endif

//
// Define map buffer range headers on Mac
//
#ifndef GL_ARB_map_buffer_range
#define GL_MAP_READ_BIT                   0x0001
#define GL_MAP_WRITE_BIT                  0x0002
#define GL_MAP_INVALIDATE_RANGE_BIT       0x0004
#define GL_MAP_INVALIDATE_BUFFER_BIT      0x0008
#define GL_MAP_FLUSH_EXPLICIT_BIT         0x0010
#define GL_MAP_UNSYNCHRONIZED_BIT         0x0020
#endif

//
// Define multisample headers on Mac
//
#ifndef GL_ARB_texture_multisample
#define GL_SAMPLE_POSITION                0x8E50
#define GL_SAMPLE_MASK                    0x8E51
#define GL_SAMPLE_MASK_VALUE              0x8E52
#define GL_MAX_SAMPLE_MASK_WORDS          0x8E59
#define GL_TEXTURE_2D_MULTISAMPLE         0x9100
#define GL_PROXY_TEXTURE_2D_MULTISAMPLE   0x9101
#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY   0x9102
#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103
#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104
#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105
#define GL_TEXTURE_SAMPLES                0x9106
#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107
#define GL_SAMPLER_2D_MULTISAMPLE         0x9108
#define GL_INT_SAMPLER_2D_MULTISAMPLE     0x9109
#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A
#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY   0x910B
#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C
#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D
#define GL_MAX_COLOR_TEXTURE_SAMPLES      0x910E
#define GL_MAX_DEPTH_TEXTURE_SAMPLES      0x910F
#define GL_MAX_INTEGER_SAMPLES            0x9110
#endif

//
// Define vertex buffer object headers on Mac
//
#ifndef GL_ARB_vertex_buffer_object
#define GL_BUFFER_SIZE_ARB                0x8764
#define GL_BUFFER_USAGE_ARB               0x8765
#define GL_ARRAY_BUFFER_ARB               0x8892
#define GL_ELEMENT_ARRAY_BUFFER_ARB       0x8893
#define GL_ARRAY_BUFFER_BINDING_ARB       0x8894
#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895
#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896
#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897
#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898
#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899
#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A
#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B
#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C
#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D
#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E
#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F
#define GL_READ_ONLY_ARB                  0x88B8
#define GL_WRITE_ONLY_ARB                 0x88B9
#define GL_READ_WRITE_ARB                 0x88BA
#define GL_BUFFER_ACCESS_ARB              0x88BB
#define GL_BUFFER_MAPPED_ARB              0x88BC
#define GL_BUFFER_MAP_POINTER_ARB         0x88BD
#define GL_STREAM_DRAW_ARB                0x88E0
#define GL_STREAM_READ_ARB                0x88E1
#define GL_STREAM_COPY_ARB                0x88E2
#define GL_STATIC_DRAW_ARB                0x88E4
#define GL_STATIC_READ_ARB                0x88E5
#define GL_STATIC_COPY_ARB                0x88E6
#define GL_DYNAMIC_DRAW_ARB               0x88E8
#define GL_DYNAMIC_READ_ARB               0x88E9
#define GL_DYNAMIC_COPY_ARB               0x88EA
#endif



#ifndef GL_ARB_vertex_buffer_object
/* GL types for handling large vertex buffer objects */
typedef intptr_t GLintptr;
typedef intptr_t GLsizeiptr;
#endif


#ifndef GL_ARB_vertex_buffer_object
#define GL_ARB_vertex_buffer_object 1
#ifdef GL_GLEXT_FUNCTION_POINTERS
typedef void (* glBindBufferARBProcPtr) (GLenum target, GLuint buffer);
typedef void (* glDeleteBufferARBProcPtr) (GLsizei n, const GLuint *buffers);
typedef void (* glGenBuffersARBProcPtr) (GLsizei n, GLuint *buffers);
typedef GLboolean (* glIsBufferARBProcPtr) (GLuint buffer);
typedef void (* glBufferDataARBProcPtr) (GLenum target, GLsizeiptrARB size, const GLvoid *data, GLenum usage);
typedef void (* glBufferSubDataARBProcPtr) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid *data);
typedef void (* glGetBufferSubDataARBProcPtr) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, GLvoid *data);
typedef GLvoid* (* glMapBufferARBProcPtr) (GLenum target, GLenum access);   /* Flawfinder: ignore */
typedef GLboolean (* glUnmapBufferARBProcPtr) (GLenum target);
typedef void (* glGetBufferParameterivARBProcPtr) (GLenum target, GLenum pname, GLint *params);
typedef void (* glGetBufferPointervARBProcPtr) (GLenum target, GLenum pname, GLvoid* *params);
#else
extern void glBindBufferARB (GLenum, GLuint);
extern void glDeleteBuffersARB (GLsizei, const GLuint *);
extern void glGenBuffersARB (GLsizei, GLuint *);
extern GLboolean glIsBufferARB (GLuint);
extern void glBufferDataARB (GLenum, GLsizeiptrARB, const GLvoid *, GLenum);
extern void glBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, const GLvoid *);
extern void glGetBufferSubDataARB (GLenum, GLintptrARB, GLsizeiptrARB, GLvoid *);
extern GLvoid* glMapBufferARB (GLenum, GLenum);
extern GLboolean glUnmapBufferARB (GLenum);
extern void glGetBufferParameterivARB (GLenum, GLenum, GLint *);
extern void glGetBufferPointervARB (GLenum, GLenum, GLvoid* *);
#endif /* GL_GLEXT_FUNCTION_POINTERS */
#endif

#ifndef GL_ARB_texture_rg
#define GL_RG                             0x8227
#define GL_RG_INTEGER                     0x8228
#define GL_R8                             0x8229
#define GL_R16                            0x822A
#define GL_RG8                            0x822B
#define GL_RG16                           0x822C
#define GL_R16F                           0x822D
#define GL_R32F                           0x822E
#define GL_RG16F                          0x822F
#define GL_RG32F                          0x8230
#define GL_R8I                            0x8231
#define GL_R8UI                           0x8232
#define GL_R16I                           0x8233
#define GL_R16UI                          0x8234
#define GL_R32I                           0x8235
#define GL_R32UI                          0x8236
#define GL_RG8I                           0x8237
#define GL_RG8UI                          0x8238
#define GL_RG16I                          0x8239
#define GL_RG16UI                         0x823A
#define GL_RG32I                          0x823B
#define GL_RG32UI                         0x823C
#endif

// May be needed for DARWIN...
// #ifndef GL_ARB_compressed_tex_image
// #define GL_ARB_compressed_tex_image 1
// #ifdef GL_GLEXT_FUNCTION_POINTERS
// typedef void (* glCompressedTexImage1D) (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid*);
// typedef void (* glCompressedTexImage2D) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*);
// typedef void (* glCompressedTexImage3D) (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*);
// typedef void (* glCompressedTexSubImage1D) (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid*);
// typedef void (* glCompressedTexSubImage2D) (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*);
// typedef void (* glCompressedTexSubImage3D) (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*);
// typedef void (* glGetCompressedTexImage) (GLenum, GLint, GLvoid*);
// #else
// extern void glCompressedTexImage1D (GLenum, GLint, GLenum, GLsizei, GLint, GLsizei, const GLvoid*);
// extern void glCompressedTexImage2D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*);
// extern void glCompressedTexImage3D (GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLsizei, const GLvoid*);
// extern void glCompressedTexSubImage1D (GLenum, GLint, GLint, GLsizei, GLenum, GLsizei, const GLvoid*);
// extern void glCompressedTexSubImage2D (GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*);
// extern void glCompressedTexSubImage3D (GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLsizei, const GLvoid*);
// extern void glGetCompressedTexImage (GLenum, GLint, GLvoid*);
// #endif /* GL_GLEXT_FUNCTION_POINTERS */
// #endif

#ifdef __cplusplus
}
#endif

#include <OpenGL/gl.h>
#endif // 0

#elif LL_LINUX

#define GL_GLEXT_PROTOTYPES
#define GLX_GLEXT_PROTOTYPES

#include "GL/gl.h"
#include "GL/glu.h"
#include "GL/glext.h"
#include "GL/glx.h"

// The __APPLE__ kludge is to make glh_extensions.h not symbol-clash horribly
# define __APPLE__
# include "GL/glh_extensions.h"
# undef __APPLE__

// #include <X11/Xlib.h>
// #include <X11/Xutil.h>
#include "GL/glh_extensions.h"

#endif // LL_MESA / LL_WINDOWS / LL_DARWIN

// Even when GL_ARB_depth_clamp is available in the driver, the (correct)
// headers, and therefore GL_DEPTH_CLAMP might not be defined.
// In that case GL_DEPTH_CLAMP_NV should be defined, but why not just
// use the known numeric.
//
// To avoid #ifdef's in the code. Just define this here.
#ifndef GL_DEPTH_CLAMP
// Probably (still) called GL_DEPTH_CLAMP_NV.
#define GL_DEPTH_CLAMP 0x864F
#endif

//GL_NVX_gpu_memory_info constants
#ifndef GL_NVX_gpu_memory_info
#define GL_NVX_gpu_memory_info
#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX          0x9047
#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX    0x9048
#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX  0x9049
#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX            0x904A
#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX            0x904B
#endif

//GL_ATI_meminfo constants
#ifndef GL_ATI_meminfo
#define GL_ATI_meminfo
#define GL_VBO_FREE_MEMORY_ATI                     0x87FB
#define GL_TEXTURE_FREE_MEMORY_ATI                 0x87FC
#define GL_RENDERBUFFER_FREE_MEMORY_ATI            0x87FD
#endif

#if defined(TRACY_ENABLE) && LL_PROFILER_ENABLE_TRACY_OPENGL
    #include <tracy/TracyOpenGL.hpp>
#endif


#endif // LL_LLGLHEADERS_H