dolphin/Source/Core/VideoBackends/OGL/GLExtensions/GLExtensions.cpp

1119 lines
37 KiB
C++

// Copyright 2013 Dolphin Emulator Project
// Licensed under GPLv2
// Refer to the license.txt file included.
#include "GLExtensions.h"
#include "Log.h"
#include <dlfcn.h>
#include <unordered_map>
// gl_1_2
PFNGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D;
PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements;
PFNGLTEXIMAGE3DPROC glTexImage3D;
PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D;
// gl_1_3
/*PFNGLACTIVETEXTUREPROC glActiveTexture;
PFNGLCLIENTACTIVETEXTUREPROC glClientActiveTexture;
PFNGLCOMPRESSEDTEXIMAGE1DPROC glCompressedTexImage1D;
PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D;
PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D;
PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glCompressedTexSubImage1D;
PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D;
PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D;
PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage;
PFNGLLOADTRANSPOSEMATRIXDPROC glLoadTransposeMatrixd;
PFNGLLOADTRANSPOSEMATRIXFPROC glLoadTransposeMatrixf;
PFNGLMULTTRANSPOSEMATRIXDPROC glMultTransposeMatrixd;
PFNGLMULTTRANSPOSEMATRIXFPROC glMultTransposeMatrixf;
PFNGLMULTITEXCOORD1DPROC glMultiTexCoord1d;
PFNGLMULTITEXCOORD1DVPROC glMultiTexCoord1dv;
PFNGLMULTITEXCOORD1FPROC glMultiTexCoord1f;
PFNGLMULTITEXCOORD1FVPROC glMultiTexCoord1fv;
PFNGLMULTITEXCOORD1IPROC glMultiTexCoord1i;
PFNGLMULTITEXCOORD1IVPROC glMultiTexCoord1iv;
PFNGLMULTITEXCOORD1SPROC glMultiTexCoord1s;
PFNGLMULTITEXCOORD1SVPROC glMultiTexCoord1sv;
PFNGLMULTITEXCOORD2DPROC glMultiTexCoord2d;
PFNGLMULTITEXCOORD2DVPROC glMultiTexCoord2dv;
PFNGLMULTITEXCOORD2FPROC glMultiTexCoord2f;
PFNGLMULTITEXCOORD2FVPROC glMultiTexCoord2fv;
PFNGLMULTITEXCOORD2IPROC glMultiTexCoord2i;
PFNGLMULTITEXCOORD2IVPROC glMultiTexCoord2iv;
PFNGLMULTITEXCOORD2SPROC glMultiTexCoord2s;
PFNGLMULTITEXCOORD2SVPROC glMultiTexCoord2sv;
PFNGLMULTITEXCOORD3DPROC glMultiTexCoord3d;
PFNGLMULTITEXCOORD3DVPROC glMultiTexCoord3dv;
PFNGLMULTITEXCOORD3FPROC glMultiTexCoord3f;
PFNGLMULTITEXCOORD3FVPROC glMultiTexCoord3fv;
PFNGLMULTITEXCOORD3IPROC glMultiTexCoord3i;
PFNGLMULTITEXCOORD3IVPROC glMultiTexCoord3iv;
PFNGLMULTITEXCOORD3SPROC glMultiTexCoord3s;
PFNGLMULTITEXCOORD3SVPROC glMultiTexCoord3sv;
PFNGLMULTITEXCOORD4DPROC glMultiTexCoord4d;
PFNGLMULTITEXCOORD4DVPROC glMultiTexCoord4dv;
PFNGLMULTITEXCOORD4FPROC glMultiTexCoord4f;
PFNGLMULTITEXCOORD4FVPROC glMultiTexCoord4fv;
PFNGLMULTITEXCOORD4IPROC glMultiTexCoord4i;
PFNGLMULTITEXCOORD4IVPROC glMultiTexCoord4iv;
PFNGLMULTITEXCOORD4SPROC glMultiTexCoord4s;
PFNGLMULTITEXCOORD4SVPROC glMultiTexCoord4sv;
PFNGLSAMPLECOVERAGEPROC glSampleCoverage;
*/
// gl_1_4
//PFNGLBLENDCOLORPROC glBlendColor;
//PFNGLBLENDEQUATIONPROC glBlendEquation;
PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate;
PFNGLFOGCOORDPOINTERPROC glFogCoordPointer;
PFNGLFOGCOORDDPROC glFogCoordd;
PFNGLFOGCOORDDVPROC glFogCoorddv;
PFNGLFOGCOORDFPROC glFogCoordf;
PFNGLFOGCOORDFVPROC glFogCoordfv;
PFNGLMULTIDRAWARRAYSPROC glMultiDrawArrays;
PFNGLMULTIDRAWELEMENTSPROC glMultiDrawElements;
PFNGLPOINTPARAMETERFPROC glPointParameterf;
PFNGLPOINTPARAMETERFVPROC glPointParameterfv;
PFNGLPOINTPARAMETERIPROC glPointParameteri;
PFNGLPOINTPARAMETERIVPROC glPointParameteriv;
PFNGLSECONDARYCOLOR3BPROC glSecondaryColor3b;
PFNGLSECONDARYCOLOR3BVPROC glSecondaryColor3bv;
PFNGLSECONDARYCOLOR3DPROC glSecondaryColor3d;
PFNGLSECONDARYCOLOR3DVPROC glSecondaryColor3dv;
PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
PFNGLSECONDARYCOLOR3FVPROC glSecondaryColor3fv;
PFNGLSECONDARYCOLOR3IPROC glSecondaryColor3i;
PFNGLSECONDARYCOLOR3IVPROC glSecondaryColor3iv;
PFNGLSECONDARYCOLOR3SPROC glSecondaryColor3s;
PFNGLSECONDARYCOLOR3SVPROC glSecondaryColor3sv;
PFNGLSECONDARYCOLOR3UBPROC glSecondaryColor3ub;
PFNGLSECONDARYCOLOR3UBVPROC glSecondaryColor3ubv;
PFNGLSECONDARYCOLOR3UIPROC glSecondaryColor3ui;
PFNGLSECONDARYCOLOR3UIVPROC glSecondaryColor3uiv;
PFNGLSECONDARYCOLOR3USPROC glSecondaryColor3us;
PFNGLSECONDARYCOLOR3USVPROC glSecondaryColor3usv;
PFNGLSECONDARYCOLORPOINTERPROC glSecondaryColorPointer;
PFNGLWINDOWPOS2DPROC glWindowPos2d;
PFNGLWINDOWPOS2DVPROC glWindowPos2dv;
PFNGLWINDOWPOS2FPROC glWindowPos2f;
PFNGLWINDOWPOS2FVPROC glWindowPos2fv;
PFNGLWINDOWPOS2IPROC glWindowPos2i;
PFNGLWINDOWPOS2IVPROC glWindowPos2iv;
PFNGLWINDOWPOS2SPROC glWindowPos2s;
PFNGLWINDOWPOS2SVPROC glWindowPos2sv;
PFNGLWINDOWPOS3DPROC glWindowPos3d;
PFNGLWINDOWPOS3DVPROC glWindowPos3dv;
PFNGLWINDOWPOS3FPROC glWindowPos3f;
PFNGLWINDOWPOS3FVPROC glWindowPos3fv;
PFNGLWINDOWPOS3IPROC glWindowPos3i;
PFNGLWINDOWPOS3IVPROC glWindowPos3iv;
PFNGLWINDOWPOS3SPROC glWindowPos3s;
PFNGLWINDOWPOS3SVPROC glWindowPos3sv;
// gl_1_5
PFNGLBEGINQUERYPROC glBeginQuery;
PFNGLBINDBUFFERPROC glBindBuffer;
PFNGLBUFFERDATAPROC glBufferData;
PFNGLBUFFERSUBDATAPROC glBufferSubData;
PFNGLDELETEBUFFERSPROC glDeleteBuffers;
PFNGLDELETEQUERIESPROC glDeleteQueries;
PFNGLENDQUERYPROC glEndQuery;
PFNGLGENBUFFERSPROC glGenBuffers;
PFNGLGENQUERIESPROC glGenQueries;
PFNGLGETBUFFERPARAMETERIVPROC glGetBufferParameteriv;
PFNGLGETBUFFERPOINTERVPROC glGetBufferPointerv;
PFNGLGETBUFFERSUBDATAPROC glGetBufferSubData;
PFNGLGETQUERYOBJECTIVPROC glGetQueryObjectiv;
PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv;
PFNGLGETQUERYIVPROC glGetQueryiv;
PFNGLISBUFFERPROC glIsBuffer;
PFNGLISQUERYPROC glIsQuery;
PFNGLMAPBUFFERPROC glMapBuffer;
PFNGLUNMAPBUFFERPROC glUnmapBuffer;
// gl_2_0
PFNGLATTACHSHADERPROC glAttachShader;
PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation;
PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate;
PFNGLCOMPILESHADERPROC glCompileShader;
PFNGLCREATEPROGRAMPROC glCreateProgram;
PFNGLCREATESHADERPROC glCreateShader;
PFNGLDELETEPROGRAMPROC glDeleteProgram;
PFNGLDELETESHADERPROC glDeleteShader;
PFNGLDETACHSHADERPROC glDetachShader;
PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
PFNGLDRAWBUFFERSPROC glDrawBuffers;
PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib;
PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform;
PFNGLGETATTACHEDSHADERSPROC glGetAttachedShaders;
PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation;
PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
PFNGLGETPROGRAMIVPROC glGetProgramiv;
PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog;
PFNGLGETSHADERSOURCEPROC glGetShaderSource;
PFNGLGETSHADERIVPROC glGetShaderiv;
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
PFNGLGETUNIFORMFVPROC glGetUniformfv;
PFNGLGETUNIFORMIVPROC glGetUniformiv;
PFNGLGETVERTEXATTRIBPOINTERVPROC glGetVertexAttribPointerv;
PFNGLGETVERTEXATTRIBDVPROC glGetVertexAttribdv;
PFNGLGETVERTEXATTRIBFVPROC glGetVertexAttribfv;
PFNGLGETVERTEXATTRIBIVPROC glGetVertexAttribiv;
PFNGLISPROGRAMPROC glIsProgram;
PFNGLISSHADERPROC glIsShader;
PFNGLLINKPROGRAMPROC glLinkProgram;
PFNGLSHADERSOURCEPROC glShaderSource;
PFNGLSTENCILFUNCSEPARATEPROC glStencilFuncSeparate;
PFNGLSTENCILMASKSEPARATEPROC glStencilMaskSeparate;
PFNGLSTENCILOPSEPARATEPROC glStencilOpSeparate;
PFNGLUNIFORM1FPROC glUniform1f;
PFNGLUNIFORM1FVPROC glUniform1fv;
PFNGLUNIFORM1IPROC glUniform1i;
PFNGLUNIFORM1IVPROC glUniform1iv;
PFNGLUNIFORM2FPROC glUniform2f;
PFNGLUNIFORM2FVPROC glUniform2fv;
PFNGLUNIFORM2IPROC glUniform2i;
PFNGLUNIFORM2IVPROC glUniform2iv;
PFNGLUNIFORM3FPROC glUniform3f;
PFNGLUNIFORM3FVPROC glUniform3fv;
PFNGLUNIFORM3IPROC glUniform3i;
PFNGLUNIFORM3IVPROC glUniform3iv;
PFNGLUNIFORM4FPROC glUniform4f;
PFNGLUNIFORM4FVPROC glUniform4fv;
PFNGLUNIFORM4IPROC glUniform4i;
PFNGLUNIFORM4IVPROC glUniform4iv;
PFNGLUNIFORMMATRIX2FVPROC glUniformMatrix2fv;
PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv;
PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv;
PFNGLUSEPROGRAMPROC glUseProgram;
PFNGLVALIDATEPROGRAMPROC glValidateProgram;
PFNGLVERTEXATTRIB1DPROC glVertexAttrib1d;
PFNGLVERTEXATTRIB1DVPROC glVertexAttrib1dv;
PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f;
PFNGLVERTEXATTRIB1FVPROC glVertexAttrib1fv;
PFNGLVERTEXATTRIB1SPROC glVertexAttrib1s;
PFNGLVERTEXATTRIB1SVPROC glVertexAttrib1sv;
PFNGLVERTEXATTRIB2DPROC glVertexAttrib2d;
PFNGLVERTEXATTRIB2DVPROC glVertexAttrib2dv;
PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f;
PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv;
PFNGLVERTEXATTRIB2SPROC glVertexAttrib2s;
PFNGLVERTEXATTRIB2SVPROC glVertexAttrib2sv;
PFNGLVERTEXATTRIB3DPROC glVertexAttrib3d;
PFNGLVERTEXATTRIB3DVPROC glVertexAttrib3dv;
PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f;
PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv;
PFNGLVERTEXATTRIB3SPROC glVertexAttrib3s;
PFNGLVERTEXATTRIB3SVPROC glVertexAttrib3sv;
PFNGLVERTEXATTRIB4NBVPROC glVertexAttrib4Nbv;
PFNGLVERTEXATTRIB4NIVPROC glVertexAttrib4Niv;
PFNGLVERTEXATTRIB4NSVPROC glVertexAttrib4Nsv;
PFNGLVERTEXATTRIB4NUBPROC glVertexAttrib4Nub;
PFNGLVERTEXATTRIB4NUBVPROC glVertexAttrib4Nubv;
PFNGLVERTEXATTRIB4NUIVPROC glVertexAttrib4Nuiv;
PFNGLVERTEXATTRIB4NUSVPROC glVertexAttrib4Nusv;
PFNGLVERTEXATTRIB4BVPROC glVertexAttrib4bv;
PFNGLVERTEXATTRIB4DPROC glVertexAttrib4d;
PFNGLVERTEXATTRIB4DVPROC glVertexAttrib4dv;
PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f;
PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv;
PFNGLVERTEXATTRIB4IVPROC glVertexAttrib4iv;
PFNGLVERTEXATTRIB4SPROC glVertexAttrib4s;
PFNGLVERTEXATTRIB4SVPROC glVertexAttrib4sv;
PFNGLVERTEXATTRIB4UBVPROC glVertexAttrib4ubv;
PFNGLVERTEXATTRIB4UIVPROC glVertexAttrib4uiv;
PFNGLVERTEXATTRIB4USVPROC glVertexAttrib4usv;
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
// gl_3_0
PFNGLBEGINCONDITIONALRENDERPROC glBeginConditionalRender;
PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback;
PFNGLBINDFRAGDATALOCATIONPROC glBindFragDataLocation;
PFNGLCLAMPCOLORPROC glClampColor;
PFNGLCLEARBUFFERFIPROC glClearBufferfi;
PFNGLCLEARBUFFERFVPROC glClearBufferfv;
PFNGLCLEARBUFFERIVPROC glClearBufferiv;
PFNGLCLEARBUFFERUIVPROC glClearBufferuiv;
PFNGLCOLORMASKIPROC glColorMaski;
PFNGLDISABLEIPROC glDisablei;
PFNGLENABLEIPROC glEnablei;
PFNGLENDCONDITIONALRENDERPROC glEndConditionalRender;
PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback;
PFNGLGETBOOLEANI_VPROC glGetBooleani_v;
PFNGLGETFRAGDATALOCATIONPROC glGetFragDataLocation;
PFNGLGETSTRINGIPROC glGetStringi;
PFNGLGETTEXPARAMETERIIVPROC glGetTexParameterIiv;
PFNGLGETTEXPARAMETERIUIVPROC glGetTexParameterIuiv;
PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glGetTransformFeedbackVarying;
PFNGLGETUNIFORMUIVPROC glGetUniformuiv;
PFNGLGETVERTEXATTRIBIIVPROC glGetVertexAttribIiv;
PFNGLGETVERTEXATTRIBIUIVPROC glGetVertexAttribIuiv;
PFNGLISENABLEDIPROC glIsEnabledi;
PFNGLTEXPARAMETERIIVPROC glTexParameterIiv;
PFNGLTEXPARAMETERIUIVPROC glTexParameterIuiv;
PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings;
PFNGLUNIFORM1UIPROC glUniform1ui;
PFNGLUNIFORM1UIVPROC glUniform1uiv;
PFNGLUNIFORM2UIPROC glUniform2ui;
PFNGLUNIFORM2UIVPROC glUniform2uiv;
PFNGLUNIFORM3UIPROC glUniform3ui;
PFNGLUNIFORM3UIVPROC glUniform3uiv;
PFNGLUNIFORM4UIPROC glUniform4ui;
PFNGLUNIFORM4UIVPROC glUniform4uiv;
PFNGLVERTEXATTRIBI1IPROC glVertexAttribI1i;
PFNGLVERTEXATTRIBI1IVPROC glVertexAttribI1iv;
PFNGLVERTEXATTRIBI1UIPROC glVertexAttribI1ui;
PFNGLVERTEXATTRIBI1UIVPROC glVertexAttribI1uiv;
PFNGLVERTEXATTRIBI2IPROC glVertexAttribI2i;
PFNGLVERTEXATTRIBI2IVPROC glVertexAttribI2iv;
PFNGLVERTEXATTRIBI2UIPROC glVertexAttribI2ui;
PFNGLVERTEXATTRIBI2UIVPROC glVertexAttribI2uiv;
PFNGLVERTEXATTRIBI3IPROC glVertexAttribI3i;
PFNGLVERTEXATTRIBI3IVPROC glVertexAttribI3iv;
PFNGLVERTEXATTRIBI3UIPROC glVertexAttribI3ui;
PFNGLVERTEXATTRIBI3UIVPROC glVertexAttribI3uiv;
PFNGLVERTEXATTRIBI4BVPROC glVertexAttribI4bv;
PFNGLVERTEXATTRIBI4IPROC glVertexAttribI4i;
PFNGLVERTEXATTRIBI4IVPROC glVertexAttribI4iv;
PFNGLVERTEXATTRIBI4SVPROC glVertexAttribI4sv;
PFNGLVERTEXATTRIBI4UBVPROC glVertexAttribI4ubv;
PFNGLVERTEXATTRIBI4UIPROC glVertexAttribI4ui;
PFNGLVERTEXATTRIBI4UIVPROC glVertexAttribI4uiv;
PFNGLVERTEXATTRIBI4USVPROC glVertexAttribI4usv;
PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer;
// gl_3_1
PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced;
PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced;
PFNGLPRIMITIVERESTARTINDEXPROC glPrimitiveRestartIndex;
PFNGLTEXBUFFERPROC glTexBuffer;
// gl_3_2
PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture;
PFNGLGETBUFFERPARAMETERI64VPROC glGetBufferParameteri64v;
PFNGLGETINTEGER64I_VPROC glGetInteger64i_v;
// ARB_uniform_buffer_object
PFNGLBINDBUFFERBASEPROC glBindBufferBase;
PFNGLBINDBUFFERRANGEPROC glBindBufferRange;
PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockName;
PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv;
PFNGLGETACTIVEUNIFORMNAMEPROC glGetActiveUniformName;
PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv;
PFNGLGETINTEGERI_VPROC glGetIntegeri_v;
PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex;
PFNGLGETUNIFORMINDICESPROC glGetUniformIndices;
PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding;
// ARB_sampler_objects
PFNGLBINDSAMPLERPROC glBindSampler;
PFNGLDELETESAMPLERSPROC glDeleteSamplers;
PFNGLGENSAMPLERSPROC glGenSamplers;
PFNGLGETSAMPLERPARAMETERIIVPROC glGetSamplerParameterIiv;
PFNGLGETSAMPLERPARAMETERIUIVPROC glGetSamplerParameterIuiv;
PFNGLGETSAMPLERPARAMETERFVPROC glGetSamplerParameterfv;
PFNGLGETSAMPLERPARAMETERIVPROC glGetSamplerParameteriv;
PFNGLISSAMPLERPROC glIsSampler;
PFNGLSAMPLERPARAMETERIIVPROC glSamplerParameterIiv;
PFNGLSAMPLERPARAMETERIUIVPROC glSamplerParameterIuiv;
PFNGLSAMPLERPARAMETERFPROC glSamplerParameterf;
PFNGLSAMPLERPARAMETERFVPROC glSamplerParameterfv;
PFNGLSAMPLERPARAMETERIPROC glSamplerParameteri;
PFNGLSAMPLERPARAMETERIVPROC glSamplerParameteriv;
// ARB_map_buffer_range
PFNGLFLUSHMAPPEDBUFFERRANGEPROC glFlushMappedBufferRange;
PFNGLMAPBUFFERRANGEPROC glMapBufferRange;
// ARB_vertex_array_object
PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
PFNGLISVERTEXARRAYPROC glIsVertexArray;
// ARB_framebuffer_object
PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer;
PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus;
PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D;
PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D;
PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer;
PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
PFNGLGENERATEMIPMAPPROC glGenerateMipmap;
PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv;
PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv;
PFNGLISFRAMEBUFFERPROC glIsFramebuffer;
PFNGLISRENDERBUFFERPROC glIsRenderbuffer;
PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample;
// ARB_get_program_binary
PFNGLGETPROGRAMBINARYPROC glGetProgramBinary;
PFNGLPROGRAMBINARYPROC glProgramBinary;
PFNGLPROGRAMPARAMETERIPROC glProgramParameteri;
// ARB_sync
PFNGLCLIENTWAITSYNCPROC glClientWaitSync;
PFNGLDELETESYNCPROC glDeleteSync;
PFNGLFENCESYNCPROC glFenceSync;
PFNGLGETINTEGER64VPROC glGetInteger64v;
PFNGLGETSYNCIVPROC glGetSynciv;
PFNGLISSYNCPROC glIsSync;
PFNGLWAITSYNCPROC glWaitSync;
// ARB_ES2_compatibility
PFNGLCLEARDEPTHFPROC glClearDepthf;
PFNGLDEPTHRANGEFPROC glDepthRangef;
PFNGLGETSHADERPRECISIONFORMATPROC glGetShaderPrecisionFormat;
PFNGLRELEASESHADERCOMPILERPROC glReleaseShaderCompiler;
PFNGLSHADERBINARYPROC glShaderBinary;
// NV_primitive_restart
PFNGLPRIMITIVERESTARTINDEXNVPROC glPrimitiveRestartIndexNV;
PFNGLPRIMITIVERESTARTNVPROC glPrimitiveRestartNV;
// ARB_blend_func_extended
PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glBindFragDataLocationIndexed;
PFNGLGETFRAGDATAINDEXPROC glGetFragDataIndex;
// ARB_viewport_array
PFNGLDEPTHRANGEARRAYVPROC glDepthRangeArrayv;
PFNGLDEPTHRANGEINDEXEDPROC glDepthRangeIndexed;
PFNGLGETDOUBLEI_VPROC glGetDoublei_v;
PFNGLGETFLOATI_VPROC glGetFloati_v;
PFNGLSCISSORARRAYVPROC glScissorArrayv;
PFNGLSCISSORINDEXEDPROC glScissorIndexed;
PFNGLSCISSORINDEXEDVPROC glScissorIndexedv;
PFNGLVIEWPORTARRAYVPROC glViewportArrayv;
PFNGLVIEWPORTINDEXEDFPROC glViewportIndexedf;
PFNGLVIEWPORTINDEXEDFVPROC glViewportIndexedfv;
// ARB_draw_elements_base_vertex
PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex;
PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glDrawElementsInstancedBaseVertex;
PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glDrawRangeElementsBaseVertex;
PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glMultiDrawElementsBaseVertex;
// NV_framebuffer_multisample_coverage
PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC glRenderbufferStorageMultisampleCoverageNV;
// ARB_sample_shading
PFNGLMINSAMPLESHADINGARBPROC glMinSampleShadingARB;
// ARB_debug_output
PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB;
PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB;
PFNGLDEBUGMESSAGEINSERTARBPROC glDebugMessageInsertARB;
PFNGLGETDEBUGMESSAGELOGARBPROC glGetDebugMessageLogARB;
// KHR_debug
PFNGLDEBUGMESSAGECONTROLKHRPROC glDebugMessageControlKHR;
PFNGLDEBUGMESSAGEINSERTKHRPROC glDebugMessageInsertKHR;
PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR;
PFNGLGETDEBUGMESSAGELOGKHRPROC glGetDebugMessageLogKHR;
PFNGLPUSHDEBUGGROUPKHRPROC glPushDebugGroupKHR;
PFNGLPOPDEBUGGROUPKHRPROC glPopDebugGroupKHR;
PFNGLOBJECTLABELKHRPROC glObjectLabelKHR;
PFNGLGETOBJECTLABELKHRPROC glGetObjectLabelKHR;
PFNGLOBJECTPTRLABELKHRPROC glObjectPtrLabelKHR;
PFNGLGETOBJECTPTRLABELKHRPROC glGetObjectPtrLabelKHR;
PFNGLGETPOINTERVKHRPROC glGetPoitnervKHR;
namespace GLExtensions
{
// Private members and functions
void *_dlsym;
bool _isES3;
u32 _GLVersion;
std::unordered_map<std::string, bool> _extensionlist;
// Forward declared init functions
bool init_gl_1_2();
// bool init_gl_1_3();
bool init_gl_1_4();
bool init_gl_1_5();
bool init_gl_2_0();
bool init_gl_3_0();
bool init_gl_3_1();
bool init_gl_3_2();
bool init_arb_uniform_buffer_object();
bool init_arb_sampler_objects();
bool init_arb_map_buffer_range();
bool init_arb_vertex_array_object();
bool init_arb_framebuffer_object();
bool init_arb_get_program_binary();
bool init_arb_sync();
bool init_arb_es2_compatibility();
bool init_nv_primitive_restart();
bool init_arb_blend_func_extended();
bool init_arb_viewport_array();
bool init_arb_draw_elements_base_vertex();
bool init_nv_framebuffer_multisample_coverage();
bool init_arb_sample_shading();
bool init_arb_debug_output();
bool init_khr_debug();
void InitExtensionList()
{
_extensionlist.clear();
if (_isES3)
{
// XXX: Add all extensions that a base ES3 implementation supports
std::string gles3exts[] = {
"GL_ARB_uniform_buffer_object",
"GL_ARB_sampler_objects",
"GL_ARB_map_buffer_range",
"GL_ARB_vertex_array_object",
"GL_ARB_framebuffer_object",
"GL_ARB_occlusion_query",
"GL_ARB_get_program_binary",
"GL_ARB_sync",
"GL_ARB_ES2_compatibility",
};
for (auto it : gles3exts)
_extensionlist[it] = true;
}
GLint NumExtension = 0;
glGetIntegerv(GL_NUM_EXTENSIONS, &NumExtension);
for (GLint i = 0; i < NumExtension; ++i)
_extensionlist[std::string((const char*)glGetStringi(GL_EXTENSIONS, i))] = true;
}
void InitVersion()
{
GLint major, minor;
glGetIntegerv(GL_MAJOR_VERSION, &major);
glGetIntegerv(GL_MINOR_VERSION, &minor);
_GLVersion = major * 100 + minor * 10;
if (_isES3)
_GLVersion = 330; // Get all the fun things
}
void* GetProcAddress(std::string name, void **func)
{
*func = GLInterface->GetProcAddress(name);
if (*func == NULL)
{
#if defined(__linux__)
// Give it a second try with dlsym
if (_dlsym) // Just in case dlopen fails
*func = dlsym(_dlsym, name.c_str());
#endif
if (*func == NULL && _isES3)
*func = (void*)0xFFFFFFFF; // Easy to determine invalid function, just so we continue on
if (*func == NULL)
ERROR_LOG(VIDEO, "Couldn't load function %s", name.c_str());
}
return *func;
}
// Public members
u32 Version() { return _GLVersion; }
bool Supports(std::string name)
{
return _extensionlist.find(name) != _extensionlist.end();
}
bool Init()
{
bool success = true;
#if defined(__linux__)
_dlsym = dlopen(NULL, RTLD_LAZY);
#endif
_isES3 = GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGLES3;
// Grab glGetStringi immediately
// We need it to grab the extension list
// If it fails then the user's drivers don't support GL 3.0
if (GetProcAddress("glGetStringi", (void**)&glGetStringi) == NULL)
return false;
InitExtensionList();
InitVersion();
if (success && !init_gl_1_2()) success = false;
//if (success && !init_gl_1_3()) success = false;
if (success && !init_gl_1_4()) success = false;
if (success && !init_gl_1_5()) success = false;
if (success && !init_gl_2_0()) success = false;
if (success && !init_gl_3_0()) success = false;
if (success && !init_gl_3_1()) success = false;
if (success && !init_gl_3_2()) success = false;
if (success && !init_arb_uniform_buffer_object()) success = false;
if (success && !init_arb_sampler_objects()) success = false;
if (success && !init_arb_map_buffer_range()) success = false;
if (success && !init_arb_vertex_array_object()) success = false;
if (success && !init_arb_framebuffer_object()) success = false;
if (success && !init_arb_get_program_binary()) success = false;
if (success && !init_arb_sync()) success = false;
if (success && !init_arb_es2_compatibility()) success = false;
if (success && !init_nv_primitive_restart()) success = false;
if (success && !init_arb_blend_func_extended()) success = false;
if (success && !init_arb_viewport_array()) success = false;
if (success && !init_arb_draw_elements_base_vertex()) success = false;
if (success && !init_arb_sample_shading()) success = false;
if (success && !init_arb_debug_output()) success = false;
if (success && !init_nv_framebuffer_multisample_coverage()) success = false;
if (success && !init_khr_debug()) success = false;
#if defined(__linux__)
dlclose(_dlsym);
#endif
return success;
}
// Private initialization functions
#define GrabFunction(x) \
if (GetProcAddress(#x, (void**)&x) == NULL) \
return false;
#define GrabFunctionSuffix(x, y) \
if (GetProcAddress(#x #y, (void**)&x) == NULL) \
return false;
bool init_gl_1_2()
{
GrabFunction(glCopyTexSubImage3D)
GrabFunction(glDrawRangeElements)
GrabFunction(glTexImage3D)
GrabFunction(glTexSubImage3D)
return true;
}
/*
bool init_gl_1_3()
{
GrabFunction(glActiveTexture)
GrabFunction(glClientActiveTexture)
GrabFunction(glCompressedTexImage1D)
GrabFunction(glCompressedTexImage2D)
GrabFunction(glCompressedTexImage3D)
GrabFunction(glCompressedTexSubImage1D)
GrabFunction(glCompressedTexSubImage2D)
GrabFunction(glCompressedTexSubImage3D)
GrabFunction(glGetCompressedTexImage)
GrabFunction(glLoadTransposeMatrixd)
GrabFunction(glLoadTransposeMatrixf)
GrabFunction(glMultTransposeMatrixd)
GrabFunction(glMultTransposeMatrixf)
GrabFunction(glMultiTexCoord1d)
GrabFunction(glMultiTexCoord1dv)
GrabFunction(glMultiTexCoord1f)
GrabFunction(glMultiTexCoord1fv)
GrabFunction(glMultiTexCoord1i)
GrabFunction(glMultiTexCoord1iv)
GrabFunction(glMultiTexCoord1s)
GrabFunction(glMultiTexCoord1sv)
GrabFunction(glMultiTexCoord2d)
GrabFunction(glMultiTexCoord2dv)
GrabFunction(glMultiTexCoord2f)
GrabFunction(glMultiTexCoord2fv)
GrabFunction(glMultiTexCoord2i)
GrabFunction(glMultiTexCoord2iv)
GrabFunction(glMultiTexCoord2s)
GrabFunction(glMultiTexCoord2sv)
GrabFunction(glMultiTexCoord3d)
GrabFunction(glMultiTexCoord3dv)
GrabFunction(glMultiTexCoord3f)
GrabFunction(glMultiTexCoord3fv)
GrabFunction(glMultiTexCoord3i)
GrabFunction(glMultiTexCoord3iv)
GrabFunction(glMultiTexCoord3s)
GrabFunction(glMultiTexCoord3sv)
GrabFunction(glMultiTexCoord4d)
GrabFunction(glMultiTexCoord4dv)
GrabFunction(glMultiTexCoord4f)
GrabFunction(glMultiTexCoord4fv)
GrabFunction(glMultiTexCoord4i)
GrabFunction(glMultiTexCoord4iv)
GrabFunction(glMultiTexCoord4s)
GrabFunction(glMultiTexCoord4sv)
GrabFunction(glSampleCoverage)
return true;
}
*/
bool init_gl_1_4()
{
//GrabFunction(glBlendColor)
//GrabFunction(glBlendEquation)
GrabFunction(glBlendFuncSeparate)
GrabFunction(glFogCoordPointer)
GrabFunction(glFogCoordd)
GrabFunction(glFogCoorddv)
GrabFunction(glFogCoordf)
GrabFunction(glFogCoordfv)
GrabFunction(glMultiDrawArrays)
GrabFunction(glMultiDrawElements)
GrabFunction(glPointParameterf)
GrabFunction(glPointParameterfv)
GrabFunction(glPointParameteri)
GrabFunction(glPointParameteriv)
GrabFunction(glSecondaryColor3b)
GrabFunction(glSecondaryColor3bv)
GrabFunction(glSecondaryColor3d)
GrabFunction(glSecondaryColor3dv)
GrabFunction(glSecondaryColor3f)
GrabFunction(glSecondaryColor3fv)
GrabFunction(glSecondaryColor3i)
GrabFunction(glSecondaryColor3iv)
GrabFunction(glSecondaryColor3s)
GrabFunction(glSecondaryColor3sv)
GrabFunction(glSecondaryColor3ub)
GrabFunction(glSecondaryColor3ubv)
GrabFunction(glSecondaryColor3ui)
GrabFunction(glSecondaryColor3uiv)
GrabFunction(glSecondaryColor3us)
GrabFunction(glSecondaryColor3usv)
GrabFunction(glSecondaryColorPointer)
GrabFunction(glWindowPos2d)
GrabFunction(glWindowPos2dv)
GrabFunction(glWindowPos2f)
GrabFunction(glWindowPos2fv)
GrabFunction(glWindowPos2i)
GrabFunction(glWindowPos2iv)
GrabFunction(glWindowPos2s)
GrabFunction(glWindowPos2sv)
GrabFunction(glWindowPos3d)
GrabFunction(glWindowPos3dv)
GrabFunction(glWindowPos3f)
GrabFunction(glWindowPos3fv)
GrabFunction(glWindowPos3i)
GrabFunction(glWindowPos3iv)
GrabFunction(glWindowPos3s)
GrabFunction(glWindowPos3sv)
return true;
}
bool init_gl_1_5()
{
GrabFunction(glBeginQuery)
GrabFunction(glBindBuffer)
GrabFunction(glBufferData)
GrabFunction(glBufferSubData)
GrabFunction(glDeleteBuffers)
GrabFunction(glDeleteQueries)
GrabFunction(glEndQuery)
GrabFunction(glGenBuffers)
GrabFunction(glGenQueries)
GrabFunction(glGetBufferParameteriv)
GrabFunction(glGetBufferPointerv)
GrabFunction(glGetBufferSubData)
GrabFunction(glGetQueryObjectiv)
GrabFunction(glGetQueryObjectuiv)
GrabFunction(glGetQueryiv)
GrabFunction(glIsBuffer)
GrabFunction(glIsQuery)
GrabFunction(glMapBuffer)
GrabFunction(glUnmapBuffer)
return true;
}
bool init_gl_2_0()
{
GrabFunction(glAttachShader)
GrabFunction(glBindAttribLocation)
GrabFunction(glBlendEquationSeparate)
GrabFunction(glCompileShader)
GrabFunction(glCreateProgram)
GrabFunction(glCreateShader)
GrabFunction(glDeleteProgram)
GrabFunction(glDeleteShader)
GrabFunction(glDetachShader)
GrabFunction(glDisableVertexAttribArray)
GrabFunction(glDrawBuffers)
GrabFunction(glEnableVertexAttribArray)
GrabFunction(glGetActiveAttrib)
GrabFunction(glGetActiveUniform)
GrabFunction(glGetAttachedShaders)
GrabFunction(glGetAttribLocation)
GrabFunction(glGetProgramInfoLog)
GrabFunction(glGetProgramiv)
GrabFunction(glGetShaderInfoLog)
GrabFunction(glGetShaderSource)
GrabFunction(glGetShaderiv)
GrabFunction(glGetUniformLocation)
GrabFunction(glGetUniformfv)
GrabFunction(glGetUniformiv)
GrabFunction(glGetVertexAttribPointerv)
GrabFunction(glGetVertexAttribdv)
GrabFunction(glGetVertexAttribfv)
GrabFunction(glGetVertexAttribiv)
GrabFunction(glIsProgram)
GrabFunction(glIsShader)
GrabFunction(glLinkProgram)
GrabFunction(glShaderSource)
GrabFunction(glStencilFuncSeparate)
GrabFunction(glStencilMaskSeparate)
GrabFunction(glStencilOpSeparate)
GrabFunction(glUniform1f)
GrabFunction(glUniform1fv)
GrabFunction(glUniform1i)
GrabFunction(glUniform1iv)
GrabFunction(glUniform2f)
GrabFunction(glUniform2fv)
GrabFunction(glUniform2i)
GrabFunction(glUniform2iv)
GrabFunction(glUniform3f)
GrabFunction(glUniform3fv)
GrabFunction(glUniform3i)
GrabFunction(glUniform3iv)
GrabFunction(glUniform4f)
GrabFunction(glUniform4fv)
GrabFunction(glUniform4i)
GrabFunction(glUniform4iv)
GrabFunction(glUniformMatrix2fv)
GrabFunction(glUniformMatrix3fv)
GrabFunction(glUniformMatrix4fv)
GrabFunction(glUseProgram)
GrabFunction(glValidateProgram)
GrabFunction(glVertexAttrib1d)
GrabFunction(glVertexAttrib1dv)
GrabFunction(glVertexAttrib1f)
GrabFunction(glVertexAttrib1fv)
GrabFunction(glVertexAttrib1s)
GrabFunction(glVertexAttrib1sv)
GrabFunction(glVertexAttrib2d)
GrabFunction(glVertexAttrib2dv)
GrabFunction(glVertexAttrib2f)
GrabFunction(glVertexAttrib2fv)
GrabFunction(glVertexAttrib2s)
GrabFunction(glVertexAttrib2sv)
GrabFunction(glVertexAttrib3d)
GrabFunction(glVertexAttrib3dv)
GrabFunction(glVertexAttrib3f)
GrabFunction(glVertexAttrib3fv)
GrabFunction(glVertexAttrib3s)
GrabFunction(glVertexAttrib3sv)
GrabFunction(glVertexAttrib4Nbv)
GrabFunction(glVertexAttrib4Niv)
GrabFunction(glVertexAttrib4Nsv)
GrabFunction(glVertexAttrib4Nub)
GrabFunction(glVertexAttrib4Nubv)
GrabFunction(glVertexAttrib4Nuiv)
GrabFunction(glVertexAttrib4Nusv)
GrabFunction(glVertexAttrib4bv)
GrabFunction(glVertexAttrib4d)
GrabFunction(glVertexAttrib4dv)
GrabFunction(glVertexAttrib4f)
GrabFunction(glVertexAttrib4fv)
GrabFunction(glVertexAttrib4iv)
GrabFunction(glVertexAttrib4s)
GrabFunction(glVertexAttrib4sv)
GrabFunction(glVertexAttrib4ubv)
GrabFunction(glVertexAttrib4uiv)
GrabFunction(glVertexAttrib4usv)
GrabFunction(glVertexAttribPointer)
return true;
}
bool init_gl_3_0()
{
if (Version() < 300)
return true;
GrabFunction(glBeginConditionalRender)
GrabFunction(glBeginTransformFeedback)
GrabFunction(glBindFragDataLocation)
GrabFunction(glClampColor)
GrabFunction(glClearBufferfi)
GrabFunction(glClearBufferfv)
GrabFunction(glClearBufferiv)
GrabFunction(glClearBufferuiv)
GrabFunction(glColorMaski)
GrabFunction(glDisablei)
GrabFunction(glEnablei)
GrabFunction(glEndConditionalRender)
GrabFunction(glEndTransformFeedback)
GrabFunction(glGetBooleani_v)
GrabFunction(glGetFragDataLocation)
GrabFunction(glGetStringi)
GrabFunction(glGetTexParameterIiv)
GrabFunction(glGetTexParameterIuiv)
GrabFunction(glGetTransformFeedbackVarying)
GrabFunction(glGetUniformuiv)
GrabFunction(glGetVertexAttribIiv)
GrabFunction(glGetVertexAttribIuiv)
GrabFunction(glIsEnabledi)
GrabFunction(glTexParameterIiv)
GrabFunction(glTexParameterIuiv)
GrabFunction(glTransformFeedbackVaryings)
GrabFunction(glUniform1ui)
GrabFunction(glUniform1uiv)
GrabFunction(glUniform2ui)
GrabFunction(glUniform2uiv)
GrabFunction(glUniform3ui)
GrabFunction(glUniform3uiv)
GrabFunction(glUniform4ui)
GrabFunction(glUniform4uiv)
GrabFunction(glVertexAttribI1i)
GrabFunction(glVertexAttribI1iv)
GrabFunction(glVertexAttribI1ui)
GrabFunction(glVertexAttribI1uiv)
GrabFunction(glVertexAttribI2i)
GrabFunction(glVertexAttribI2iv)
GrabFunction(glVertexAttribI2ui)
GrabFunction(glVertexAttribI2uiv)
GrabFunction(glVertexAttribI3i)
GrabFunction(glVertexAttribI3iv)
GrabFunction(glVertexAttribI3ui)
GrabFunction(glVertexAttribI3uiv)
GrabFunction(glVertexAttribI4bv)
GrabFunction(glVertexAttribI4i)
GrabFunction(glVertexAttribI4iv)
GrabFunction(glVertexAttribI4sv)
GrabFunction(glVertexAttribI4ubv)
GrabFunction(glVertexAttribI4ui)
GrabFunction(glVertexAttribI4uiv)
GrabFunction(glVertexAttribI4usv)
GrabFunction(glVertexAttribIPointer)
return true;
}
bool init_gl_3_1()
{
if (Version() < 310)
return true;
GrabFunction(glDrawArraysInstanced)
GrabFunction(glDrawElementsInstanced)
GrabFunction(glPrimitiveRestartIndex)
GrabFunction(glTexBuffer)
return true;
}
bool init_gl_3_2()
{
if (Version() < 320)
return true;
GrabFunction(glFramebufferTexture)
GrabFunction(glGetBufferParameteri64v)
GrabFunction(glGetInteger64i_v)
return true;
}
bool init_arb_uniform_buffer_object()
{
if (!Supports("GL_ARB_uniform_buffer_object"))
return true;
GrabFunction(glBindBufferBase)
GrabFunction(glBindBufferRange)
GrabFunction(glGetActiveUniformBlockName)
GrabFunction(glGetActiveUniformBlockiv)
GrabFunction(glGetActiveUniformName)
GrabFunction(glGetActiveUniformsiv)
GrabFunction(glGetIntegeri_v)
GrabFunction(glGetUniformBlockIndex)
GrabFunction(glGetUniformIndices)
GrabFunction(glUniformBlockBinding)
return true;
}
bool init_arb_sampler_objects()
{
if (!Supports("GL_ARB_sampler_objects"))
return true;
GrabFunction(glBindSampler)
GrabFunction(glDeleteSamplers)
GrabFunction(glGenSamplers)
GrabFunction(glGetSamplerParameterIiv)
GrabFunction(glGetSamplerParameterIuiv)
GrabFunction(glGetSamplerParameterfv)
GrabFunction(glGetSamplerParameteriv)
GrabFunction(glIsSampler)
GrabFunction(glSamplerParameterIiv)
GrabFunction(glSamplerParameterIuiv)
GrabFunction(glSamplerParameterf)
GrabFunction(glSamplerParameterfv)
GrabFunction(glSamplerParameteri)
GrabFunction(glSamplerParameteriv)
return true;
}
bool init_arb_map_buffer_range()
{
if (!Supports("GL_ARB_map_buffer_range"))
return true;
GrabFunction(glFlushMappedBufferRange)
GrabFunction(glMapBufferRange)
return true;
}
bool init_arb_vertex_array_object()
{
if (!(Supports("GL_ARB_vertex_array_object") ||
Supports("GL_APPLE_vertex_array_object")))
return true;
if (Supports("GL_ARB_vertex_array_object"))
{
GrabFunction(glBindVertexArray)
GrabFunction(glDeleteVertexArrays)
GrabFunction(glGenVertexArrays)
GrabFunction(glIsVertexArray)
}
else if (Supports("GL_APPLE_vertex_array_object"))
{
GrabFunctionSuffix(glBindVertexArray, APPLE)
GrabFunctionSuffix(glDeleteVertexArrays, APPLE)
GrabFunctionSuffix(glGenVertexArrays, APPLE)
GrabFunctionSuffix(glIsVertexArray, APPLE)
}
return true;
}
bool init_arb_framebuffer_object()
{
if (!Supports("GL_ARB_framebuffer_object"))
return true;
GrabFunction(glBindFramebuffer)
GrabFunction(glBindRenderbuffer)
GrabFunction(glBlitFramebuffer)
GrabFunction(glCheckFramebufferStatus)
GrabFunction(glDeleteFramebuffers)
GrabFunction(glDeleteRenderbuffers)
GrabFunction(glFramebufferRenderbuffer)
GrabFunction(glFramebufferTexture1D)
GrabFunction(glFramebufferTexture2D)
GrabFunction(glFramebufferTexture3D)
GrabFunction(glFramebufferTextureLayer)
GrabFunction(glGenFramebuffers)
GrabFunction(glGenRenderbuffers)
GrabFunction(glGenerateMipmap)
GrabFunction(glGetFramebufferAttachmentParameteriv)
GrabFunction(glGetRenderbufferParameteriv)
GrabFunction(glIsFramebuffer)
GrabFunction(glIsRenderbuffer)
GrabFunction(glRenderbufferStorage)
GrabFunction(glRenderbufferStorageMultisample)
return true;
}
bool init_arb_get_program_binary()
{
if (!Supports("GL_ARB_get_program_binary"))
return true;
GrabFunction(glGetProgramBinary)
GrabFunction(glProgramBinary)
GrabFunction(glProgramParameteri)
return true;
}
bool init_arb_sync()
{
if (!(Supports("GL_ARB_sync") ||
Version() >= 320))
return true;
GrabFunction(glClientWaitSync)
GrabFunction(glDeleteSync)
GrabFunction(glFenceSync)
GrabFunction(glGetInteger64v)
GrabFunction(glGetSynciv)
GrabFunction(glIsSync)
GrabFunction(glWaitSync)
return true;
}
bool init_arb_es2_compatibility()
{
if (!Supports("GL_ARB_ES2_compatibility"))
return true;
GrabFunction(glClearDepthf)
GrabFunction(glDepthRangef)
GrabFunction(glGetShaderPrecisionFormat)
GrabFunction(glReleaseShaderCompiler)
GrabFunction(glShaderBinary)
return true;
}
bool init_nv_primitive_restart()
{
if (!Supports("GL_NV_primitive_restart"))
return true;
GrabFunction(glPrimitiveRestartIndexNV)
GrabFunction(glPrimitiveRestartNV)
return true;
}
bool init_arb_blend_func_extended()
{
if (!Supports("GL_ARB_blend_func_extended"))
return true;
GrabFunction(glBindFragDataLocationIndexed)
GrabFunction(glGetFragDataIndex)
return true;
}
bool init_arb_viewport_array()
{
if (!Supports("GL_ARB_viewport_array"))
return true;
GrabFunction(glDepthRangeArrayv)
GrabFunction(glDepthRangeIndexed)
GrabFunction(glGetDoublei_v)
GrabFunction(glGetFloati_v)
GrabFunction(glScissorArrayv)
GrabFunction(glScissorIndexed)
GrabFunction(glScissorIndexedv)
GrabFunction(glViewportArrayv)
GrabFunction(glViewportIndexedf)
GrabFunction(glViewportIndexedfv)
return true;
}
bool init_arb_draw_elements_base_vertex()
{
if (!Supports("GL_ARB_draw_elements_base_vertex"))
return true;
GrabFunction(glDrawElementsBaseVertex)
GrabFunction(glDrawElementsInstancedBaseVertex)
GrabFunction(glDrawRangeElementsBaseVertex)
GrabFunction(glMultiDrawElementsBaseVertex)
return true;
}
bool init_nv_framebuffer_multisample_coverage()
{
if (!Supports("GL_NV_framebuffer_multisample_coverage"))
return true;
GrabFunction(glRenderbufferStorageMultisampleCoverageNV)
return true;
}
bool init_arb_sample_shading()
{
if (!Supports("GL_ARB_sample_shading"))
return true;
GrabFunction(glMinSampleShadingARB)
return true;
}
bool init_arb_debug_output()
{
if (!Supports("GL_ARB_debug_output"))
return true;
GrabFunction(glDebugMessageCallbackARB)
GrabFunction(glDebugMessageControlARB)
GrabFunction(glDebugMessageInsertARB)
GrabFunction(glGetDebugMessageLogARB)
return true;
}
bool init_khr_debug()
{
if (!Supports("GL_KHR_debug"))
return true;
GrabFunction(glDebugMessageControlKHR)
GrabFunction(glDebugMessageInsertKHR)
GrabFunction(glDebugMessageCallbackKHR)
GrabFunction(glGetDebugMessageLogKHR)
GrabFunction(glPushDebugGroupKHR)
GrabFunction(glPopDebugGroupKHR)
GrabFunction(glObjectLabelKHR)
GrabFunction(glGetObjectLabelKHR)
GrabFunction(glObjectPtrLabelKHR)
GrabFunction(glGetObjectPtrLabelKHR)
GrabFunction(glGetPoitnervKHR)
return true;
}
}