// Copyright (C) 2018-2024, Tellusim Technologies Inc. All rights reserved
// https://tellusim.com/

#include <core/TellusimLog.h>
#include <platform/TellusimContext.h>

#include "../include/TellusimGL.h"

/*
 */
namespace Tellusim {
	
	/*
	 */
	namespace GL {
		
		/*
		 */
		bool init() {
			
			// function address
			#define GET_ADDRESS(TYPE, NAME) { \
				NAME = (TYPE)GLContext::getProcAddress(#NAME); \
				if(NAME == nullptr && is_core) { \
					TS_LOGF(Error, "GL::init(): can't get %s function\n", #NAME); \
					return false; \
				} \
			}
			
			// core functions
			bool is_core = true;
			
			// OpenGL 10 functions
			GET_ADDRESS(PFNGLCULLFACEPROC, glCullFace)
			GET_ADDRESS(PFNGLFRONTFACEPROC, glFrontFace)
			GET_ADDRESS(PFNGLHINTPROC, glHint)
			GET_ADDRESS(PFNGLLINEWIDTHPROC, glLineWidth)
			GET_ADDRESS(PFNGLPOINTSIZEPROC, glPointSize)
			GET_ADDRESS(PFNGLPOLYGONMODEPROC, glPolygonMode)
			GET_ADDRESS(PFNGLSCISSORPROC, glScissor)
			GET_ADDRESS(PFNGLTEXPARAMETERFPROC, glTexParameterf)
			GET_ADDRESS(PFNGLTEXPARAMETERFVPROC, glTexParameterfv)
			GET_ADDRESS(PFNGLTEXPARAMETERIPROC, glTexParameteri)
			GET_ADDRESS(PFNGLTEXPARAMETERIVPROC, glTexParameteriv)
			GET_ADDRESS(PFNGLTEXIMAGE1DPROC, glTexImage1D)
			GET_ADDRESS(PFNGLTEXIMAGE2DPROC, glTexImage2D)
			GET_ADDRESS(PFNGLDRAWBUFFERPROC, glDrawBuffer)
			GET_ADDRESS(PFNGLCLEARPROC, glClear)
			GET_ADDRESS(PFNGLCLEARCOLORPROC, glClearColor)
			GET_ADDRESS(PFNGLCLEARSTENCILPROC, glClearStencil)
			GET_ADDRESS(PFNGLCLEARDEPTHPROC, glClearDepth)
			GET_ADDRESS(PFNGLSTENCILMASKPROC, glStencilMask)
			GET_ADDRESS(PFNGLCOLORMASKPROC, glColorMask)
			GET_ADDRESS(PFNGLDEPTHMASKPROC, glDepthMask)
			GET_ADDRESS(PFNGLDISABLEPROC, glDisable)
			GET_ADDRESS(PFNGLENABLEPROC, glEnable)
			GET_ADDRESS(PFNGLFINISHPROC, glFinish)
			GET_ADDRESS(PFNGLFLUSHPROC, glFlush)
			GET_ADDRESS(PFNGLBLENDFUNCPROC, glBlendFunc)
			GET_ADDRESS(PFNGLLOGICOPPROC, glLogicOp)
			GET_ADDRESS(PFNGLSTENCILFUNCPROC, glStencilFunc)
			GET_ADDRESS(PFNGLSTENCILOPPROC, glStencilOp)
			GET_ADDRESS(PFNGLDEPTHFUNCPROC, glDepthFunc)
			GET_ADDRESS(PFNGLPIXELSTOREFPROC, glPixelStoref)
			GET_ADDRESS(PFNGLPIXELSTOREIPROC, glPixelStorei)
			GET_ADDRESS(PFNGLREADBUFFERPROC, glReadBuffer)
			GET_ADDRESS(PFNGLREADPIXELSPROC, glReadPixels)
			GET_ADDRESS(PFNGLGETBOOLEANVPROC, glGetBooleanv)
			GET_ADDRESS(PFNGLGETDOUBLEVPROC, glGetDoublev)
			GET_ADDRESS(PFNGLGETERRORPROC, glGetError)
			GET_ADDRESS(PFNGLGETFLOATVPROC, glGetFloatv)
			GET_ADDRESS(PFNGLGETINTEGERVPROC, glGetIntegerv)
			GET_ADDRESS(PFNGLGETSTRINGPROC, glGetString)
			GET_ADDRESS(PFNGLGETTEXIMAGEPROC, glGetTexImage)
			GET_ADDRESS(PFNGLGETTEXPARAMETERFVPROC, glGetTexParameterfv)
			GET_ADDRESS(PFNGLGETTEXPARAMETERIVPROC, glGetTexParameteriv)
			GET_ADDRESS(PFNGLGETTEXLEVELPARAMETERFVPROC, glGetTexLevelParameterfv)
			GET_ADDRESS(PFNGLGETTEXLEVELPARAMETERIVPROC, glGetTexLevelParameteriv)
			GET_ADDRESS(PFNGLISENABLEDPROC, glIsEnabled)
			GET_ADDRESS(PFNGLDEPTHRANGEPROC, glDepthRange)
			GET_ADDRESS(PFNGLVIEWPORTPROC, glViewport)
			
			// OpenGL 11 functions
			GET_ADDRESS(PFNGLDRAWARRAYSPROC, glDrawArrays)
			GET_ADDRESS(PFNGLDRAWELEMENTSPROC, glDrawElements)
			GET_ADDRESS(PFNGLGETPOINTERVPROC, glGetPointerv)
			GET_ADDRESS(PFNGLPOLYGONOFFSETPROC, glPolygonOffset)
			GET_ADDRESS(PFNGLCOPYTEXIMAGE1DPROC, glCopyTexImage1D)
			GET_ADDRESS(PFNGLCOPYTEXIMAGE2DPROC, glCopyTexImage2D)
			GET_ADDRESS(PFNGLCOPYTEXSUBIMAGE1DPROC, glCopyTexSubImage1D)
			GET_ADDRESS(PFNGLCOPYTEXSUBIMAGE2DPROC, glCopyTexSubImage2D)
			GET_ADDRESS(PFNGLTEXSUBIMAGE1DPROC, glTexSubImage1D)
			GET_ADDRESS(PFNGLTEXSUBIMAGE2DPROC, glTexSubImage2D)
			GET_ADDRESS(PFNGLBINDTEXTUREPROC, glBindTexture)
			GET_ADDRESS(PFNGLDELETETEXTURESPROC, glDeleteTextures)
			GET_ADDRESS(PFNGLGENTEXTURESPROC, glGenTextures)
			GET_ADDRESS(PFNGLISTEXTUREPROC, glIsTexture)
			
			// OpenGL 12 functions
			GET_ADDRESS(PFNGLDRAWRANGEELEMENTSPROC, glDrawRangeElements)
			GET_ADDRESS(PFNGLTEXIMAGE3DPROC, glTexImage3D)
			GET_ADDRESS(PFNGLTEXSUBIMAGE3DPROC, glTexSubImage3D)
			GET_ADDRESS(PFNGLCOPYTEXSUBIMAGE3DPROC, glCopyTexSubImage3D)
			
			// OpenGL 13 functions
			GET_ADDRESS(PFNGLACTIVETEXTUREPROC, glActiveTexture)
			GET_ADDRESS(PFNGLSAMPLECOVERAGEPROC, glSampleCoverage)
			GET_ADDRESS(PFNGLCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3D)
			GET_ADDRESS(PFNGLCOMPRESSEDTEXIMAGE2DPROC, glCompressedTexImage2D)
			GET_ADDRESS(PFNGLCOMPRESSEDTEXIMAGE1DPROC, glCompressedTexImage1D)
			GET_ADDRESS(PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3D)
			GET_ADDRESS(PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2D)
			GET_ADDRESS(PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC, glCompressedTexSubImage1D)
			GET_ADDRESS(PFNGLGETCOMPRESSEDTEXIMAGEPROC, glGetCompressedTexImage)
			
			// OpenGL 14 functions
			GET_ADDRESS(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate)
			GET_ADDRESS(PFNGLMULTIDRAWARRAYSPROC, glMultiDrawArrays)
			GET_ADDRESS(PFNGLMULTIDRAWELEMENTSPROC, glMultiDrawElements)
			GET_ADDRESS(PFNGLPOINTPARAMETERFPROC, glPointParameterf)
			GET_ADDRESS(PFNGLPOINTPARAMETERFVPROC, glPointParameterfv)
			GET_ADDRESS(PFNGLPOINTPARAMETERIPROC, glPointParameteri)
			GET_ADDRESS(PFNGLPOINTPARAMETERIVPROC, glPointParameteriv)
			GET_ADDRESS(PFNGLBLENDCOLORPROC, glBlendColor)
			GET_ADDRESS(PFNGLBLENDEQUATIONPROC, glBlendEquation)
			
			// OpenGL 15 functions
			GET_ADDRESS(PFNGLGENQUERIESPROC, glGenQueries)
			GET_ADDRESS(PFNGLDELETEQUERIESPROC, glDeleteQueries)
			GET_ADDRESS(PFNGLISQUERYPROC, glIsQuery)
			GET_ADDRESS(PFNGLBEGINQUERYPROC, glBeginQuery)
			GET_ADDRESS(PFNGLENDQUERYPROC, glEndQuery)
			GET_ADDRESS(PFNGLGETQUERYIVPROC, glGetQueryiv)
			GET_ADDRESS(PFNGLGETQUERYOBJECTIVPROC, glGetQueryObjectiv)
			GET_ADDRESS(PFNGLGETQUERYOBJECTUIVPROC, glGetQueryObjectuiv)
			GET_ADDRESS(PFNGLBINDBUFFERPROC, glBindBuffer)
			GET_ADDRESS(PFNGLDELETEBUFFERSPROC, glDeleteBuffers)
			GET_ADDRESS(PFNGLGENBUFFERSPROC, glGenBuffers)
			GET_ADDRESS(PFNGLISBUFFERPROC, glIsBuffer)
			GET_ADDRESS(PFNGLBUFFERDATAPROC, glBufferData)
			GET_ADDRESS(PFNGLBUFFERSUBDATAPROC, glBufferSubData)
			GET_ADDRESS(PFNGLGETBUFFERSUBDATAPROC, glGetBufferSubData)
			GET_ADDRESS(PFNGLMAPBUFFERPROC, glMapBuffer)
			GET_ADDRESS(PFNGLUNMAPBUFFERPROC, glUnmapBuffer)
			GET_ADDRESS(PFNGLGETBUFFERPARAMETERIVPROC, glGetBufferParameteriv)
			GET_ADDRESS(PFNGLGETBUFFERPOINTERVPROC, glGetBufferPointerv)
			
			// OpenGL 20 functions
			GET_ADDRESS(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate)
			GET_ADDRESS(PFNGLDRAWBUFFERSPROC, glDrawBuffers)
			GET_ADDRESS(PFNGLSTENCILOPSEPARATEPROC, glStencilOpSeparate)
			GET_ADDRESS(PFNGLSTENCILFUNCSEPARATEPROC, glStencilFuncSeparate)
			GET_ADDRESS(PFNGLSTENCILMASKSEPARATEPROC, glStencilMaskSeparate)
			GET_ADDRESS(PFNGLATTACHSHADERPROC, glAttachShader)
			GET_ADDRESS(PFNGLBINDATTRIBLOCATIONPROC, glBindAttribLocation)
			GET_ADDRESS(PFNGLCOMPILESHADERPROC, glCompileShader)
			GET_ADDRESS(PFNGLCREATEPROGRAMPROC, glCreateProgram)
			GET_ADDRESS(PFNGLCREATESHADERPROC, glCreateShader)
			GET_ADDRESS(PFNGLDELETEPROGRAMPROC, glDeleteProgram)
			GET_ADDRESS(PFNGLDELETESHADERPROC, glDeleteShader)
			GET_ADDRESS(PFNGLDETACHSHADERPROC, glDetachShader)
			GET_ADDRESS(PFNGLDISABLEVERTEXATTRIBARRAYPROC, glDisableVertexAttribArray)
			GET_ADDRESS(PFNGLENABLEVERTEXATTRIBARRAYPROC, glEnableVertexAttribArray)
			GET_ADDRESS(PFNGLGETACTIVEATTRIBPROC, glGetActiveAttrib)
			GET_ADDRESS(PFNGLGETACTIVEUNIFORMPROC, glGetActiveUniform)
			GET_ADDRESS(PFNGLGETATTACHEDSHADERSPROC, glGetAttachedShaders)
			GET_ADDRESS(PFNGLGETATTRIBLOCATIONPROC, glGetAttribLocation)
			GET_ADDRESS(PFNGLGETPROGRAMIVPROC, glGetProgramiv)
			GET_ADDRESS(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog)
			GET_ADDRESS(PFNGLGETSHADERIVPROC, glGetShaderiv)
			GET_ADDRESS(PFNGLGETSHADERINFOLOGPROC, glGetShaderInfoLog)
			GET_ADDRESS(PFNGLGETSHADERSOURCEPROC, glGetShaderSource)
			GET_ADDRESS(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation)
			GET_ADDRESS(PFNGLGETUNIFORMFVPROC, glGetUniformfv)
			GET_ADDRESS(PFNGLGETUNIFORMIVPROC, glGetUniformiv)
			GET_ADDRESS(PFNGLGETVERTEXATTRIBDVPROC, glGetVertexAttribdv)
			GET_ADDRESS(PFNGLGETVERTEXATTRIBFVPROC, glGetVertexAttribfv)
			GET_ADDRESS(PFNGLGETVERTEXATTRIBIVPROC, glGetVertexAttribiv)
			GET_ADDRESS(PFNGLGETVERTEXATTRIBPOINTERVPROC, glGetVertexAttribPointerv)
			GET_ADDRESS(PFNGLISPROGRAMPROC, glIsProgram)
			GET_ADDRESS(PFNGLISSHADERPROC, glIsShader)
			GET_ADDRESS(PFNGLLINKPROGRAMPROC, glLinkProgram)
			GET_ADDRESS(PFNGLSHADERSOURCEPROC, glShaderSource)
			GET_ADDRESS(PFNGLUSEPROGRAMPROC, glUseProgram)
			GET_ADDRESS(PFNGLUNIFORM1FPROC, glUniform1f)
			GET_ADDRESS(PFNGLUNIFORM2FPROC, glUniform2f)
			GET_ADDRESS(PFNGLUNIFORM3FPROC, glUniform3f)
			GET_ADDRESS(PFNGLUNIFORM4FPROC, glUniform4f)
			GET_ADDRESS(PFNGLUNIFORM1IPROC, glUniform1i)
			GET_ADDRESS(PFNGLUNIFORM2IPROC, glUniform2i)
			GET_ADDRESS(PFNGLUNIFORM3IPROC, glUniform3i)
			GET_ADDRESS(PFNGLUNIFORM4IPROC, glUniform4i)
			GET_ADDRESS(PFNGLUNIFORM1FVPROC, glUniform1fv)
			GET_ADDRESS(PFNGLUNIFORM2FVPROC, glUniform2fv)
			GET_ADDRESS(PFNGLUNIFORM3FVPROC, glUniform3fv)
			GET_ADDRESS(PFNGLUNIFORM4FVPROC, glUniform4fv)
			GET_ADDRESS(PFNGLUNIFORM1IVPROC, glUniform1iv)
			GET_ADDRESS(PFNGLUNIFORM2IVPROC, glUniform2iv)
			GET_ADDRESS(PFNGLUNIFORM3IVPROC, glUniform3iv)
			GET_ADDRESS(PFNGLUNIFORM4IVPROC, glUniform4iv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX2FVPROC, glUniformMatrix2fv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX3FVPROC, glUniformMatrix3fv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX4FVPROC, glUniformMatrix4fv)
			GET_ADDRESS(PFNGLVALIDATEPROGRAMPROC, glValidateProgram)
			GET_ADDRESS(PFNGLVERTEXATTRIB1DPROC, glVertexAttrib1d)
			GET_ADDRESS(PFNGLVERTEXATTRIB1DVPROC, glVertexAttrib1dv)
			GET_ADDRESS(PFNGLVERTEXATTRIB1FPROC, glVertexAttrib1f)
			GET_ADDRESS(PFNGLVERTEXATTRIB1FVPROC, glVertexAttrib1fv)
			GET_ADDRESS(PFNGLVERTEXATTRIB1SPROC, glVertexAttrib1s)
			GET_ADDRESS(PFNGLVERTEXATTRIB1SVPROC, glVertexAttrib1sv)
			GET_ADDRESS(PFNGLVERTEXATTRIB2DPROC, glVertexAttrib2d)
			GET_ADDRESS(PFNGLVERTEXATTRIB2DVPROC, glVertexAttrib2dv)
			GET_ADDRESS(PFNGLVERTEXATTRIB2FPROC, glVertexAttrib2f)
			GET_ADDRESS(PFNGLVERTEXATTRIB2FVPROC, glVertexAttrib2fv)
			GET_ADDRESS(PFNGLVERTEXATTRIB2SPROC, glVertexAttrib2s)
			GET_ADDRESS(PFNGLVERTEXATTRIB2SVPROC, glVertexAttrib2sv)
			GET_ADDRESS(PFNGLVERTEXATTRIB3DPROC, glVertexAttrib3d)
			GET_ADDRESS(PFNGLVERTEXATTRIB3DVPROC, glVertexAttrib3dv)
			GET_ADDRESS(PFNGLVERTEXATTRIB3FPROC, glVertexAttrib3f)
			GET_ADDRESS(PFNGLVERTEXATTRIB3FVPROC, glVertexAttrib3fv)
			GET_ADDRESS(PFNGLVERTEXATTRIB3SPROC, glVertexAttrib3s)
			GET_ADDRESS(PFNGLVERTEXATTRIB3SVPROC, glVertexAttrib3sv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4NBVPROC, glVertexAttrib4Nbv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4NIVPROC, glVertexAttrib4Niv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4NSVPROC, glVertexAttrib4Nsv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4NUBPROC, glVertexAttrib4Nub)
			GET_ADDRESS(PFNGLVERTEXATTRIB4NUBVPROC, glVertexAttrib4Nubv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4NUIVPROC, glVertexAttrib4Nuiv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4NUSVPROC, glVertexAttrib4Nusv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4BVPROC, glVertexAttrib4bv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4DPROC, glVertexAttrib4d)
			GET_ADDRESS(PFNGLVERTEXATTRIB4DVPROC, glVertexAttrib4dv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4FPROC, glVertexAttrib4f)
			GET_ADDRESS(PFNGLVERTEXATTRIB4FVPROC, glVertexAttrib4fv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4IVPROC, glVertexAttrib4iv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4SPROC, glVertexAttrib4s)
			GET_ADDRESS(PFNGLVERTEXATTRIB4SVPROC, glVertexAttrib4sv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4UBVPROC, glVertexAttrib4ubv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4UIVPROC, glVertexAttrib4uiv)
			GET_ADDRESS(PFNGLVERTEXATTRIB4USVPROC, glVertexAttrib4usv)
			GET_ADDRESS(PFNGLVERTEXATTRIBPOINTERPROC, glVertexAttribPointer)
			
			// OpenGL 21 functions
			GET_ADDRESS(PFNGLUNIFORMMATRIX2X3FVPROC, glUniformMatrix2x3fv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX3X2FVPROC, glUniformMatrix3x2fv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX2X4FVPROC, glUniformMatrix2x4fv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX4X2FVPROC, glUniformMatrix4x2fv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX3X4FVPROC, glUniformMatrix3x4fv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX4X3FVPROC, glUniformMatrix4x3fv)
			
			// OpenGL 30 functions
			GET_ADDRESS(PFNGLCOLORMASKIPROC, glColorMaski)
			GET_ADDRESS(PFNGLGETBOOLEANI_VPROC, glGetBooleani_v)
			GET_ADDRESS(PFNGLGETINTEGERI_VPROC, glGetIntegeri_v)
			GET_ADDRESS(PFNGLENABLEIPROC, glEnablei)
			GET_ADDRESS(PFNGLDISABLEIPROC, glDisablei)
			GET_ADDRESS(PFNGLISENABLEDIPROC, glIsEnabledi)
			GET_ADDRESS(PFNGLBEGINTRANSFORMFEEDBACKPROC, glBeginTransformFeedback)
			GET_ADDRESS(PFNGLENDTRANSFORMFEEDBACKPROC, glEndTransformFeedback)
			GET_ADDRESS(PFNGLBINDBUFFERRANGEPROC, glBindBufferRange)
			GET_ADDRESS(PFNGLBINDBUFFERBASEPROC, glBindBufferBase)
			GET_ADDRESS(PFNGLTRANSFORMFEEDBACKVARYINGSPROC, glTransformFeedbackVaryings)
			GET_ADDRESS(PFNGLGETTRANSFORMFEEDBACKVARYINGPROC, glGetTransformFeedbackVarying)
			GET_ADDRESS(PFNGLCLAMPCOLORPROC, glClampColor)
			GET_ADDRESS(PFNGLBEGINCONDITIONALRENDERPROC, glBeginConditionalRender)
			GET_ADDRESS(PFNGLENDCONDITIONALRENDERPROC, glEndConditionalRender)
			GET_ADDRESS(PFNGLVERTEXATTRIBIPOINTERPROC, glVertexAttribIPointer)
			GET_ADDRESS(PFNGLGETVERTEXATTRIBIIVPROC, glGetVertexAttribIiv)
			GET_ADDRESS(PFNGLGETVERTEXATTRIBIUIVPROC, glGetVertexAttribIuiv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI1IPROC, glVertexAttribI1i)
			GET_ADDRESS(PFNGLVERTEXATTRIBI2IPROC, glVertexAttribI2i)
			GET_ADDRESS(PFNGLVERTEXATTRIBI3IPROC, glVertexAttribI3i)
			GET_ADDRESS(PFNGLVERTEXATTRIBI4IPROC, glVertexAttribI4i)
			GET_ADDRESS(PFNGLVERTEXATTRIBI1UIPROC, glVertexAttribI1ui)
			GET_ADDRESS(PFNGLVERTEXATTRIBI2UIPROC, glVertexAttribI2ui)
			GET_ADDRESS(PFNGLVERTEXATTRIBI3UIPROC, glVertexAttribI3ui)
			GET_ADDRESS(PFNGLVERTEXATTRIBI4UIPROC, glVertexAttribI4ui)
			GET_ADDRESS(PFNGLVERTEXATTRIBI1IVPROC, glVertexAttribI1iv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI2IVPROC, glVertexAttribI2iv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI3IVPROC, glVertexAttribI3iv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI4IVPROC, glVertexAttribI4iv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI1UIVPROC, glVertexAttribI1uiv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI2UIVPROC, glVertexAttribI2uiv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI3UIVPROC, glVertexAttribI3uiv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI4UIVPROC, glVertexAttribI4uiv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI4BVPROC, glVertexAttribI4bv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI4SVPROC, glVertexAttribI4sv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI4UBVPROC, glVertexAttribI4ubv)
			GET_ADDRESS(PFNGLVERTEXATTRIBI4USVPROC, glVertexAttribI4usv)
			GET_ADDRESS(PFNGLGETUNIFORMUIVPROC, glGetUniformuiv)
			GET_ADDRESS(PFNGLBINDFRAGDATALOCATIONPROC, glBindFragDataLocation)
			GET_ADDRESS(PFNGLGETFRAGDATALOCATIONPROC, glGetFragDataLocation)
			GET_ADDRESS(PFNGLUNIFORM1UIPROC, glUniform1ui)
			GET_ADDRESS(PFNGLUNIFORM2UIPROC, glUniform2ui)
			GET_ADDRESS(PFNGLUNIFORM3UIPROC, glUniform3ui)
			GET_ADDRESS(PFNGLUNIFORM4UIPROC, glUniform4ui)
			GET_ADDRESS(PFNGLUNIFORM1UIVPROC, glUniform1uiv)
			GET_ADDRESS(PFNGLUNIFORM2UIVPROC, glUniform2uiv)
			GET_ADDRESS(PFNGLUNIFORM3UIVPROC, glUniform3uiv)
			GET_ADDRESS(PFNGLUNIFORM4UIVPROC, glUniform4uiv)
			GET_ADDRESS(PFNGLTEXPARAMETERIIVPROC, glTexParameterIiv)
			GET_ADDRESS(PFNGLTEXPARAMETERIUIVPROC, glTexParameterIuiv)
			GET_ADDRESS(PFNGLGETTEXPARAMETERIIVPROC, glGetTexParameterIiv)
			GET_ADDRESS(PFNGLGETTEXPARAMETERIUIVPROC, glGetTexParameterIuiv)
			GET_ADDRESS(PFNGLCLEARBUFFERIVPROC, glClearBufferiv)
			GET_ADDRESS(PFNGLCLEARBUFFERUIVPROC, glClearBufferuiv)
			GET_ADDRESS(PFNGLCLEARBUFFERFVPROC, glClearBufferfv)
			GET_ADDRESS(PFNGLCLEARBUFFERFIPROC, glClearBufferfi)
			GET_ADDRESS(PFNGLGETSTRINGIPROC, glGetStringi)
			GET_ADDRESS(PFNGLISRENDERBUFFERPROC, glIsRenderbuffer)
			GET_ADDRESS(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer)
			GET_ADDRESS(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers)
			GET_ADDRESS(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers)
			GET_ADDRESS(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage)
			GET_ADDRESS(PFNGLGETRENDERBUFFERPARAMETERIVPROC, glGetRenderbufferParameteriv)
			GET_ADDRESS(PFNGLISFRAMEBUFFERPROC, glIsFramebuffer)
			GET_ADDRESS(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer)
			GET_ADDRESS(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers)
			GET_ADDRESS(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers)
			GET_ADDRESS(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus)
			GET_ADDRESS(PFNGLFRAMEBUFFERTEXTURE1DPROC, glFramebufferTexture1D)
			GET_ADDRESS(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D)
			GET_ADDRESS(PFNGLFRAMEBUFFERTEXTURE3DPROC, glFramebufferTexture3D)
			GET_ADDRESS(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer)
			GET_ADDRESS(PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC, glGetFramebufferAttachmentParameteriv)
			GET_ADDRESS(PFNGLGENERATEMIPMAPPROC, glGenerateMipmap)
			GET_ADDRESS(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer)
			GET_ADDRESS(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample)
			GET_ADDRESS(PFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer)
			GET_ADDRESS(PFNGLMAPBUFFERRANGEPROC, glMapBufferRange)
			GET_ADDRESS(PFNGLFLUSHMAPPEDBUFFERRANGEPROC, glFlushMappedBufferRange)
			GET_ADDRESS(PFNGLBINDVERTEXARRAYPROC, glBindVertexArray)
			GET_ADDRESS(PFNGLDELETEVERTEXARRAYSPROC, glDeleteVertexArrays)
			GET_ADDRESS(PFNGLGENVERTEXARRAYSPROC, glGenVertexArrays)
			GET_ADDRESS(PFNGLISVERTEXARRAYPROC, glIsVertexArray)
			
			// OpenGL 31 functions
			GET_ADDRESS(PFNGLDRAWARRAYSINSTANCEDPROC, glDrawArraysInstanced)
			GET_ADDRESS(PFNGLDRAWELEMENTSINSTANCEDPROC, glDrawElementsInstanced)
			GET_ADDRESS(PFNGLTEXBUFFERPROC, glTexBuffer)
			GET_ADDRESS(PFNGLPRIMITIVERESTARTINDEXPROC, glPrimitiveRestartIndex)
			GET_ADDRESS(PFNGLCOPYBUFFERSUBDATAPROC, glCopyBufferSubData)
			GET_ADDRESS(PFNGLGETUNIFORMINDICESPROC, glGetUniformIndices)
			GET_ADDRESS(PFNGLGETACTIVEUNIFORMSIVPROC, glGetActiveUniformsiv)
			GET_ADDRESS(PFNGLGETACTIVEUNIFORMNAMEPROC, glGetActiveUniformName)
			GET_ADDRESS(PFNGLGETUNIFORMBLOCKINDEXPROC, glGetUniformBlockIndex)
			GET_ADDRESS(PFNGLGETACTIVEUNIFORMBLOCKIVPROC, glGetActiveUniformBlockiv)
			GET_ADDRESS(PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC, glGetActiveUniformBlockName)
			GET_ADDRESS(PFNGLUNIFORMBLOCKBINDINGPROC, glUniformBlockBinding)
			
			// OpenGL 32 functions
			GET_ADDRESS(PFNGLDRAWELEMENTSBASEVERTEXPROC, glDrawElementsBaseVertex)
			GET_ADDRESS(PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC, glDrawRangeElementsBaseVertex)
			GET_ADDRESS(PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC, glDrawElementsInstancedBaseVertex)
			GET_ADDRESS(PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC, glMultiDrawElementsBaseVertex)
			GET_ADDRESS(PFNGLPROVOKINGVERTEXPROC, glProvokingVertex)
			GET_ADDRESS(PFNGLFENCESYNCPROC, glFenceSync)
			GET_ADDRESS(PFNGLISSYNCPROC, glIsSync)
			GET_ADDRESS(PFNGLDELETESYNCPROC, glDeleteSync)
			GET_ADDRESS(PFNGLCLIENTWAITSYNCPROC, glClientWaitSync)
			GET_ADDRESS(PFNGLWAITSYNCPROC, glWaitSync)
			GET_ADDRESS(PFNGLGETINTEGER64VPROC, glGetInteger64v)
			GET_ADDRESS(PFNGLGETSYNCIVPROC, glGetSynciv)
			GET_ADDRESS(PFNGLGETINTEGER64I_VPROC, glGetInteger64i_v)
			GET_ADDRESS(PFNGLGETBUFFERPARAMETERI64VPROC, glGetBufferParameteri64v)
			GET_ADDRESS(PFNGLFRAMEBUFFERTEXTUREPROC, glFramebufferTexture)
			GET_ADDRESS(PFNGLTEXIMAGE2DMULTISAMPLEPROC, glTexImage2DMultisample)
			GET_ADDRESS(PFNGLTEXIMAGE3DMULTISAMPLEPROC, glTexImage3DMultisample)
			GET_ADDRESS(PFNGLGETMULTISAMPLEFVPROC, glGetMultisamplefv)
			GET_ADDRESS(PFNGLSAMPLEMASKIPROC, glSampleMaski)
			
			// OpenGL 33 functions
			GET_ADDRESS(PFNGLBINDFRAGDATALOCATIONINDEXEDPROC, glBindFragDataLocationIndexed)
			GET_ADDRESS(PFNGLGETFRAGDATAINDEXPROC, glGetFragDataIndex)
			GET_ADDRESS(PFNGLGENSAMPLERSPROC, glGenSamplers)
			GET_ADDRESS(PFNGLDELETESAMPLERSPROC, glDeleteSamplers)
			GET_ADDRESS(PFNGLISSAMPLERPROC, glIsSampler)
			GET_ADDRESS(PFNGLBINDSAMPLERPROC, glBindSampler)
			GET_ADDRESS(PFNGLSAMPLERPARAMETERIPROC, glSamplerParameteri)
			GET_ADDRESS(PFNGLSAMPLERPARAMETERIVPROC, glSamplerParameteriv)
			GET_ADDRESS(PFNGLSAMPLERPARAMETERFPROC, glSamplerParameterf)
			GET_ADDRESS(PFNGLSAMPLERPARAMETERFVPROC, glSamplerParameterfv)
			GET_ADDRESS(PFNGLSAMPLERPARAMETERIIVPROC, glSamplerParameterIiv)
			GET_ADDRESS(PFNGLSAMPLERPARAMETERIUIVPROC, glSamplerParameterIuiv)
			GET_ADDRESS(PFNGLGETSAMPLERPARAMETERIVPROC, glGetSamplerParameteriv)
			GET_ADDRESS(PFNGLGETSAMPLERPARAMETERIIVPROC, glGetSamplerParameterIiv)
			GET_ADDRESS(PFNGLGETSAMPLERPARAMETERFVPROC, glGetSamplerParameterfv)
			GET_ADDRESS(PFNGLGETSAMPLERPARAMETERIUIVPROC, glGetSamplerParameterIuiv)
			GET_ADDRESS(PFNGLQUERYCOUNTERPROC, glQueryCounter)
			GET_ADDRESS(PFNGLGETQUERYOBJECTI64VPROC, glGetQueryObjecti64v)
			GET_ADDRESS(PFNGLGETQUERYOBJECTUI64VPROC, glGetQueryObjectui64v)
			GET_ADDRESS(PFNGLVERTEXATTRIBDIVISORPROC, glVertexAttribDivisor)
			GET_ADDRESS(PFNGLVERTEXATTRIBP1UIPROC, glVertexAttribP1ui)
			GET_ADDRESS(PFNGLVERTEXATTRIBP1UIVPROC, glVertexAttribP1uiv)
			GET_ADDRESS(PFNGLVERTEXATTRIBP2UIPROC, glVertexAttribP2ui)
			GET_ADDRESS(PFNGLVERTEXATTRIBP2UIVPROC, glVertexAttribP2uiv)
			GET_ADDRESS(PFNGLVERTEXATTRIBP3UIPROC, glVertexAttribP3ui)
			GET_ADDRESS(PFNGLVERTEXATTRIBP3UIVPROC, glVertexAttribP3uiv)
			GET_ADDRESS(PFNGLVERTEXATTRIBP4UIPROC, glVertexAttribP4ui)
			GET_ADDRESS(PFNGLVERTEXATTRIBP4UIVPROC, glVertexAttribP4uiv)
			
			// OpenGL 40 functions
			GET_ADDRESS(PFNGLMINSAMPLESHADINGPROC, glMinSampleShading)
			GET_ADDRESS(PFNGLBLENDEQUATIONIPROC, glBlendEquationi)
			GET_ADDRESS(PFNGLBLENDEQUATIONSEPARATEIPROC, glBlendEquationSeparatei)
			GET_ADDRESS(PFNGLBLENDFUNCIPROC, glBlendFunci)
			GET_ADDRESS(PFNGLBLENDFUNCSEPARATEIPROC, glBlendFuncSeparatei)
			GET_ADDRESS(PFNGLDRAWARRAYSINDIRECTPROC, glDrawArraysIndirect)
			GET_ADDRESS(PFNGLDRAWELEMENTSINDIRECTPROC, glDrawElementsIndirect)
			GET_ADDRESS(PFNGLUNIFORM1DPROC, glUniform1d)
			GET_ADDRESS(PFNGLUNIFORM2DPROC, glUniform2d)
			GET_ADDRESS(PFNGLUNIFORM3DPROC, glUniform3d)
			GET_ADDRESS(PFNGLUNIFORM4DPROC, glUniform4d)
			GET_ADDRESS(PFNGLUNIFORM1DVPROC, glUniform1dv)
			GET_ADDRESS(PFNGLUNIFORM2DVPROC, glUniform2dv)
			GET_ADDRESS(PFNGLUNIFORM3DVPROC, glUniform3dv)
			GET_ADDRESS(PFNGLUNIFORM4DVPROC, glUniform4dv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX2DVPROC, glUniformMatrix2dv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX3DVPROC, glUniformMatrix3dv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX4DVPROC, glUniformMatrix4dv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX2X3DVPROC, glUniformMatrix2x3dv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX2X4DVPROC, glUniformMatrix2x4dv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX3X2DVPROC, glUniformMatrix3x2dv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX3X4DVPROC, glUniformMatrix3x4dv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX4X2DVPROC, glUniformMatrix4x2dv)
			GET_ADDRESS(PFNGLUNIFORMMATRIX4X3DVPROC, glUniformMatrix4x3dv)
			GET_ADDRESS(PFNGLGETUNIFORMDVPROC, glGetUniformdv)
			GET_ADDRESS(PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC, glGetSubroutineUniformLocation)
			GET_ADDRESS(PFNGLGETSUBROUTINEINDEXPROC, glGetSubroutineIndex)
			GET_ADDRESS(PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC, glGetActiveSubroutineUniformiv)
			GET_ADDRESS(PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC, glGetActiveSubroutineUniformName)
			GET_ADDRESS(PFNGLGETACTIVESUBROUTINENAMEPROC, glGetActiveSubroutineName)
			GET_ADDRESS(PFNGLUNIFORMSUBROUTINESUIVPROC, glUniformSubroutinesuiv)
			GET_ADDRESS(PFNGLGETUNIFORMSUBROUTINEUIVPROC, glGetUniformSubroutineuiv)
			GET_ADDRESS(PFNGLGETPROGRAMSTAGEIVPROC, glGetProgramStageiv)
			GET_ADDRESS(PFNGLPATCHPARAMETERIPROC, glPatchParameteri)
			GET_ADDRESS(PFNGLPATCHPARAMETERFVPROC, glPatchParameterfv)
			GET_ADDRESS(PFNGLBINDTRANSFORMFEEDBACKPROC, glBindTransformFeedback)
			GET_ADDRESS(PFNGLDELETETRANSFORMFEEDBACKSPROC, glDeleteTransformFeedbacks)
			GET_ADDRESS(PFNGLGENTRANSFORMFEEDBACKSPROC, glGenTransformFeedbacks)
			GET_ADDRESS(PFNGLISTRANSFORMFEEDBACKPROC, glIsTransformFeedback)
			GET_ADDRESS(PFNGLPAUSETRANSFORMFEEDBACKPROC, glPauseTransformFeedback)
			GET_ADDRESS(PFNGLRESUMETRANSFORMFEEDBACKPROC, glResumeTransformFeedback)
			GET_ADDRESS(PFNGLDRAWTRANSFORMFEEDBACKPROC, glDrawTransformFeedback)
			GET_ADDRESS(PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC, glDrawTransformFeedbackStream)
			GET_ADDRESS(PFNGLBEGINQUERYINDEXEDPROC, glBeginQueryIndexed)
			GET_ADDRESS(PFNGLENDQUERYINDEXEDPROC, glEndQueryIndexed)
			GET_ADDRESS(PFNGLGETQUERYINDEXEDIVPROC, glGetQueryIndexediv)
			
			// OpenGL extensions
			is_core = false;
			
			// OpenGL 41 functions
			GET_ADDRESS(PFNGLRELEASESHADERCOMPILERPROC, glReleaseShaderCompiler)
			GET_ADDRESS(PFNGLSHADERBINARYPROC, glShaderBinary)
			GET_ADDRESS(PFNGLGETSHADERPRECISIONFORMATPROC, glGetShaderPrecisionFormat)
			GET_ADDRESS(PFNGLDEPTHRANGEFPROC, glDepthRangef)
			GET_ADDRESS(PFNGLCLEARDEPTHFPROC, glClearDepthf)
			GET_ADDRESS(PFNGLGETPROGRAMBINARYPROC, glGetProgramBinary)
			GET_ADDRESS(PFNGLPROGRAMBINARYPROC, glProgramBinary)
			GET_ADDRESS(PFNGLPROGRAMPARAMETERIPROC, glProgramParameteri)
			GET_ADDRESS(PFNGLUSEPROGRAMSTAGESPROC, glUseProgramStages)
			GET_ADDRESS(PFNGLACTIVESHADERPROGRAMPROC, glActiveShaderProgram)
			GET_ADDRESS(PFNGLCREATESHADERPROGRAMVPROC, glCreateShaderProgramv)
			GET_ADDRESS(PFNGLBINDPROGRAMPIPELINEPROC, glBindProgramPipeline)
			GET_ADDRESS(PFNGLDELETEPROGRAMPIPELINESPROC, glDeleteProgramPipelines)
			GET_ADDRESS(PFNGLGENPROGRAMPIPELINESPROC, glGenProgramPipelines)
			GET_ADDRESS(PFNGLISPROGRAMPIPELINEPROC, glIsProgramPipeline)
			GET_ADDRESS(PFNGLGETPROGRAMPIPELINEIVPROC, glGetProgramPipelineiv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM1IPROC, glProgramUniform1i)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM1IVPROC, glProgramUniform1iv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM1FPROC, glProgramUniform1f)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM1FVPROC, glProgramUniform1fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM1DPROC, glProgramUniform1d)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM1DVPROC, glProgramUniform1dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM1UIPROC, glProgramUniform1ui)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM1UIVPROC, glProgramUniform1uiv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM2IPROC, glProgramUniform2i)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM2IVPROC, glProgramUniform2iv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM2FPROC, glProgramUniform2f)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM2FVPROC, glProgramUniform2fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM2DPROC, glProgramUniform2d)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM2DVPROC, glProgramUniform2dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM2UIPROC, glProgramUniform2ui)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM2UIVPROC, glProgramUniform2uiv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM3IPROC, glProgramUniform3i)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM3IVPROC, glProgramUniform3iv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM3FPROC, glProgramUniform3f)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM3FVPROC, glProgramUniform3fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM3DPROC, glProgramUniform3d)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM3DVPROC, glProgramUniform3dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM3UIPROC, glProgramUniform3ui)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM3UIVPROC, glProgramUniform3uiv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM4IPROC, glProgramUniform4i)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM4IVPROC, glProgramUniform4iv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM4FPROC, glProgramUniform4f)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM4FVPROC, glProgramUniform4fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM4DPROC, glProgramUniform4d)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM4DVPROC, glProgramUniform4dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM4UIPROC, glProgramUniform4ui)
			GET_ADDRESS(PFNGLPROGRAMUNIFORM4UIVPROC, glProgramUniform4uiv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX2FVPROC, glProgramUniformMatrix2fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX3FVPROC, glProgramUniformMatrix3fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX4FVPROC, glProgramUniformMatrix4fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX2DVPROC, glProgramUniformMatrix2dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX3DVPROC, glProgramUniformMatrix3dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX4DVPROC, glProgramUniformMatrix4dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC, glProgramUniformMatrix2x3fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC, glProgramUniformMatrix3x2fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC, glProgramUniformMatrix2x4fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC, glProgramUniformMatrix4x2fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC, glProgramUniformMatrix3x4fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC, glProgramUniformMatrix4x3fv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC, glProgramUniformMatrix2x3dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC, glProgramUniformMatrix3x2dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC, glProgramUniformMatrix2x4dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC, glProgramUniformMatrix4x2dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC, glProgramUniformMatrix3x4dv)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC, glProgramUniformMatrix4x3dv)
			GET_ADDRESS(PFNGLVALIDATEPROGRAMPIPELINEPROC, glValidateProgramPipeline)
			GET_ADDRESS(PFNGLGETPROGRAMPIPELINEINFOLOGPROC, glGetProgramPipelineInfoLog)
			GET_ADDRESS(PFNGLVERTEXATTRIBL1DPROC, glVertexAttribL1d)
			GET_ADDRESS(PFNGLVERTEXATTRIBL2DPROC, glVertexAttribL2d)
			GET_ADDRESS(PFNGLVERTEXATTRIBL3DPROC, glVertexAttribL3d)
			GET_ADDRESS(PFNGLVERTEXATTRIBL4DPROC, glVertexAttribL4d)
			GET_ADDRESS(PFNGLVERTEXATTRIBL1DVPROC, glVertexAttribL1dv)
			GET_ADDRESS(PFNGLVERTEXATTRIBL2DVPROC, glVertexAttribL2dv)
			GET_ADDRESS(PFNGLVERTEXATTRIBL3DVPROC, glVertexAttribL3dv)
			GET_ADDRESS(PFNGLVERTEXATTRIBL4DVPROC, glVertexAttribL4dv)
			GET_ADDRESS(PFNGLVERTEXATTRIBLPOINTERPROC, glVertexAttribLPointer)
			GET_ADDRESS(PFNGLGETVERTEXATTRIBLDVPROC, glGetVertexAttribLdv)
			GET_ADDRESS(PFNGLVIEWPORTARRAYVPROC, glViewportArrayv)
			GET_ADDRESS(PFNGLVIEWPORTINDEXEDFPROC, glViewportIndexedf)
			GET_ADDRESS(PFNGLVIEWPORTINDEXEDFVPROC, glViewportIndexedfv)
			GET_ADDRESS(PFNGLSCISSORARRAYVPROC, glScissorArrayv)
			GET_ADDRESS(PFNGLSCISSORINDEXEDPROC, glScissorIndexed)
			GET_ADDRESS(PFNGLSCISSORINDEXEDVPROC, glScissorIndexedv)
			GET_ADDRESS(PFNGLDEPTHRANGEARRAYVPROC, glDepthRangeArrayv)
			GET_ADDRESS(PFNGLDEPTHRANGEINDEXEDPROC, glDepthRangeIndexed)
			GET_ADDRESS(PFNGLGETFLOATI_VPROC, glGetFloati_v)
			GET_ADDRESS(PFNGLGETDOUBLEI_VPROC, glGetDoublei_v)
			
			// OpenGL 42 functions
			GET_ADDRESS(PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC, glDrawArraysInstancedBaseInstance)
			GET_ADDRESS(PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC, glDrawElementsInstancedBaseInstance)
			GET_ADDRESS(PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC, glDrawElementsInstancedBaseVertexBaseInstance)
			GET_ADDRESS(PFNGLGETINTERNALFORMATIVPROC, glGetInternalformativ)
			GET_ADDRESS(PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC, glGetActiveAtomicCounterBufferiv)
			GET_ADDRESS(PFNGLBINDIMAGETEXTUREPROC, glBindImageTexture)
			GET_ADDRESS(PFNGLMEMORYBARRIERPROC, glMemoryBarrier)
			GET_ADDRESS(PFNGLTEXSTORAGE1DPROC, glTexStorage1D)
			GET_ADDRESS(PFNGLTEXSTORAGE2DPROC, glTexStorage2D)
			GET_ADDRESS(PFNGLTEXSTORAGE3DPROC, glTexStorage3D)
			GET_ADDRESS(PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC, glDrawTransformFeedbackInstanced)
			GET_ADDRESS(PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC, glDrawTransformFeedbackStreamInstanced)
			
			// OpenGL 43 functions
			GET_ADDRESS(PFNGLCLEARBUFFERDATAPROC, glClearBufferData)
			GET_ADDRESS(PFNGLCLEARBUFFERSUBDATAPROC, glClearBufferSubData)
			GET_ADDRESS(PFNGLDISPATCHCOMPUTEPROC, glDispatchCompute)
			GET_ADDRESS(PFNGLDISPATCHCOMPUTEINDIRECTPROC, glDispatchComputeIndirect)
			GET_ADDRESS(PFNGLCOPYIMAGESUBDATAPROC, glCopyImageSubData)
			GET_ADDRESS(PFNGLFRAMEBUFFERPARAMETERIPROC, glFramebufferParameteri)
			GET_ADDRESS(PFNGLGETFRAMEBUFFERPARAMETERIVPROC, glGetFramebufferParameteriv)
			GET_ADDRESS(PFNGLGETINTERNALFORMATI64VPROC, glGetInternalformati64v)
			GET_ADDRESS(PFNGLINVALIDATETEXSUBIMAGEPROC, glInvalidateTexSubImage)
			GET_ADDRESS(PFNGLINVALIDATETEXIMAGEPROC, glInvalidateTexImage)
			GET_ADDRESS(PFNGLINVALIDATEBUFFERSUBDATAPROC, glInvalidateBufferSubData)
			GET_ADDRESS(PFNGLINVALIDATEBUFFERDATAPROC, glInvalidateBufferData)
			GET_ADDRESS(PFNGLINVALIDATEFRAMEBUFFERPROC, glInvalidateFramebuffer)
			GET_ADDRESS(PFNGLINVALIDATESUBFRAMEBUFFERPROC, glInvalidateSubFramebuffer)
			GET_ADDRESS(PFNGLMULTIDRAWARRAYSINDIRECTPROC, glMultiDrawArraysIndirect)
			GET_ADDRESS(PFNGLMULTIDRAWELEMENTSINDIRECTPROC, glMultiDrawElementsIndirect)
			GET_ADDRESS(PFNGLGETPROGRAMINTERFACEIVPROC, glGetProgramInterfaceiv)
			GET_ADDRESS(PFNGLGETPROGRAMRESOURCEINDEXPROC, glGetProgramResourceIndex)
			GET_ADDRESS(PFNGLGETPROGRAMRESOURCENAMEPROC, glGetProgramResourceName)
			GET_ADDRESS(PFNGLGETPROGRAMRESOURCEIVPROC, glGetProgramResourceiv)
			GET_ADDRESS(PFNGLGETPROGRAMRESOURCELOCATIONPROC, glGetProgramResourceLocation)
			GET_ADDRESS(PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC, glGetProgramResourceLocationIndex)
			GET_ADDRESS(PFNGLSHADERSTORAGEBLOCKBINDINGPROC, glShaderStorageBlockBinding)
			GET_ADDRESS(PFNGLTEXBUFFERRANGEPROC, glTexBufferRange)
			GET_ADDRESS(PFNGLTEXSTORAGE2DMULTISAMPLEPROC, glTexStorage2DMultisample)
			GET_ADDRESS(PFNGLTEXSTORAGE3DMULTISAMPLEPROC, glTexStorage3DMultisample)
			GET_ADDRESS(PFNGLTEXTUREVIEWPROC, glTextureView)
			GET_ADDRESS(PFNGLBINDVERTEXBUFFERPROC, glBindVertexBuffer)
			GET_ADDRESS(PFNGLVERTEXATTRIBFORMATPROC, glVertexAttribFormat)
			GET_ADDRESS(PFNGLVERTEXATTRIBIFORMATPROC, glVertexAttribIFormat)
			GET_ADDRESS(PFNGLVERTEXATTRIBLFORMATPROC, glVertexAttribLFormat)
			GET_ADDRESS(PFNGLVERTEXATTRIBBINDINGPROC, glVertexAttribBinding)
			GET_ADDRESS(PFNGLVERTEXBINDINGDIVISORPROC, glVertexBindingDivisor)
			GET_ADDRESS(PFNGLDEBUGMESSAGECONTROLPROC, glDebugMessageControl)
			GET_ADDRESS(PFNGLDEBUGMESSAGEINSERTPROC, glDebugMessageInsert)
			GET_ADDRESS(PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback)
			GET_ADDRESS(PFNGLGETDEBUGMESSAGELOGPROC, glGetDebugMessageLog)
			GET_ADDRESS(PFNGLPUSHDEBUGGROUPPROC, glPushDebugGroup)
			GET_ADDRESS(PFNGLPOPDEBUGGROUPPROC, glPopDebugGroup)
			GET_ADDRESS(PFNGLOBJECTLABELPROC, glObjectLabel)
			GET_ADDRESS(PFNGLGETOBJECTLABELPROC, glGetObjectLabel)
			GET_ADDRESS(PFNGLOBJECTPTRLABELPROC, glObjectPtrLabel)
			GET_ADDRESS(PFNGLGETOBJECTPTRLABELPROC, glGetObjectPtrLabel)
			
			// OpenGL 44 functions
			GET_ADDRESS(PFNGLBUFFERSTORAGEPROC, glBufferStorage)
			GET_ADDRESS(PFNGLCLEARTEXIMAGEPROC, glClearTexImage)
			GET_ADDRESS(PFNGLCLEARTEXSUBIMAGEPROC, glClearTexSubImage)
			GET_ADDRESS(PFNGLBINDBUFFERSBASEPROC, glBindBuffersBase)
			GET_ADDRESS(PFNGLBINDBUFFERSRANGEPROC, glBindBuffersRange)
			GET_ADDRESS(PFNGLBINDTEXTURESPROC, glBindTextures)
			GET_ADDRESS(PFNGLBINDSAMPLERSPROC, glBindSamplers)
			GET_ADDRESS(PFNGLBINDIMAGETEXTURESPROC, glBindImageTextures)
			GET_ADDRESS(PFNGLBINDVERTEXBUFFERSPROC, glBindVertexBuffers)
			
			// OpenGL 45 functions
			GET_ADDRESS(PFNGLCLIPCONTROLPROC, glClipControl)
			GET_ADDRESS(PFNGLCREATETRANSFORMFEEDBACKSPROC, glCreateTransformFeedbacks)
			GET_ADDRESS(PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC, glTransformFeedbackBufferBase)
			GET_ADDRESS(PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC, glTransformFeedbackBufferRange)
			GET_ADDRESS(PFNGLGETTRANSFORMFEEDBACKIVPROC, glGetTransformFeedbackiv)
			GET_ADDRESS(PFNGLGETTRANSFORMFEEDBACKI_VPROC, glGetTransformFeedbacki_v)
			GET_ADDRESS(PFNGLGETTRANSFORMFEEDBACKI64_VPROC, glGetTransformFeedbacki64_v)
			GET_ADDRESS(PFNGLCREATEBUFFERSPROC, glCreateBuffers)
			GET_ADDRESS(PFNGLNAMEDBUFFERSTORAGEPROC, glNamedBufferStorage)
			GET_ADDRESS(PFNGLNAMEDBUFFERDATAPROC, glNamedBufferData)
			GET_ADDRESS(PFNGLNAMEDBUFFERSUBDATAPROC, glNamedBufferSubData)
			GET_ADDRESS(PFNGLCOPYNAMEDBUFFERSUBDATAPROC, glCopyNamedBufferSubData)
			GET_ADDRESS(PFNGLCLEARNAMEDBUFFERDATAPROC, glClearNamedBufferData)
			GET_ADDRESS(PFNGLCLEARNAMEDBUFFERSUBDATAPROC, glClearNamedBufferSubData)
			GET_ADDRESS(PFNGLMAPNAMEDBUFFERPROC, glMapNamedBuffer)
			GET_ADDRESS(PFNGLMAPNAMEDBUFFERRANGEPROC, glMapNamedBufferRange)
			GET_ADDRESS(PFNGLUNMAPNAMEDBUFFERPROC, glUnmapNamedBuffer)
			GET_ADDRESS(PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC, glFlushMappedNamedBufferRange)
			GET_ADDRESS(PFNGLGETNAMEDBUFFERPARAMETERIVPROC, glGetNamedBufferParameteriv)
			GET_ADDRESS(PFNGLGETNAMEDBUFFERPARAMETERI64VPROC, glGetNamedBufferParameteri64v)
			GET_ADDRESS(PFNGLGETNAMEDBUFFERPOINTERVPROC, glGetNamedBufferPointerv)
			GET_ADDRESS(PFNGLGETNAMEDBUFFERSUBDATAPROC, glGetNamedBufferSubData)
			GET_ADDRESS(PFNGLCREATEFRAMEBUFFERSPROC, glCreateFramebuffers)
			GET_ADDRESS(PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC, glNamedFramebufferRenderbuffer)
			GET_ADDRESS(PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC, glNamedFramebufferParameteri)
			GET_ADDRESS(PFNGLNAMEDFRAMEBUFFERTEXTUREPROC, glNamedFramebufferTexture)
			GET_ADDRESS(PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC, glNamedFramebufferTextureLayer)
			GET_ADDRESS(PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC, glNamedFramebufferDrawBuffer)
			GET_ADDRESS(PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC, glNamedFramebufferDrawBuffers)
			GET_ADDRESS(PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC, glNamedFramebufferReadBuffer)
			GET_ADDRESS(PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC, glInvalidateNamedFramebufferData)
			GET_ADDRESS(PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC, glInvalidateNamedFramebufferSubData)
			GET_ADDRESS(PFNGLCLEARNAMEDFRAMEBUFFERIVPROC, glClearNamedFramebufferiv)
			GET_ADDRESS(PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC, glClearNamedFramebufferuiv)
			GET_ADDRESS(PFNGLCLEARNAMEDFRAMEBUFFERFVPROC, glClearNamedFramebufferfv)
			GET_ADDRESS(PFNGLCLEARNAMEDFRAMEBUFFERFIPROC, glClearNamedFramebufferfi)
			GET_ADDRESS(PFNGLBLITNAMEDFRAMEBUFFERPROC, glBlitNamedFramebuffer)
			GET_ADDRESS(PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC, glCheckNamedFramebufferStatus)
			GET_ADDRESS(PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC, glGetNamedFramebufferParameteriv)
			GET_ADDRESS(PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC, glGetNamedFramebufferAttachmentParameteriv)
			GET_ADDRESS(PFNGLCREATERENDERBUFFERSPROC, glCreateRenderbuffers)
			GET_ADDRESS(PFNGLNAMEDRENDERBUFFERSTORAGEPROC, glNamedRenderbufferStorage)
			GET_ADDRESS(PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC, glNamedRenderbufferStorageMultisample)
			GET_ADDRESS(PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC, glGetNamedRenderbufferParameteriv)
			GET_ADDRESS(PFNGLCREATETEXTURESPROC, glCreateTextures)
			GET_ADDRESS(PFNGLTEXTUREBUFFERPROC, glTextureBuffer)
			GET_ADDRESS(PFNGLTEXTUREBUFFERRANGEPROC, glTextureBufferRange)
			GET_ADDRESS(PFNGLTEXTURESTORAGE1DPROC, glTextureStorage1D)
			GET_ADDRESS(PFNGLTEXTURESTORAGE2DPROC, glTextureStorage2D)
			GET_ADDRESS(PFNGLTEXTURESTORAGE3DPROC, glTextureStorage3D)
			GET_ADDRESS(PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC, glTextureStorage2DMultisample)
			GET_ADDRESS(PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC, glTextureStorage3DMultisample)
			GET_ADDRESS(PFNGLTEXTURESUBIMAGE1DPROC, glTextureSubImage1D)
			GET_ADDRESS(PFNGLTEXTURESUBIMAGE2DPROC, glTextureSubImage2D)
			GET_ADDRESS(PFNGLTEXTURESUBIMAGE3DPROC, glTextureSubImage3D)
			GET_ADDRESS(PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC, glCompressedTextureSubImage1D)
			GET_ADDRESS(PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC, glCompressedTextureSubImage2D)
			GET_ADDRESS(PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC, glCompressedTextureSubImage3D)
			GET_ADDRESS(PFNGLCOPYTEXTURESUBIMAGE1DPROC, glCopyTextureSubImage1D)
			GET_ADDRESS(PFNGLCOPYTEXTURESUBIMAGE2DPROC, glCopyTextureSubImage2D)
			GET_ADDRESS(PFNGLCOPYTEXTURESUBIMAGE3DPROC, glCopyTextureSubImage3D)
			GET_ADDRESS(PFNGLTEXTUREPARAMETERFPROC, glTextureParameterf)
			GET_ADDRESS(PFNGLTEXTUREPARAMETERFVPROC, glTextureParameterfv)
			GET_ADDRESS(PFNGLTEXTUREPARAMETERIPROC, glTextureParameteri)
			GET_ADDRESS(PFNGLTEXTUREPARAMETERIIVPROC, glTextureParameterIiv)
			GET_ADDRESS(PFNGLTEXTUREPARAMETERIUIVPROC, glTextureParameterIuiv)
			GET_ADDRESS(PFNGLTEXTUREPARAMETERIVPROC, glTextureParameteriv)
			GET_ADDRESS(PFNGLGENERATETEXTUREMIPMAPPROC, glGenerateTextureMipmap)
			GET_ADDRESS(PFNGLBINDTEXTUREUNITPROC, glBindTextureUnit)
			GET_ADDRESS(PFNGLGETTEXTUREIMAGEPROC, glGetTextureImage)
			GET_ADDRESS(PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC, glGetCompressedTextureImage)
			GET_ADDRESS(PFNGLGETTEXTURELEVELPARAMETERFVPROC, glGetTextureLevelParameterfv)
			GET_ADDRESS(PFNGLGETTEXTURELEVELPARAMETERIVPROC, glGetTextureLevelParameteriv)
			GET_ADDRESS(PFNGLGETTEXTUREPARAMETERFVPROC, glGetTextureParameterfv)
			GET_ADDRESS(PFNGLGETTEXTUREPARAMETERIIVPROC, glGetTextureParameterIiv)
			GET_ADDRESS(PFNGLGETTEXTUREPARAMETERIUIVPROC, glGetTextureParameterIuiv)
			GET_ADDRESS(PFNGLGETTEXTUREPARAMETERIVPROC, glGetTextureParameteriv)
			GET_ADDRESS(PFNGLCREATEVERTEXARRAYSPROC, glCreateVertexArrays)
			GET_ADDRESS(PFNGLDISABLEVERTEXARRAYATTRIBPROC, glDisableVertexArrayAttrib)
			GET_ADDRESS(PFNGLENABLEVERTEXARRAYATTRIBPROC, glEnableVertexArrayAttrib)
			GET_ADDRESS(PFNGLVERTEXARRAYELEMENTBUFFERPROC, glVertexArrayElementBuffer)
			GET_ADDRESS(PFNGLVERTEXARRAYVERTEXBUFFERPROC, glVertexArrayVertexBuffer)
			GET_ADDRESS(PFNGLVERTEXARRAYVERTEXBUFFERSPROC, glVertexArrayVertexBuffers)
			GET_ADDRESS(PFNGLVERTEXARRAYATTRIBBINDINGPROC, glVertexArrayAttribBinding)
			GET_ADDRESS(PFNGLVERTEXARRAYATTRIBFORMATPROC, glVertexArrayAttribFormat)
			GET_ADDRESS(PFNGLVERTEXARRAYATTRIBIFORMATPROC, glVertexArrayAttribIFormat)
			GET_ADDRESS(PFNGLVERTEXARRAYATTRIBLFORMATPROC, glVertexArrayAttribLFormat)
			GET_ADDRESS(PFNGLVERTEXARRAYBINDINGDIVISORPROC, glVertexArrayBindingDivisor)
			GET_ADDRESS(PFNGLGETVERTEXARRAYIVPROC, glGetVertexArrayiv)
			GET_ADDRESS(PFNGLGETVERTEXARRAYINDEXEDIVPROC, glGetVertexArrayIndexediv)
			GET_ADDRESS(PFNGLGETVERTEXARRAYINDEXED64IVPROC, glGetVertexArrayIndexed64iv)
			GET_ADDRESS(PFNGLCREATESAMPLERSPROC, glCreateSamplers)
			GET_ADDRESS(PFNGLCREATEPROGRAMPIPELINESPROC, glCreateProgramPipelines)
			GET_ADDRESS(PFNGLCREATEQUERIESPROC, glCreateQueries)
			GET_ADDRESS(PFNGLGETQUERYBUFFEROBJECTI64VPROC, glGetQueryBufferObjecti64v)
			GET_ADDRESS(PFNGLGETQUERYBUFFEROBJECTIVPROC, glGetQueryBufferObjectiv)
			GET_ADDRESS(PFNGLGETQUERYBUFFEROBJECTUI64VPROC, glGetQueryBufferObjectui64v)
			GET_ADDRESS(PFNGLGETQUERYBUFFEROBJECTUIVPROC, glGetQueryBufferObjectuiv)
			GET_ADDRESS(PFNGLMEMORYBARRIERBYREGIONPROC, glMemoryBarrierByRegion)
			GET_ADDRESS(PFNGLGETTEXTURESUBIMAGEPROC, glGetTextureSubImage)
			GET_ADDRESS(PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC, glGetCompressedTextureSubImage)
			GET_ADDRESS(PFNGLGETGRAPHICSRESETSTATUSPROC, glGetGraphicsResetStatus)
			GET_ADDRESS(PFNGLGETNCOMPRESSEDTEXIMAGEPROC, glGetnCompressedTexImage)
			GET_ADDRESS(PFNGLGETNTEXIMAGEPROC, glGetnTexImage)
			GET_ADDRESS(PFNGLGETNUNIFORMDVPROC, glGetnUniformdv)
			GET_ADDRESS(PFNGLGETNUNIFORMFVPROC, glGetnUniformfv)
			GET_ADDRESS(PFNGLGETNUNIFORMIVPROC, glGetnUniformiv)
			GET_ADDRESS(PFNGLGETNUNIFORMUIVPROC, glGetnUniformuiv)
			GET_ADDRESS(PFNGLREADNPIXELSPROC, glReadnPixels)
			GET_ADDRESS(PFNGLTEXTUREBARRIERPROC, glTextureBarrier)
			
			// OpenGL 46 functions
			GET_ADDRESS(PFNGLSPECIALIZESHADERPROC, glSpecializeShader)
			GET_ADDRESS(PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC, glMultiDrawArraysIndirectCount)
			GET_ADDRESS(PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC, glMultiDrawElementsIndirectCount)
			GET_ADDRESS(PFNGLPOLYGONOFFSETCLAMPPROC, glPolygonOffsetClamp)
			
			// ARB sparse buffer
			GET_ADDRESS(PFNGLBUFFERPAGECOMMITMENTARBPROC, glBufferPageCommitmentARB)
			GET_ADDRESS(PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC, glNamedBufferPageCommitmentEXT)
			
			// ARB sparse texture
			GET_ADDRESS(PFNGLTEXPAGECOMMITMENTARBPROC, glTexPageCommitmentARB)
			GET_ADDRESS(PFNGLTEXTUREPAGECOMMITMENTEXTPROC, glTexturePageCommitmentEXT)
			
			// ARB bindless texture
			GET_ADDRESS(PFNGLGETTEXTUREHANDLEARBPROC, glGetTextureHandleARB)
			GET_ADDRESS(PFNGLGETTEXTURESAMPLERHANDLEARBPROC, glGetTextureSamplerHandleARB)
			GET_ADDRESS(PFNGLMAKETEXTUREHANDLERESIDENTARBPROC, glMakeTextureHandleResidentARB)
			GET_ADDRESS(PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC, glMakeTextureHandleNonResidentARB)
			GET_ADDRESS(PFNGLGETIMAGEHANDLEARBPROC, glGetImageHandleARB)
			GET_ADDRESS(PFNGLMAKEIMAGEHANDLERESIDENTARBPROC, glMakeImageHandleResidentARB)
			GET_ADDRESS(PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC, glMakeImageHandleNonResidentARB)
			GET_ADDRESS(PFNGLUNIFORMHANDLEUI64ARBPROC, glUniformHandleui64ARB)
			GET_ADDRESS(PFNGLUNIFORMHANDLEUI64VARBPROC, glUniformHandleui64vARB)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC, glProgramUniformHandleui64ARB)
			GET_ADDRESS(PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC, glProgramUniformHandleui64vARB)
			GET_ADDRESS(PFNGLISTEXTUREHANDLERESIDENTARBPROC, glIsTextureHandleResidentARB)
			GET_ADDRESS(PFNGLISIMAGEHANDLERESIDENTARBPROC, glIsImageHandleResidentARB)
			GET_ADDRESS(PFNGLVERTEXATTRIBL1UI64ARBPROC, glVertexAttribL1ui64ARB)
			GET_ADDRESS(PFNGLVERTEXATTRIBL1UI64VARBPROC, glVertexAttribL1ui64vARB)
			GET_ADDRESS(PFNGLGETVERTEXATTRIBLUI64VARBPROC, glGetVertexAttribLui64vARB)
			
			return true;
		}
	}
	
	/*****************************************************************************\
	 *
	 * OpenGL functions
	 *
	\*****************************************************************************/
	
	// OpenGL 10 functions
	PFNGLCULLFACEPROC glCullFace = nullptr;
	PFNGLFRONTFACEPROC glFrontFace = nullptr;
	PFNGLHINTPROC glHint = nullptr;
	PFNGLLINEWIDTHPROC glLineWidth = nullptr;
	PFNGLPOINTSIZEPROC glPointSize = nullptr;
	PFNGLPOLYGONMODEPROC glPolygonMode = nullptr;
	PFNGLSCISSORPROC glScissor = nullptr;
	PFNGLTEXPARAMETERFPROC glTexParameterf = nullptr;
	PFNGLTEXPARAMETERFVPROC glTexParameterfv = nullptr;
	PFNGLTEXPARAMETERIPROC glTexParameteri = nullptr;
	PFNGLTEXPARAMETERIVPROC glTexParameteriv = nullptr;
	PFNGLTEXIMAGE1DPROC glTexImage1D = nullptr;
	PFNGLTEXIMAGE2DPROC glTexImage2D = nullptr;
	PFNGLDRAWBUFFERPROC glDrawBuffer = nullptr;
	PFNGLCLEARPROC glClear = nullptr;
	PFNGLCLEARCOLORPROC glClearColor = nullptr;
	PFNGLCLEARSTENCILPROC glClearStencil = nullptr;
	PFNGLCLEARDEPTHPROC glClearDepth = nullptr;
	PFNGLSTENCILMASKPROC glStencilMask = nullptr;
	PFNGLCOLORMASKPROC glColorMask = nullptr;
	PFNGLDEPTHMASKPROC glDepthMask = nullptr;
	PFNGLDISABLEPROC glDisable = nullptr;
	PFNGLENABLEPROC glEnable = nullptr;
	PFNGLFINISHPROC glFinish = nullptr;
	PFNGLFLUSHPROC glFlush = nullptr;
	PFNGLBLENDFUNCPROC glBlendFunc = nullptr;
	PFNGLLOGICOPPROC glLogicOp = nullptr;
	PFNGLSTENCILFUNCPROC glStencilFunc = nullptr;
	PFNGLSTENCILOPPROC glStencilOp = nullptr;
	PFNGLDEPTHFUNCPROC glDepthFunc = nullptr;
	PFNGLPIXELSTOREFPROC glPixelStoref = nullptr;
	PFNGLPIXELSTOREIPROC glPixelStorei = nullptr;
	PFNGLREADBUFFERPROC glReadBuffer = nullptr;
	PFNGLREADPIXELSPROC glReadPixels = nullptr;
	PFNGLGETBOOLEANVPROC glGetBooleanv = nullptr;
	PFNGLGETDOUBLEVPROC glGetDoublev = nullptr;
	PFNGLGETERRORPROC glGetError = nullptr;
	PFNGLGETFLOATVPROC glGetFloatv = nullptr;
	PFNGLGETINTEGERVPROC glGetIntegerv = nullptr;
	PFNGLGETSTRINGPROC glGetString = nullptr;
	PFNGLGETTEXIMAGEPROC glGetTexImage = nullptr;
	PFNGLGETTEXPARAMETERFVPROC glGetTexParameterfv = nullptr;
	PFNGLGETTEXPARAMETERIVPROC glGetTexParameteriv = nullptr;
	PFNGLGETTEXLEVELPARAMETERFVPROC glGetTexLevelParameterfv = nullptr;
	PFNGLGETTEXLEVELPARAMETERIVPROC glGetTexLevelParameteriv = nullptr;
	PFNGLISENABLEDPROC glIsEnabled = nullptr;
	PFNGLDEPTHRANGEPROC glDepthRange = nullptr;
	PFNGLVIEWPORTPROC glViewport = nullptr;
	
	// OpenGL 11 functions
	PFNGLDRAWARRAYSPROC glDrawArrays = nullptr;
	PFNGLDRAWELEMENTSPROC glDrawElements = nullptr;
	PFNGLGETPOINTERVPROC glGetPointerv = nullptr;
	PFNGLPOLYGONOFFSETPROC glPolygonOffset = nullptr;
	PFNGLCOPYTEXIMAGE1DPROC glCopyTexImage1D = nullptr;
	PFNGLCOPYTEXIMAGE2DPROC glCopyTexImage2D = nullptr;
	PFNGLCOPYTEXSUBIMAGE1DPROC glCopyTexSubImage1D = nullptr;
	PFNGLCOPYTEXSUBIMAGE2DPROC glCopyTexSubImage2D = nullptr;
	PFNGLTEXSUBIMAGE1DPROC glTexSubImage1D = nullptr;
	PFNGLTEXSUBIMAGE2DPROC glTexSubImage2D = nullptr;
	PFNGLBINDTEXTUREPROC glBindTexture = nullptr;
	PFNGLDELETETEXTURESPROC glDeleteTextures = nullptr;
	PFNGLGENTEXTURESPROC glGenTextures = nullptr;
	PFNGLISTEXTUREPROC glIsTexture = nullptr;
	
	// OpenGL 12 functions
	PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements = nullptr;
	PFNGLTEXIMAGE3DPROC glTexImage3D = nullptr;
	PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D = nullptr;
	PFNGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D = nullptr;
	
	// OpenGL 13 functions
	PFNGLACTIVETEXTUREPROC glActiveTexture = nullptr;
	PFNGLSAMPLECOVERAGEPROC glSampleCoverage = nullptr;
	PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D = nullptr;
	PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D = nullptr;
	PFNGLCOMPRESSEDTEXIMAGE1DPROC glCompressedTexImage1D = nullptr;
	PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D = nullptr;
	PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D = nullptr;
	PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glCompressedTexSubImage1D = nullptr;
	PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage = nullptr;
	
	// OpenGL 14 functions
	PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate = nullptr;
	PFNGLMULTIDRAWARRAYSPROC glMultiDrawArrays = nullptr;
	PFNGLMULTIDRAWELEMENTSPROC glMultiDrawElements = nullptr;
	PFNGLPOINTPARAMETERFPROC glPointParameterf = nullptr;
	PFNGLPOINTPARAMETERFVPROC glPointParameterfv = nullptr;
	PFNGLPOINTPARAMETERIPROC glPointParameteri = nullptr;
	PFNGLPOINTPARAMETERIVPROC glPointParameteriv = nullptr;
	PFNGLBLENDCOLORPROC glBlendColor = nullptr;
	PFNGLBLENDEQUATIONPROC glBlendEquation = nullptr;
	
	// OpenGL 15 functions
	PFNGLGENQUERIESPROC glGenQueries = nullptr;
	PFNGLDELETEQUERIESPROC glDeleteQueries = nullptr;
	PFNGLISQUERYPROC glIsQuery = nullptr;
	PFNGLBEGINQUERYPROC glBeginQuery = nullptr;
	PFNGLENDQUERYPROC glEndQuery = nullptr;
	PFNGLGETQUERYIVPROC glGetQueryiv = nullptr;
	PFNGLGETQUERYOBJECTIVPROC glGetQueryObjectiv = nullptr;
	PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv = nullptr;
	PFNGLBINDBUFFERPROC glBindBuffer = nullptr;
	PFNGLDELETEBUFFERSPROC glDeleteBuffers = nullptr;
	PFNGLGENBUFFERSPROC glGenBuffers = nullptr;
	PFNGLISBUFFERPROC glIsBuffer = nullptr;
	PFNGLBUFFERDATAPROC glBufferData = nullptr;
	PFNGLBUFFERSUBDATAPROC glBufferSubData = nullptr;
	PFNGLGETBUFFERSUBDATAPROC glGetBufferSubData = nullptr;
	PFNGLMAPBUFFERPROC glMapBuffer = nullptr;
	PFNGLUNMAPBUFFERPROC glUnmapBuffer = nullptr;
	PFNGLGETBUFFERPARAMETERIVPROC glGetBufferParameteriv = nullptr;
	PFNGLGETBUFFERPOINTERVPROC glGetBufferPointerv = nullptr;
	
	// OpenGL 20 functions
	PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate = nullptr;
	PFNGLDRAWBUFFERSPROC glDrawBuffers = nullptr;
	PFNGLSTENCILOPSEPARATEPROC glStencilOpSeparate = nullptr;
	PFNGLSTENCILFUNCSEPARATEPROC glStencilFuncSeparate = nullptr;
	PFNGLSTENCILMASKSEPARATEPROC glStencilMaskSeparate = nullptr;
	PFNGLATTACHSHADERPROC glAttachShader = nullptr;
	PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation = nullptr;
	PFNGLCOMPILESHADERPROC glCompileShader = nullptr;
	PFNGLCREATEPROGRAMPROC glCreateProgram = nullptr;
	PFNGLCREATESHADERPROC glCreateShader = nullptr;
	PFNGLDELETEPROGRAMPROC glDeleteProgram = nullptr;
	PFNGLDELETESHADERPROC glDeleteShader = nullptr;
	PFNGLDETACHSHADERPROC glDetachShader = nullptr;
	PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray = nullptr;
	PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = nullptr;
	PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib = nullptr;
	PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform = nullptr;
	PFNGLGETATTACHEDSHADERSPROC glGetAttachedShaders = nullptr;
	PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation = nullptr;
	PFNGLGETPROGRAMIVPROC glGetProgramiv = nullptr;
	PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog = nullptr;
	PFNGLGETSHADERIVPROC glGetShaderiv = nullptr;
	PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = nullptr;
	PFNGLGETSHADERSOURCEPROC glGetShaderSource = nullptr;
	PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = nullptr;
	PFNGLGETUNIFORMFVPROC glGetUniformfv = nullptr;
	PFNGLGETUNIFORMIVPROC glGetUniformiv = nullptr;
	PFNGLGETVERTEXATTRIBDVPROC glGetVertexAttribdv = nullptr;
	PFNGLGETVERTEXATTRIBFVPROC glGetVertexAttribfv = nullptr;
	PFNGLGETVERTEXATTRIBIVPROC glGetVertexAttribiv = nullptr;
	PFNGLGETVERTEXATTRIBPOINTERVPROC glGetVertexAttribPointerv = nullptr;
	PFNGLISPROGRAMPROC glIsProgram = nullptr;
	PFNGLISSHADERPROC glIsShader = nullptr;
	PFNGLLINKPROGRAMPROC glLinkProgram = nullptr;
	PFNGLSHADERSOURCEPROC glShaderSource = nullptr;
	PFNGLUSEPROGRAMPROC glUseProgram = nullptr;
	PFNGLUNIFORM1FPROC glUniform1f = nullptr;
	PFNGLUNIFORM2FPROC glUniform2f = nullptr;
	PFNGLUNIFORM3FPROC glUniform3f = nullptr;
	PFNGLUNIFORM4FPROC glUniform4f = nullptr;
	PFNGLUNIFORM1IPROC glUniform1i = nullptr;
	PFNGLUNIFORM2IPROC glUniform2i = nullptr;
	PFNGLUNIFORM3IPROC glUniform3i = nullptr;
	PFNGLUNIFORM4IPROC glUniform4i = nullptr;
	PFNGLUNIFORM1FVPROC glUniform1fv = nullptr;
	PFNGLUNIFORM2FVPROC glUniform2fv = nullptr;
	PFNGLUNIFORM3FVPROC glUniform3fv = nullptr;
	PFNGLUNIFORM4FVPROC glUniform4fv = nullptr;
	PFNGLUNIFORM1IVPROC glUniform1iv = nullptr;
	PFNGLUNIFORM2IVPROC glUniform2iv = nullptr;
	PFNGLUNIFORM3IVPROC glUniform3iv = nullptr;
	PFNGLUNIFORM4IVPROC glUniform4iv = nullptr;
	PFNGLUNIFORMMATRIX2FVPROC glUniformMatrix2fv = nullptr;
	PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv = nullptr;
	PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv = nullptr;
	PFNGLVALIDATEPROGRAMPROC glValidateProgram = nullptr;
	PFNGLVERTEXATTRIB1DPROC glVertexAttrib1d = nullptr;
	PFNGLVERTEXATTRIB1DVPROC glVertexAttrib1dv = nullptr;
	PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f = nullptr;
	PFNGLVERTEXATTRIB1FVPROC glVertexAttrib1fv = nullptr;
	PFNGLVERTEXATTRIB1SPROC glVertexAttrib1s = nullptr;
	PFNGLVERTEXATTRIB1SVPROC glVertexAttrib1sv = nullptr;
	PFNGLVERTEXATTRIB2DPROC glVertexAttrib2d = nullptr;
	PFNGLVERTEXATTRIB2DVPROC glVertexAttrib2dv = nullptr;
	PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f = nullptr;
	PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv = nullptr;
	PFNGLVERTEXATTRIB2SPROC glVertexAttrib2s = nullptr;
	PFNGLVERTEXATTRIB2SVPROC glVertexAttrib2sv = nullptr;
	PFNGLVERTEXATTRIB3DPROC glVertexAttrib3d = nullptr;
	PFNGLVERTEXATTRIB3DVPROC glVertexAttrib3dv = nullptr;
	PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f = nullptr;
	PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv = nullptr;
	PFNGLVERTEXATTRIB3SPROC glVertexAttrib3s = nullptr;
	PFNGLVERTEXATTRIB3SVPROC glVertexAttrib3sv = nullptr;
	PFNGLVERTEXATTRIB4NBVPROC glVertexAttrib4Nbv = nullptr;
	PFNGLVERTEXATTRIB4NIVPROC glVertexAttrib4Niv = nullptr;
	PFNGLVERTEXATTRIB4NSVPROC glVertexAttrib4Nsv = nullptr;
	PFNGLVERTEXATTRIB4NUBPROC glVertexAttrib4Nub = nullptr;
	PFNGLVERTEXATTRIB4NUBVPROC glVertexAttrib4Nubv = nullptr;
	PFNGLVERTEXATTRIB4NUIVPROC glVertexAttrib4Nuiv = nullptr;
	PFNGLVERTEXATTRIB4NUSVPROC glVertexAttrib4Nusv = nullptr;
	PFNGLVERTEXATTRIB4BVPROC glVertexAttrib4bv = nullptr;
	PFNGLVERTEXATTRIB4DPROC glVertexAttrib4d = nullptr;
	PFNGLVERTEXATTRIB4DVPROC glVertexAttrib4dv = nullptr;
	PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f = nullptr;
	PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv = nullptr;
	PFNGLVERTEXATTRIB4IVPROC glVertexAttrib4iv = nullptr;
	PFNGLVERTEXATTRIB4SPROC glVertexAttrib4s = nullptr;
	PFNGLVERTEXATTRIB4SVPROC glVertexAttrib4sv = nullptr;
	PFNGLVERTEXATTRIB4UBVPROC glVertexAttrib4ubv = nullptr;
	PFNGLVERTEXATTRIB4UIVPROC glVertexAttrib4uiv = nullptr;
	PFNGLVERTEXATTRIB4USVPROC glVertexAttrib4usv = nullptr;
	PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = nullptr;
	
	// OpenGL 21 functions
	PFNGLUNIFORMMATRIX2X3FVPROC glUniformMatrix2x3fv = nullptr;
	PFNGLUNIFORMMATRIX3X2FVPROC glUniformMatrix3x2fv = nullptr;
	PFNGLUNIFORMMATRIX2X4FVPROC glUniformMatrix2x4fv = nullptr;
	PFNGLUNIFORMMATRIX4X2FVPROC glUniformMatrix4x2fv = nullptr;
	PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv = nullptr;
	PFNGLUNIFORMMATRIX4X3FVPROC glUniformMatrix4x3fv = nullptr;
	
	// OpenGL 30 functions
	PFNGLCOLORMASKIPROC glColorMaski = nullptr;
	PFNGLGETBOOLEANI_VPROC glGetBooleani_v = nullptr;
	PFNGLGETINTEGERI_VPROC glGetIntegeri_v = nullptr;
	PFNGLENABLEIPROC glEnablei = nullptr;
	PFNGLDISABLEIPROC glDisablei = nullptr;
	PFNGLISENABLEDIPROC glIsEnabledi = nullptr;
	PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback = nullptr;
	PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback = nullptr;
	PFNGLBINDBUFFERRANGEPROC glBindBufferRange = nullptr;
	PFNGLBINDBUFFERBASEPROC glBindBufferBase = nullptr;
	PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings = nullptr;
	PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glGetTransformFeedbackVarying = nullptr;
	PFNGLCLAMPCOLORPROC glClampColor = nullptr;
	PFNGLBEGINCONDITIONALRENDERPROC glBeginConditionalRender = nullptr;
	PFNGLENDCONDITIONALRENDERPROC glEndConditionalRender = nullptr;
	PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer = nullptr;
	PFNGLGETVERTEXATTRIBIIVPROC glGetVertexAttribIiv = nullptr;
	PFNGLGETVERTEXATTRIBIUIVPROC glGetVertexAttribIuiv = nullptr;
	PFNGLVERTEXATTRIBI1IPROC glVertexAttribI1i = nullptr;
	PFNGLVERTEXATTRIBI2IPROC glVertexAttribI2i = nullptr;
	PFNGLVERTEXATTRIBI3IPROC glVertexAttribI3i = nullptr;
	PFNGLVERTEXATTRIBI4IPROC glVertexAttribI4i = nullptr;
	PFNGLVERTEXATTRIBI1UIPROC glVertexAttribI1ui = nullptr;
	PFNGLVERTEXATTRIBI2UIPROC glVertexAttribI2ui = nullptr;
	PFNGLVERTEXATTRIBI3UIPROC glVertexAttribI3ui = nullptr;
	PFNGLVERTEXATTRIBI4UIPROC glVertexAttribI4ui = nullptr;
	PFNGLVERTEXATTRIBI1IVPROC glVertexAttribI1iv = nullptr;
	PFNGLVERTEXATTRIBI2IVPROC glVertexAttribI2iv = nullptr;
	PFNGLVERTEXATTRIBI3IVPROC glVertexAttribI3iv = nullptr;
	PFNGLVERTEXATTRIBI4IVPROC glVertexAttribI4iv = nullptr;
	PFNGLVERTEXATTRIBI1UIVPROC glVertexAttribI1uiv = nullptr;
	PFNGLVERTEXATTRIBI2UIVPROC glVertexAttribI2uiv = nullptr;
	PFNGLVERTEXATTRIBI3UIVPROC glVertexAttribI3uiv = nullptr;
	PFNGLVERTEXATTRIBI4UIVPROC glVertexAttribI4uiv = nullptr;
	PFNGLVERTEXATTRIBI4BVPROC glVertexAttribI4bv = nullptr;
	PFNGLVERTEXATTRIBI4SVPROC glVertexAttribI4sv = nullptr;
	PFNGLVERTEXATTRIBI4UBVPROC glVertexAttribI4ubv = nullptr;
	PFNGLVERTEXATTRIBI4USVPROC glVertexAttribI4usv = nullptr;
	PFNGLGETUNIFORMUIVPROC glGetUniformuiv = nullptr;
	PFNGLBINDFRAGDATALOCATIONPROC glBindFragDataLocation = nullptr;
	PFNGLGETFRAGDATALOCATIONPROC glGetFragDataLocation = nullptr;
	PFNGLUNIFORM1UIPROC glUniform1ui = nullptr;
	PFNGLUNIFORM2UIPROC glUniform2ui = nullptr;
	PFNGLUNIFORM3UIPROC glUniform3ui = nullptr;
	PFNGLUNIFORM4UIPROC glUniform4ui = nullptr;
	PFNGLUNIFORM1UIVPROC glUniform1uiv = nullptr;
	PFNGLUNIFORM2UIVPROC glUniform2uiv = nullptr;
	PFNGLUNIFORM3UIVPROC glUniform3uiv = nullptr;
	PFNGLUNIFORM4UIVPROC glUniform4uiv = nullptr;
	PFNGLTEXPARAMETERIIVPROC glTexParameterIiv = nullptr;
	PFNGLTEXPARAMETERIUIVPROC glTexParameterIuiv = nullptr;
	PFNGLGETTEXPARAMETERIIVPROC glGetTexParameterIiv = nullptr;
	PFNGLGETTEXPARAMETERIUIVPROC glGetTexParameterIuiv = nullptr;
	PFNGLCLEARBUFFERIVPROC glClearBufferiv = nullptr;
	PFNGLCLEARBUFFERUIVPROC glClearBufferuiv = nullptr;
	PFNGLCLEARBUFFERFVPROC glClearBufferfv = nullptr;
	PFNGLCLEARBUFFERFIPROC glClearBufferfi = nullptr;
	PFNGLGETSTRINGIPROC glGetStringi = nullptr;
	PFNGLISRENDERBUFFERPROC glIsRenderbuffer = nullptr;
	PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = nullptr;
	PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = nullptr;
	PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = nullptr;
	PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = nullptr;
	PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv = nullptr;
	PFNGLISFRAMEBUFFERPROC glIsFramebuffer = nullptr;
	PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = nullptr;
	PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = nullptr;
	PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = nullptr;
	PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = nullptr;
	PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D = nullptr;
	PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = nullptr;
	PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D = nullptr;
	PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = nullptr;
	PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv = nullptr;
	PFNGLGENERATEMIPMAPPROC glGenerateMipmap = nullptr;
	PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = nullptr;
	PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = nullptr;
	PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = nullptr;
	PFNGLMAPBUFFERRANGEPROC glMapBufferRange = nullptr;
	PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange = nullptr;
	PFNGLBINDVERTEXARRAYPROC glBindVertexArray = nullptr;
	PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays = nullptr;
	PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = nullptr;
	PFNGLISVERTEXARRAYPROC glIsVertexArray = nullptr;
	
	// OpenGL 31 functions
	PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced = nullptr;
	PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced = nullptr;
	PFNGLTEXBUFFERPROC glTexBuffer = nullptr;
	PFNGLPRIMITIVERESTARTINDEXPROC glPrimitiveRestartIndex = nullptr;
	PFNGLCOPYBUFFERSUBDATAPROC glCopyBufferSubData = nullptr;
	PFNGLGETUNIFORMINDICESPROC glGetUniformIndices = nullptr;
	PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv = nullptr;
	PFNGLGETACTIVEUNIFORMNAMEPROC glGetActiveUniformName = nullptr;
	PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex = nullptr;
	PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv = nullptr;
	PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockName = nullptr;
	PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding = nullptr;
	
	// OpenGL 32 functions
	PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex = nullptr;
	PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glDrawRangeElementsBaseVertex = nullptr;
	PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glDrawElementsInstancedBaseVertex = nullptr;
	PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glMultiDrawElementsBaseVertex = nullptr;
	PFNGLPROVOKINGVERTEXPROC glProvokingVertex = nullptr;
	PFNGLFENCESYNCPROC glFenceSync = nullptr;
	PFNGLISSYNCPROC glIsSync = nullptr;
	PFNGLDELETESYNCPROC glDeleteSync = nullptr;
	PFNGLCLIENTWAITSYNCPROC glClientWaitSync = nullptr;
	PFNGLWAITSYNCPROC glWaitSync = nullptr;
	PFNGLGETINTEGER64VPROC glGetInteger64v = nullptr;
	PFNGLGETSYNCIVPROC glGetSynciv = nullptr;
	PFNGLGETINTEGER64I_VPROC glGetInteger64i_v = nullptr;
	PFNGLGETBUFFERPARAMETERI64VPROC glGetBufferParameteri64v = nullptr;
	PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture = nullptr;
	PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample = nullptr;
	PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample = nullptr;
	PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv = nullptr;
	PFNGLSAMPLEMASKIPROC glSampleMaski = nullptr;
	
	// OpenGL 33 functions
	PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glBindFragDataLocationIndexed = nullptr;
	PFNGLGETFRAGDATAINDEXPROC glGetFragDataIndex = nullptr;
	PFNGLGENSAMPLERSPROC glGenSamplers = nullptr;
	PFNGLDELETESAMPLERSPROC glDeleteSamplers = nullptr;
	PFNGLISSAMPLERPROC glIsSampler = nullptr;
	PFNGLBINDSAMPLERPROC glBindSampler = nullptr;
	PFNGLSAMPLERPARAMETERIPROC glSamplerParameteri = nullptr;
	PFNGLSAMPLERPARAMETERIVPROC glSamplerParameteriv = nullptr;
	PFNGLSAMPLERPARAMETERFPROC glSamplerParameterf = nullptr;
	PFNGLSAMPLERPARAMETERFVPROC glSamplerParameterfv = nullptr;
	PFNGLSAMPLERPARAMETERIIVPROC glSamplerParameterIiv = nullptr;
	PFNGLSAMPLERPARAMETERIUIVPROC glSamplerParameterIuiv = nullptr;
	PFNGLGETSAMPLERPARAMETERIVPROC glGetSamplerParameteriv = nullptr;
	PFNGLGETSAMPLERPARAMETERIIVPROC glGetSamplerParameterIiv = nullptr;
	PFNGLGETSAMPLERPARAMETERFVPROC glGetSamplerParameterfv = nullptr;
	PFNGLGETSAMPLERPARAMETERIUIVPROC glGetSamplerParameterIuiv = nullptr;
	PFNGLQUERYCOUNTERPROC glQueryCounter = nullptr;
	PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v = nullptr;
	PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v = nullptr;
	PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor = nullptr;
	PFNGLVERTEXATTRIBP1UIPROC glVertexAttribP1ui = nullptr;
	PFNGLVERTEXATTRIBP1UIVPROC glVertexAttribP1uiv = nullptr;
	PFNGLVERTEXATTRIBP2UIPROC glVertexAttribP2ui = nullptr;
	PFNGLVERTEXATTRIBP2UIVPROC glVertexAttribP2uiv = nullptr;
	PFNGLVERTEXATTRIBP3UIPROC glVertexAttribP3ui = nullptr;
	PFNGLVERTEXATTRIBP3UIVPROC glVertexAttribP3uiv = nullptr;
	PFNGLVERTEXATTRIBP4UIPROC glVertexAttribP4ui = nullptr;
	PFNGLVERTEXATTRIBP4UIVPROC glVertexAttribP4uiv = nullptr;
	
	// OpenGL 40 functions
	PFNGLMINSAMPLESHADINGPROC glMinSampleShading = nullptr;
	PFNGLBLENDEQUATIONIPROC glBlendEquationi = nullptr;
	PFNGLBLENDEQUATIONSEPARATEIPROC glBlendEquationSeparatei = nullptr;
	PFNGLBLENDFUNCIPROC glBlendFunci = nullptr;
	PFNGLBLENDFUNCSEPARATEIPROC glBlendFuncSeparatei = nullptr;
	PFNGLDRAWARRAYSINDIRECTPROC glDrawArraysIndirect = nullptr;
	PFNGLDRAWELEMENTSINDIRECTPROC glDrawElementsIndirect = nullptr;
	PFNGLUNIFORM1DPROC glUniform1d = nullptr;
	PFNGLUNIFORM2DPROC glUniform2d = nullptr;
	PFNGLUNIFORM3DPROC glUniform3d = nullptr;
	PFNGLUNIFORM4DPROC glUniform4d = nullptr;
	PFNGLUNIFORM1DVPROC glUniform1dv = nullptr;
	PFNGLUNIFORM2DVPROC glUniform2dv = nullptr;
	PFNGLUNIFORM3DVPROC glUniform3dv = nullptr;
	PFNGLUNIFORM4DVPROC glUniform4dv = nullptr;
	PFNGLUNIFORMMATRIX2DVPROC glUniformMatrix2dv = nullptr;
	PFNGLUNIFORMMATRIX3DVPROC glUniformMatrix3dv = nullptr;
	PFNGLUNIFORMMATRIX4DVPROC glUniformMatrix4dv = nullptr;
	PFNGLUNIFORMMATRIX2X3DVPROC glUniformMatrix2x3dv = nullptr;
	PFNGLUNIFORMMATRIX2X4DVPROC glUniformMatrix2x4dv = nullptr;
	PFNGLUNIFORMMATRIX3X2DVPROC glUniformMatrix3x2dv = nullptr;
	PFNGLUNIFORMMATRIX3X4DVPROC glUniformMatrix3x4dv = nullptr;
	PFNGLUNIFORMMATRIX4X2DVPROC glUniformMatrix4x2dv = nullptr;
	PFNGLUNIFORMMATRIX4X3DVPROC glUniformMatrix4x3dv = nullptr;
	PFNGLGETUNIFORMDVPROC glGetUniformdv = nullptr;
	PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glGetSubroutineUniformLocation = nullptr;
	PFNGLGETSUBROUTINEINDEXPROC glGetSubroutineIndex = nullptr;
	PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glGetActiveSubroutineUniformiv = nullptr;
	PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glGetActiveSubroutineUniformName = nullptr;
	PFNGLGETACTIVESUBROUTINENAMEPROC glGetActiveSubroutineName = nullptr;
	PFNGLUNIFORMSUBROUTINESUIVPROC glUniformSubroutinesuiv = nullptr;
	PFNGLGETUNIFORMSUBROUTINEUIVPROC glGetUniformSubroutineuiv = nullptr;
	PFNGLGETPROGRAMSTAGEIVPROC glGetProgramStageiv = nullptr;
	PFNGLPATCHPARAMETERIPROC glPatchParameteri = nullptr;
	PFNGLPATCHPARAMETERFVPROC glPatchParameterfv = nullptr;
	PFNGLBINDTRANSFORMFEEDBACKPROC glBindTransformFeedback = nullptr;
	PFNGLDELETETRANSFORMFEEDBACKSPROC glDeleteTransformFeedbacks = nullptr;
	PFNGLGENTRANSFORMFEEDBACKSPROC glGenTransformFeedbacks = nullptr;
	PFNGLISTRANSFORMFEEDBACKPROC glIsTransformFeedback = nullptr;
	PFNGLPAUSETRANSFORMFEEDBACKPROC glPauseTransformFeedback = nullptr;
	PFNGLRESUMETRANSFORMFEEDBACKPROC glResumeTransformFeedback = nullptr;
	PFNGLDRAWTRANSFORMFEEDBACKPROC glDrawTransformFeedback = nullptr;
	PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glDrawTransformFeedbackStream = nullptr;
	PFNGLBEGINQUERYINDEXEDPROC glBeginQueryIndexed = nullptr;
	PFNGLENDQUERYINDEXEDPROC glEndQueryIndexed = nullptr;
	PFNGLGETQUERYINDEXEDIVPROC glGetQueryIndexediv = nullptr;
	
	// OpenGL 41 functions
	PFNGLRELEASESHADERCOMPILERPROC glReleaseShaderCompiler = nullptr;
	PFNGLSHADERBINARYPROC glShaderBinary = nullptr;
	PFNGLGETSHADERPRECISIONFORMATPROC glGetShaderPrecisionFormat = nullptr;
	PFNGLDEPTHRANGEFPROC glDepthRangef = nullptr;
	PFNGLCLEARDEPTHFPROC glClearDepthf = nullptr;
	PFNGLGETPROGRAMBINARYPROC glGetProgramBinary = nullptr;
	PFNGLPROGRAMBINARYPROC glProgramBinary = nullptr;
	PFNGLPROGRAMPARAMETERIPROC glProgramParameteri = nullptr;
	PFNGLUSEPROGRAMSTAGESPROC glUseProgramStages = nullptr;
	PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram = nullptr;
	PFNGLCREATESHADERPROGRAMVPROC glCreateShaderProgramv = nullptr;
	PFNGLBINDPROGRAMPIPELINEPROC glBindProgramPipeline = nullptr;
	PFNGLDELETEPROGRAMPIPELINESPROC glDeleteProgramPipelines = nullptr;
	PFNGLGENPROGRAMPIPELINESPROC glGenProgramPipelines = nullptr;
	PFNGLISPROGRAMPIPELINEPROC glIsProgramPipeline = nullptr;
	PFNGLGETPROGRAMPIPELINEIVPROC glGetProgramPipelineiv = nullptr;
	PFNGLPROGRAMUNIFORM1IPROC glProgramUniform1i = nullptr;
	PFNGLPROGRAMUNIFORM1IVPROC glProgramUniform1iv = nullptr;
	PFNGLPROGRAMUNIFORM1FPROC glProgramUniform1f = nullptr;
	PFNGLPROGRAMUNIFORM1FVPROC glProgramUniform1fv = nullptr;
	PFNGLPROGRAMUNIFORM1DPROC glProgramUniform1d = nullptr;
	PFNGLPROGRAMUNIFORM1DVPROC glProgramUniform1dv = nullptr;
	PFNGLPROGRAMUNIFORM1UIPROC glProgramUniform1ui = nullptr;
	PFNGLPROGRAMUNIFORM1UIVPROC glProgramUniform1uiv = nullptr;
	PFNGLPROGRAMUNIFORM2IPROC glProgramUniform2i = nullptr;
	PFNGLPROGRAMUNIFORM2IVPROC glProgramUniform2iv = nullptr;
	PFNGLPROGRAMUNIFORM2FPROC glProgramUniform2f = nullptr;
	PFNGLPROGRAMUNIFORM2FVPROC glProgramUniform2fv = nullptr;
	PFNGLPROGRAMUNIFORM2DPROC glProgramUniform2d = nullptr;
	PFNGLPROGRAMUNIFORM2DVPROC glProgramUniform2dv = nullptr;
	PFNGLPROGRAMUNIFORM2UIPROC glProgramUniform2ui = nullptr;
	PFNGLPROGRAMUNIFORM2UIVPROC glProgramUniform2uiv = nullptr;
	PFNGLPROGRAMUNIFORM3IPROC glProgramUniform3i = nullptr;
	PFNGLPROGRAMUNIFORM3IVPROC glProgramUniform3iv = nullptr;
	PFNGLPROGRAMUNIFORM3FPROC glProgramUniform3f = nullptr;
	PFNGLPROGRAMUNIFORM3FVPROC glProgramUniform3fv = nullptr;
	PFNGLPROGRAMUNIFORM3DPROC glProgramUniform3d = nullptr;
	PFNGLPROGRAMUNIFORM3DVPROC glProgramUniform3dv = nullptr;
	PFNGLPROGRAMUNIFORM3UIPROC glProgramUniform3ui = nullptr;
	PFNGLPROGRAMUNIFORM3UIVPROC glProgramUniform3uiv = nullptr;
	PFNGLPROGRAMUNIFORM4IPROC glProgramUniform4i = nullptr;
	PFNGLPROGRAMUNIFORM4IVPROC glProgramUniform4iv = nullptr;
	PFNGLPROGRAMUNIFORM4FPROC glProgramUniform4f = nullptr;
	PFNGLPROGRAMUNIFORM4FVPROC glProgramUniform4fv = nullptr;
	PFNGLPROGRAMUNIFORM4DPROC glProgramUniform4d = nullptr;
	PFNGLPROGRAMUNIFORM4DVPROC glProgramUniform4dv = nullptr;
	PFNGLPROGRAMUNIFORM4UIPROC glProgramUniform4ui = nullptr;
	PFNGLPROGRAMUNIFORM4UIVPROC glProgramUniform4uiv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX2FVPROC glProgramUniformMatrix2fv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX3FVPROC glProgramUniformMatrix3fv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX4FVPROC glProgramUniformMatrix4fv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX2DVPROC glProgramUniformMatrix2dv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX3DVPROC glProgramUniformMatrix3dv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX4DVPROC glProgramUniformMatrix4dv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glProgramUniformMatrix2x3fv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glProgramUniformMatrix3x2fv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glProgramUniformMatrix2x4fv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glProgramUniformMatrix4x2fv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glProgramUniformMatrix3x4fv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glProgramUniformMatrix4x3fv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glProgramUniformMatrix2x3dv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glProgramUniformMatrix3x2dv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glProgramUniformMatrix2x4dv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glProgramUniformMatrix4x2dv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glProgramUniformMatrix3x4dv = nullptr;
	PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glProgramUniformMatrix4x3dv = nullptr;
	PFNGLVALIDATEPROGRAMPIPELINEPROC glValidateProgramPipeline = nullptr;
	PFNGLGETPROGRAMPIPELINEINFOLOGPROC glGetProgramPipelineInfoLog = nullptr;
	PFNGLVERTEXATTRIBL1DPROC glVertexAttribL1d = nullptr;
	PFNGLVERTEXATTRIBL2DPROC glVertexAttribL2d = nullptr;
	PFNGLVERTEXATTRIBL3DPROC glVertexAttribL3d = nullptr;
	PFNGLVERTEXATTRIBL4DPROC glVertexAttribL4d = nullptr;
	PFNGLVERTEXATTRIBL1DVPROC glVertexAttribL1dv = nullptr;
	PFNGLVERTEXATTRIBL2DVPROC glVertexAttribL2dv = nullptr;
	PFNGLVERTEXATTRIBL3DVPROC glVertexAttribL3dv = nullptr;
	PFNGLVERTEXATTRIBL4DVPROC glVertexAttribL4dv = nullptr;
	PFNGLVERTEXATTRIBLPOINTERPROC glVertexAttribLPointer = nullptr;
	PFNGLGETVERTEXATTRIBLDVPROC glGetVertexAttribLdv = nullptr;
	PFNGLVIEWPORTARRAYVPROC glViewportArrayv = nullptr;
	PFNGLVIEWPORTINDEXEDFPROC glViewportIndexedf = nullptr;
	PFNGLVIEWPORTINDEXEDFVPROC glViewportIndexedfv = nullptr;
	PFNGLSCISSORARRAYVPROC glScissorArrayv = nullptr;
	PFNGLSCISSORINDEXEDPROC glScissorIndexed = nullptr;
	PFNGLSCISSORINDEXEDVPROC glScissorIndexedv = nullptr;
	PFNGLDEPTHRANGEARRAYVPROC glDepthRangeArrayv = nullptr;
	PFNGLDEPTHRANGEINDEXEDPROC glDepthRangeIndexed = nullptr;
	PFNGLGETFLOATI_VPROC glGetFloati_v = nullptr;
	PFNGLGETDOUBLEI_VPROC glGetDoublei_v = nullptr;
	
	// OpenGL 42 functions
	PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glDrawArraysInstancedBaseInstance = nullptr;
	PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glDrawElementsInstancedBaseInstance = nullptr;
	PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glDrawElementsInstancedBaseVertexBaseInstance = nullptr;
	PFNGLGETINTERNALFORMATIVPROC glGetInternalformativ = nullptr;
	PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glGetActiveAtomicCounterBufferiv = nullptr;
	PFNGLBINDIMAGETEXTUREPROC glBindImageTexture = nullptr;
	PFNGLMEMORYBARRIERPROC glMemoryBarrier = nullptr;
	PFNGLTEXSTORAGE1DPROC glTexStorage1D = nullptr;
	PFNGLTEXSTORAGE2DPROC glTexStorage2D = nullptr;
	PFNGLTEXSTORAGE3DPROC glTexStorage3D = nullptr;
	PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glDrawTransformFeedbackInstanced = nullptr;
	PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glDrawTransformFeedbackStreamInstanced = nullptr;
	
	// OpenGL 43 functions
	PFNGLCLEARBUFFERDATAPROC glClearBufferData = nullptr;
	PFNGLCLEARBUFFERSUBDATAPROC glClearBufferSubData = nullptr;
	PFNGLDISPATCHCOMPUTEPROC glDispatchCompute = nullptr;
	PFNGLDISPATCHCOMPUTEINDIRECTPROC glDispatchComputeIndirect = nullptr;
	PFNGLCOPYIMAGESUBDATAPROC glCopyImageSubData = nullptr;
	PFNGLFRAMEBUFFERPARAMETERIPROC glFramebufferParameteri = nullptr;
	PFNGLGETFRAMEBUFFERPARAMETERIVPROC glGetFramebufferParameteriv = nullptr;
	PFNGLGETINTERNALFORMATI64VPROC glGetInternalformati64v = nullptr;
	PFNGLINVALIDATETEXSUBIMAGEPROC glInvalidateTexSubImage = nullptr;
	PFNGLINVALIDATETEXIMAGEPROC glInvalidateTexImage = nullptr;
	PFNGLINVALIDATEBUFFERSUBDATAPROC glInvalidateBufferSubData = nullptr;
	PFNGLINVALIDATEBUFFERDATAPROC glInvalidateBufferData = nullptr;
	PFNGLINVALIDATEFRAMEBUFFERPROC glInvalidateFramebuffer = nullptr;
	PFNGLINVALIDATESUBFRAMEBUFFERPROC glInvalidateSubFramebuffer = nullptr;
	PFNGLMULTIDRAWARRAYSINDIRECTPROC glMultiDrawArraysIndirect = nullptr;
	PFNGLMULTIDRAWELEMENTSINDIRECTPROC glMultiDrawElementsIndirect = nullptr;
	PFNGLGETPROGRAMINTERFACEIVPROC glGetProgramInterfaceiv = nullptr;
	PFNGLGETPROGRAMRESOURCEINDEXPROC glGetProgramResourceIndex = nullptr;
	PFNGLGETPROGRAMRESOURCENAMEPROC glGetProgramResourceName = nullptr;
	PFNGLGETPROGRAMRESOURCEIVPROC glGetProgramResourceiv = nullptr;
	PFNGLGETPROGRAMRESOURCELOCATIONPROC glGetProgramResourceLocation = nullptr;
	PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glGetProgramResourceLocationIndex = nullptr;
	PFNGLSHADERSTORAGEBLOCKBINDINGPROC glShaderStorageBlockBinding = nullptr;
	PFNGLTEXBUFFERRANGEPROC glTexBufferRange = nullptr;
	PFNGLTEXSTORAGE2DMULTISAMPLEPROC glTexStorage2DMultisample = nullptr;
	PFNGLTEXSTORAGE3DMULTISAMPLEPROC glTexStorage3DMultisample = nullptr;
	PFNGLTEXTUREVIEWPROC glTextureView = nullptr;
	PFNGLBINDVERTEXBUFFERPROC glBindVertexBuffer = nullptr;
	PFNGLVERTEXATTRIBFORMATPROC glVertexAttribFormat = nullptr;
	PFNGLVERTEXATTRIBIFORMATPROC glVertexAttribIFormat = nullptr;
	PFNGLVERTEXATTRIBLFORMATPROC glVertexAttribLFormat = nullptr;
	PFNGLVERTEXATTRIBBINDINGPROC glVertexAttribBinding = nullptr;
	PFNGLVERTEXBINDINGDIVISORPROC glVertexBindingDivisor = nullptr;
	PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl = nullptr;
	PFNGLDEBUGMESSAGEINSERTPROC glDebugMessageInsert = nullptr;
	PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback = nullptr;
	PFNGLGETDEBUGMESSAGELOGPROC glGetDebugMessageLog = nullptr;
	PFNGLPUSHDEBUGGROUPPROC glPushDebugGroup = nullptr;
	PFNGLPOPDEBUGGROUPPROC glPopDebugGroup = nullptr;
	PFNGLOBJECTLABELPROC glObjectLabel = nullptr;
	PFNGLGETOBJECTLABELPROC glGetObjectLabel = nullptr;
	PFNGLOBJECTPTRLABELPROC glObjectPtrLabel = nullptr;
	PFNGLGETOBJECTPTRLABELPROC glGetObjectPtrLabel = nullptr;
	
	// OpenGL 44 functions
	PFNGLBUFFERSTORAGEPROC glBufferStorage = nullptr;
	PFNGLCLEARTEXIMAGEPROC glClearTexImage = nullptr;
	PFNGLCLEARTEXSUBIMAGEPROC glClearTexSubImage = nullptr;
	PFNGLBINDBUFFERSBASEPROC glBindBuffersBase = nullptr;
	PFNGLBINDBUFFERSRANGEPROC glBindBuffersRange = nullptr;
	PFNGLBINDTEXTURESPROC glBindTextures = nullptr;
	PFNGLBINDSAMPLERSPROC glBindSamplers = nullptr;
	PFNGLBINDIMAGETEXTURESPROC glBindImageTextures = nullptr;
	PFNGLBINDVERTEXBUFFERSPROC glBindVertexBuffers = nullptr;
	
	// OpenGL 45 functions
	PFNGLCLIPCONTROLPROC glClipControl = nullptr;
	PFNGLCREATETRANSFORMFEEDBACKSPROC glCreateTransformFeedbacks = nullptr;
	PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC glTransformFeedbackBufferBase = nullptr;
	PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC glTransformFeedbackBufferRange = nullptr;
	PFNGLGETTRANSFORMFEEDBACKIVPROC glGetTransformFeedbackiv = nullptr;
	PFNGLGETTRANSFORMFEEDBACKI_VPROC glGetTransformFeedbacki_v = nullptr;
	PFNGLGETTRANSFORMFEEDBACKI64_VPROC glGetTransformFeedbacki64_v = nullptr;
	PFNGLCREATEBUFFERSPROC glCreateBuffers = nullptr;
	PFNGLNAMEDBUFFERSTORAGEPROC glNamedBufferStorage = nullptr;
	PFNGLNAMEDBUFFERDATAPROC glNamedBufferData = nullptr;
	PFNGLNAMEDBUFFERSUBDATAPROC glNamedBufferSubData = nullptr;
	PFNGLCOPYNAMEDBUFFERSUBDATAPROC glCopyNamedBufferSubData = nullptr;
	PFNGLCLEARNAMEDBUFFERDATAPROC glClearNamedBufferData = nullptr;
	PFNGLCLEARNAMEDBUFFERSUBDATAPROC glClearNamedBufferSubData = nullptr;
	PFNGLMAPNAMEDBUFFERPROC glMapNamedBuffer = nullptr;
	PFNGLMAPNAMEDBUFFERRANGEPROC glMapNamedBufferRange = nullptr;
	PFNGLUNMAPNAMEDBUFFERPROC glUnmapNamedBuffer = nullptr;
	PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC glFlushMappedNamedBufferRange = nullptr;
	PFNGLGETNAMEDBUFFERPARAMETERIVPROC glGetNamedBufferParameteriv = nullptr;
	PFNGLGETNAMEDBUFFERPARAMETERI64VPROC glGetNamedBufferParameteri64v = nullptr;
	PFNGLGETNAMEDBUFFERPOINTERVPROC glGetNamedBufferPointerv = nullptr;
	PFNGLGETNAMEDBUFFERSUBDATAPROC glGetNamedBufferSubData = nullptr;
	PFNGLCREATEFRAMEBUFFERSPROC glCreateFramebuffers = nullptr;
	PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC glNamedFramebufferRenderbuffer = nullptr;
	PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC glNamedFramebufferParameteri = nullptr;
	PFNGLNAMEDFRAMEBUFFERTEXTUREPROC glNamedFramebufferTexture = nullptr;
	PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC glNamedFramebufferTextureLayer = nullptr;
	PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC glNamedFramebufferDrawBuffer = nullptr;
	PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC glNamedFramebufferDrawBuffers = nullptr;
	PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC glNamedFramebufferReadBuffer = nullptr;
	PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC glInvalidateNamedFramebufferData = nullptr;
	PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC glInvalidateNamedFramebufferSubData = nullptr;
	PFNGLCLEARNAMEDFRAMEBUFFERIVPROC glClearNamedFramebufferiv = nullptr;
	PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC glClearNamedFramebufferuiv = nullptr;
	PFNGLCLEARNAMEDFRAMEBUFFERFVPROC glClearNamedFramebufferfv = nullptr;
	PFNGLCLEARNAMEDFRAMEBUFFERFIPROC glClearNamedFramebufferfi = nullptr;
	PFNGLBLITNAMEDFRAMEBUFFERPROC glBlitNamedFramebuffer = nullptr;
	PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC glCheckNamedFramebufferStatus = nullptr;
	PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC glGetNamedFramebufferParameteriv = nullptr;
	PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetNamedFramebufferAttachmentParameteriv = nullptr;
	PFNGLCREATERENDERBUFFERSPROC glCreateRenderbuffers = nullptr;
	PFNGLNAMEDRENDERBUFFERSTORAGEPROC glNamedRenderbufferStorage = nullptr;
	PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC glNamedRenderbufferStorageMultisample = nullptr;
	PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC glGetNamedRenderbufferParameteriv = nullptr;
	PFNGLCREATETEXTURESPROC glCreateTextures = nullptr;
	PFNGLTEXTUREBUFFERPROC glTextureBuffer = nullptr;
	PFNGLTEXTUREBUFFERRANGEPROC glTextureBufferRange = nullptr;
	PFNGLTEXTURESTORAGE1DPROC glTextureStorage1D = nullptr;
	PFNGLTEXTURESTORAGE2DPROC glTextureStorage2D = nullptr;
	PFNGLTEXTURESTORAGE3DPROC glTextureStorage3D = nullptr;
	PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC glTextureStorage2DMultisample = nullptr;
	PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC glTextureStorage3DMultisample = nullptr;
	PFNGLTEXTURESUBIMAGE1DPROC glTextureSubImage1D = nullptr;
	PFNGLTEXTURESUBIMAGE2DPROC glTextureSubImage2D = nullptr;
	PFNGLTEXTURESUBIMAGE3DPROC glTextureSubImage3D = nullptr;
	PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC glCompressedTextureSubImage1D = nullptr;
	PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC glCompressedTextureSubImage2D = nullptr;
	PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC glCompressedTextureSubImage3D = nullptr;
	PFNGLCOPYTEXTURESUBIMAGE1DPROC glCopyTextureSubImage1D = nullptr;
	PFNGLCOPYTEXTURESUBIMAGE2DPROC glCopyTextureSubImage2D = nullptr;
	PFNGLCOPYTEXTURESUBIMAGE3DPROC glCopyTextureSubImage3D = nullptr;
	PFNGLTEXTUREPARAMETERFPROC glTextureParameterf = nullptr;
	PFNGLTEXTUREPARAMETERFVPROC glTextureParameterfv = nullptr;
	PFNGLTEXTUREPARAMETERIPROC glTextureParameteri = nullptr;
	PFNGLTEXTUREPARAMETERIIVPROC glTextureParameterIiv = nullptr;
	PFNGLTEXTUREPARAMETERIUIVPROC glTextureParameterIuiv = nullptr;
	PFNGLTEXTUREPARAMETERIVPROC glTextureParameteriv = nullptr;
	PFNGLGENERATETEXTUREMIPMAPPROC glGenerateTextureMipmap = nullptr;
	PFNGLBINDTEXTUREUNITPROC glBindTextureUnit = nullptr;
	PFNGLGETTEXTUREIMAGEPROC glGetTextureImage = nullptr;
	PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC glGetCompressedTextureImage = nullptr;
	PFNGLGETTEXTURELEVELPARAMETERFVPROC glGetTextureLevelParameterfv = nullptr;
	PFNGLGETTEXTURELEVELPARAMETERIVPROC glGetTextureLevelParameteriv = nullptr;
	PFNGLGETTEXTUREPARAMETERFVPROC glGetTextureParameterfv = nullptr;
	PFNGLGETTEXTUREPARAMETERIIVPROC glGetTextureParameterIiv = nullptr;
	PFNGLGETTEXTUREPARAMETERIUIVPROC glGetTextureParameterIuiv = nullptr;
	PFNGLGETTEXTUREPARAMETERIVPROC glGetTextureParameteriv = nullptr;
	PFNGLCREATEVERTEXARRAYSPROC glCreateVertexArrays = nullptr;
	PFNGLDISABLEVERTEXARRAYATTRIBPROC glDisableVertexArrayAttrib = nullptr;
	PFNGLENABLEVERTEXARRAYATTRIBPROC glEnableVertexArrayAttrib = nullptr;
	PFNGLVERTEXARRAYELEMENTBUFFERPROC glVertexArrayElementBuffer = nullptr;
	PFNGLVERTEXARRAYVERTEXBUFFERPROC glVertexArrayVertexBuffer = nullptr;
	PFNGLVERTEXARRAYVERTEXBUFFERSPROC glVertexArrayVertexBuffers = nullptr;
	PFNGLVERTEXARRAYATTRIBBINDINGPROC glVertexArrayAttribBinding = nullptr;
	PFNGLVERTEXARRAYATTRIBFORMATPROC glVertexArrayAttribFormat = nullptr;
	PFNGLVERTEXARRAYATTRIBIFORMATPROC glVertexArrayAttribIFormat = nullptr;
	PFNGLVERTEXARRAYATTRIBLFORMATPROC glVertexArrayAttribLFormat = nullptr;
	PFNGLVERTEXARRAYBINDINGDIVISORPROC glVertexArrayBindingDivisor = nullptr;
	PFNGLGETVERTEXARRAYIVPROC glGetVertexArrayiv = nullptr;
	PFNGLGETVERTEXARRAYINDEXEDIVPROC glGetVertexArrayIndexediv = nullptr;
	PFNGLGETVERTEXARRAYINDEXED64IVPROC glGetVertexArrayIndexed64iv = nullptr;
	PFNGLCREATESAMPLERSPROC glCreateSamplers = nullptr;
	PFNGLCREATEPROGRAMPIPELINESPROC glCreateProgramPipelines = nullptr;
	PFNGLCREATEQUERIESPROC glCreateQueries = nullptr;
	PFNGLGETQUERYBUFFEROBJECTI64VPROC glGetQueryBufferObjecti64v = nullptr;
	PFNGLGETQUERYBUFFEROBJECTIVPROC glGetQueryBufferObjectiv = nullptr;
	PFNGLGETQUERYBUFFEROBJECTUI64VPROC glGetQueryBufferObjectui64v = nullptr;
	PFNGLGETQUERYBUFFEROBJECTUIVPROC glGetQueryBufferObjectuiv = nullptr;
	PFNGLMEMORYBARRIERBYREGIONPROC glMemoryBarrierByRegion = nullptr;
	PFNGLGETTEXTURESUBIMAGEPROC glGetTextureSubImage = nullptr;
	PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC glGetCompressedTextureSubImage = nullptr;
	PFNGLGETGRAPHICSRESETSTATUSPROC glGetGraphicsResetStatus = nullptr;
	PFNGLGETNCOMPRESSEDTEXIMAGEPROC glGetnCompressedTexImage = nullptr;
	PFNGLGETNTEXIMAGEPROC glGetnTexImage = nullptr;
	PFNGLGETNUNIFORMDVPROC glGetnUniformdv = nullptr;
	PFNGLGETNUNIFORMFVPROC glGetnUniformfv = nullptr;
	PFNGLGETNUNIFORMIVPROC glGetnUniformiv = nullptr;
	PFNGLGETNUNIFORMUIVPROC glGetnUniformuiv = nullptr;
	PFNGLREADNPIXELSPROC glReadnPixels = nullptr;
	PFNGLTEXTUREBARRIERPROC glTextureBarrier = nullptr;
	
	// OpenGL 46 functions
	PFNGLSPECIALIZESHADERPROC glSpecializeShader = nullptr;
	PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC glMultiDrawArraysIndirectCount = nullptr;
	PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC glMultiDrawElementsIndirectCount = nullptr;
	PFNGLPOLYGONOFFSETCLAMPPROC glPolygonOffsetClamp = nullptr;
	
	// ARB sparse buffer
	PFNGLBUFFERPAGECOMMITMENTARBPROC glBufferPageCommitmentARB = nullptr;
	PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC glNamedBufferPageCommitmentEXT = nullptr;
	
	// ARB sparse texture
	PFNGLTEXPAGECOMMITMENTARBPROC glTexPageCommitmentARB = nullptr;
	PFNGLTEXTUREPAGECOMMITMENTEXTPROC glTexturePageCommitmentEXT = nullptr;
	
	// ARB bindless texture
	PFNGLGETTEXTUREHANDLEARBPROC glGetTextureHandleARB = nullptr;
	PFNGLGETTEXTURESAMPLERHANDLEARBPROC glGetTextureSamplerHandleARB = nullptr;
	PFNGLMAKETEXTUREHANDLERESIDENTARBPROC glMakeTextureHandleResidentARB = nullptr;
	PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC glMakeTextureHandleNonResidentARB = nullptr;
	PFNGLGETIMAGEHANDLEARBPROC glGetImageHandleARB = nullptr;
	PFNGLMAKEIMAGEHANDLERESIDENTARBPROC glMakeImageHandleResidentARB = nullptr;
	PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC glMakeImageHandleNonResidentARB = nullptr;
	PFNGLUNIFORMHANDLEUI64ARBPROC glUniformHandleui64ARB = nullptr;
	PFNGLUNIFORMHANDLEUI64VARBPROC glUniformHandleui64vARB = nullptr;
	PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC glProgramUniformHandleui64ARB = nullptr;
	PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC glProgramUniformHandleui64vARB = nullptr;
	PFNGLISTEXTUREHANDLERESIDENTARBPROC glIsTextureHandleResidentARB = nullptr;
	PFNGLISIMAGEHANDLERESIDENTARBPROC glIsImageHandleResidentARB = nullptr;
	PFNGLVERTEXATTRIBL1UI64ARBPROC glVertexAttribL1ui64ARB = nullptr;
	PFNGLVERTEXATTRIBL1UI64VARBPROC glVertexAttribL1ui64vARB = nullptr;
	PFNGLGETVERTEXATTRIBLUI64VARBPROC glGetVertexAttribLui64vARB = nullptr;
}
