// Copyright 2013 Dolphin Emulator Project // Licensed under GPLv2 // Refer to the license.txt file included. #include "GLExtensions.h" #include "Log.h" #if defined(__linux__) || defined(__APPLE__) #include #endif #include #include // gl_1_1 PFNGLCLEARINDEXPROC glClearIndex; PFNGLCLEARCOLORPROC glClearColor; PFNGLCLEARPROC glClear; PFNGLINDEXMASKPROC glIndexMask; PFNGLCOLORMASKPROC glColorMask; PFNGLALPHAFUNCPROC glAlphaFunc; PFNGLBLENDFUNCPROC glBlendFunc; PFNGLLOGICOPPROC glLogicOp; PFNGLCULLFACEPROC glCullFace; PFNGLFRONTFACEPROC glFrontFace; PFNGLPOINTSIZEPROC glPointSize; PFNGLLINEWIDTHPROC glLineWidth; PFNGLLINESTIPPLEPROC glLineStipple; PFNGLPOLYGONMODEPROC glPolygonMode; PFNGLPOLYGONOFFSETPROC glPolygonOffset; PFNGLPOLYGONSTIPPLEPROC glPolygonStipple; PFNGLGETPOLYGONSTIPPLEPROC glGetPolygonStipple; PFNGLEDGEFLAGPROC glEdgeFlag; PFNGLEDGEFLAGVPROC glEdgeFlagv; PFNGLSCISSORPROC glScissor; PFNGLCLIPPLANEPROC glClipPlane; PFNGLGETCLIPPLANEPROC glGetClipPlane; PFNGLDRAWBUFFERPROC glDrawBuffer; PFNGLREADBUFFERPROC glReadBuffer; PFNGLENABLEPROC glEnable; PFNGLDISABLEPROC glDisable; PFNGLISENABLEDPROC glIsEnabled; PFNGLENABLECLIENTSTATEPROC glEnableClientState; PFNGLDISABLECLIENTSTATEPROC glDisableClientState; PFNGLGETBOOLEANVPROC glGetBooleanv; PFNGLGETDOUBLEVPROC glGetDoublev; PFNGLGETFLOATVPROC glGetFloatv; PFNGLGETINTEGERVPROC glGetIntegerv; PFNGLPUSHATTRIBPROC glPushAttrib; PFNGLPOPATTRIBPROC glPopAttrib; PFNGLPUSHCLIENTATTRIBPROC glPushClientAttrib; PFNGLPOPCLIENTATTRIBPROC glPopClientAttrib; PFNGLRENDERMODEPROC glRenderMode; PFNGLGETERRORPROC glGetError; PFNGLGETSTRINGPROC glGetString; PFNGLFINISHPROC glFinish; PFNGLFLUSHPROC glFlush; PFNGLHINTPROC glHint; PFNGLCLEARDEPTHPROC glClearDepth; PFNGLDEPTHFUNCPROC glDepthFunc; PFNGLDEPTHMASKPROC glDepthMask; PFNGLDEPTHRANGEPROC glDepthRange; PFNGLCLEARACCUMPROC glClearAccum; PFNGLACCUMPROC glAccum; PFNGLMATRIXMODEPROC glMatrixMode; PFNGLORTHOPROC glOrtho; PFNGLFRUSTUMPROC glFrustum; PFNGLVIEWPORTPROC glViewport; PFNGLPUSHMATRIXPROC glPushMatrix; PFNGLPOPMATRIXPROC glPopMatrix; PFNGLLOADIDENTITYPROC glLoadIdentity; PFNGLLOADMATRIXDPROC glLoadMatrixd; PFNGLLOADMATRIXFPROC glLoadMatrixf; PFNGLMULTMATRIXDPROC glMultMatrixd; PFNGLMULTMATRIXFPROC glMultMatrixf; PFNGLROTATEDPROC glRotated; PFNGLROTATEFPROC glRotatef; PFNGLSCALEDPROC glScaled; PFNGLSCALEFPROC glScalef; PFNGLTRANSLATEDPROC glTranslated; PFNGLTRANSLATEFPROC glTranslatef; PFNGLISLISTPROC glIsList; PFNGLDELETELISTSPROC glDeleteLists; PFNGLGENLISTSPROC glGenLists; PFNGLNEWLISTPROC glNewList; PFNGLENDLISTPROC glEndList; PFNGLCALLLISTPROC glCallList; PFNGLCALLLISTSPROC glCallLists; PFNGLLISTBASEPROC glListBase; PFNGLBEGINPROC glBegin; PFNGLENDPROC glEnd; PFNGLVERTEX2DPROC glVertex2d; PFNGLVERTEX2FPROC glVertex2f; PFNGLVERTEX2IPROC glVertex2i; PFNGLVERTEX2SPROC glVertex2s; PFNGLVERTEX3DPROC glVertex3d; PFNGLVERTEX3FPROC glVertex3f; PFNGLVERTEX3IPROC glVertex3i; PFNGLVERTEX3SPROC glVertex3s; PFNGLVERTEX4DPROC glVertex4d; PFNGLVERTEX4FPROC glVertex4f; PFNGLVERTEX4IPROC glVertex4i; PFNGLVERTEX4SPROC glVertex4s; PFNGLVERTEX2DVPROC glVertex2dv; PFNGLVERTEX2FVPROC glVertex2fv; PFNGLVERTEX2IVPROC glVertex2iv; PFNGLVERTEX2SVPROC glVertex2sv; PFNGLVERTEX3DVPROC glVertex3dv; PFNGLVERTEX3FVPROC glVertex3fv; PFNGLVERTEX3IVPROC glVertex3iv; PFNGLVERTEX3SVPROC glVertex3sv; PFNGLVERTEX4DVPROC glVertex4dv; PFNGLVERTEX4FVPROC glVertex4fv; PFNGLVERTEX4IVPROC glVertex4iv; PFNGLVERTEX4SVPROC glVertex4sv; PFNGLNORMAL3BPROC glNormal3b; PFNGLNORMAL3DPROC glNormal3d; PFNGLNORMAL3FPROC glNormal3f; PFNGLNORMAL3IPROC glNormal3i; PFNGLNORMAL3SPROC glNormal3s; PFNGLNORMAL3BVPROC glNormal3bv; PFNGLNORMAL3DVPROC glNormal3dv; PFNGLNORMAL3FVPROC glNormal3fv; PFNGLNORMAL3IVPROC glNormal3iv; PFNGLNORMAL3SVPROC glNormal3sv; PFNGLINDEXDPROC glIndexd; PFNGLINDEXFPROC glIndexf; PFNGLINDEXIPROC glIndexi; PFNGLINDEXSPROC glIndexs; PFNGLINDEXUBPROC glIndexub; PFNGLINDEXDVPROC glIndexdv; PFNGLINDEXFVPROC glIndexfv; PFNGLINDEXIVPROC glIndexiv; PFNGLINDEXSVPROC glIndexsv; PFNGLINDEXUBVPROC glIndexubv; PFNGLCOLOR3BPROC glColor3b; PFNGLCOLOR3DPROC glColor3d; PFNGLCOLOR3FPROC glColor3f; PFNGLCOLOR3IPROC glColor3i; PFNGLCOLOR3SPROC glColor3s; PFNGLCOLOR3UBPROC glColor3ub; PFNGLCOLOR3UIPROC glColor3ui; PFNGLCOLOR3USPROC glColor3us; PFNGLCOLOR4BPROC glColor4b; PFNGLCOLOR4DPROC glColor4d; PFNGLCOLOR4FPROC glColor4f; PFNGLCOLOR4IPROC glColor4i; PFNGLCOLOR4SPROC glColor4s; PFNGLCOLOR4UBPROC glColor4ub; PFNGLCOLOR4UIPROC glColor4ui; PFNGLCOLOR4USPROC glColor4us; PFNGLCOLOR3BVPROC glColor3bv; PFNGLCOLOR3DVPROC glColor3dv; PFNGLCOLOR3FVPROC glColor3fv; PFNGLCOLOR3IVPROC glColor3iv; PFNGLCOLOR3SVPROC glColor3sv; PFNGLCOLOR3UBVPROC glColor3ubv; PFNGLCOLOR3UIVPROC glColor3uiv; PFNGLCOLOR3USVPROC glColor3usv; PFNGLCOLOR4BVPROC glColor4bv; PFNGLCOLOR4DVPROC glColor4dv; PFNGLCOLOR4FVPROC glColor4fv; PFNGLCOLOR4IVPROC glColor4iv; PFNGLCOLOR4SVPROC glColor4sv; PFNGLCOLOR4UBVPROC glColor4ubv; PFNGLCOLOR4UIVPROC glColor4uiv; PFNGLCOLOR4USVPROC glColor4usv; PFNGLTEXCOORD1DPROC glTexCoord1d; PFNGLTEXCOORD1FPROC glTexCoord1f; PFNGLTEXCOORD1IPROC glTexCoord1i; PFNGLTEXCOORD1SPROC glTexCoord1s; PFNGLTEXCOORD2DPROC glTexCoord2d; PFNGLTEXCOORD2FPROC glTexCoord2f; PFNGLTEXCOORD2IPROC glTexCoord2i; PFNGLTEXCOORD2SPROC glTexCoord2s; PFNGLTEXCOORD3DPROC glTexCoord3d; PFNGLTEXCOORD3FPROC glTexCoord3f; PFNGLTEXCOORD3IPROC glTexCoord3i; PFNGLTEXCOORD3SPROC glTexCoord3s; PFNGLTEXCOORD4DPROC glTexCoord4d; PFNGLTEXCOORD4FPROC glTexCoord4f; PFNGLTEXCOORD4IPROC glTexCoord4i; PFNGLTEXCOORD4SPROC glTexCoord4s; PFNGLTEXCOORD1DVPROC glTexCoord1dv; PFNGLTEXCOORD1FVPROC glTexCoord1fv; PFNGLTEXCOORD1IVPROC glTexCoord1iv; PFNGLTEXCOORD1SVPROC glTexCoord1sv; PFNGLTEXCOORD2DVPROC glTexCoord2dv; PFNGLTEXCOORD2FVPROC glTexCoord2fv; PFNGLTEXCOORD2IVPROC glTexCoord2iv; PFNGLTEXCOORD2SVPROC glTexCoord2sv; PFNGLTEXCOORD3DVPROC glTexCoord3dv; PFNGLTEXCOORD3FVPROC glTexCoord3fv; PFNGLTEXCOORD3IVPROC glTexCoord3iv; PFNGLTEXCOORD3SVPROC glTexCoord3sv; PFNGLTEXCOORD4DVPROC glTexCoord4dv; PFNGLTEXCOORD4FVPROC glTexCoord4fv; PFNGLTEXCOORD4IVPROC glTexCoord4iv; PFNGLTEXCOORD4SVPROC glTexCoord4sv; PFNGLRASTERPOS2DPROC glRasterPos2d; PFNGLRASTERPOS2FPROC glRasterPos2f; PFNGLRASTERPOS2IPROC glRasterPos2i; PFNGLRASTERPOS2SPROC glRasterPos2s; PFNGLRASTERPOS3DPROC glRasterPos3d; PFNGLRASTERPOS3FPROC glRasterPos3f; PFNGLRASTERPOS3IPROC glRasterPos3i; PFNGLRASTERPOS3SPROC glRasterPos3s; PFNGLRASTERPOS4DPROC glRasterPos4d; PFNGLRASTERPOS4FPROC glRasterPos4f; PFNGLRASTERPOS4IPROC glRasterPos4i; PFNGLRASTERPOS4SPROC glRasterPos4s; PFNGLRASTERPOS2DVPROC glRasterPos2dv; PFNGLRASTERPOS2FVPROC glRasterPos2fv; PFNGLRASTERPOS2IVPROC glRasterPos2iv; PFNGLRASTERPOS2SVPROC glRasterPos2sv; PFNGLRASTERPOS3DVPROC glRasterPos3dv; PFNGLRASTERPOS3FVPROC glRasterPos3fv; PFNGLRASTERPOS3IVPROC glRasterPos3iv; PFNGLRASTERPOS3SVPROC glRasterPos3sv; PFNGLRASTERPOS4DVPROC glRasterPos4dv; PFNGLRASTERPOS4FVPROC glRasterPos4fv; PFNGLRASTERPOS4IVPROC glRasterPos4iv; PFNGLRASTERPOS4SVPROC glRasterPos4sv; PFNGLRECTDPROC glRectd; PFNGLRECTFPROC glRectf; PFNGLRECTIPROC glRecti; PFNGLRECTSPROC glRects; PFNGLRECTDVPROC glRectdv; PFNGLRECTFVPROC glRectfv; PFNGLRECTIVPROC glRectiv; PFNGLRECTSVPROC glRectsv; PFNGLVERTEXPOINTERPROC glVertexPointer; PFNGLNORMALPOINTERPROC glNormalPointer; PFNGLCOLORPOINTERPROC glColorPointer; PFNGLINDEXPOINTERPROC glIndexPointer; PFNGLTEXCOORDPOINTERPROC glTexCoordPointer; PFNGLEDGEFLAGPOINTERPROC glEdgeFlagPointer; PFNGLGETPOINTERVPROC glGetPointerv; PFNGLARRAYELEMENTPROC glArrayElement; PFNGLDRAWARRAYSPROC glDrawArrays; PFNGLDRAWELEMENTSPROC glDrawElements; PFNGLINTERLEAVEDARRAYSPROC glInterleavedArrays; PFNGLSHADEMODELPROC glShadeModel; PFNGLLIGHTFPROC glLightf; PFNGLLIGHTIPROC glLighti; PFNGLLIGHTFVPROC glLightfv; PFNGLLIGHTIVPROC glLightiv; PFNGLGETLIGHTFVPROC glGetLightfv; PFNGLGETLIGHTIVPROC glGetLightiv; PFNGLLIGHTMODELFPROC glLightModelf; PFNGLLIGHTMODELIPROC glLightModeli; PFNGLLIGHTMODELFVPROC glLightModelfv; PFNGLLIGHTMODELIVPROC glLightModeliv; PFNGLMATERIALFPROC glMaterialf; PFNGLMATERIALIPROC glMateriali; PFNGLMATERIALFVPROC glMaterialfv; PFNGLMATERIALIVPROC glMaterialiv; PFNGLGETMATERIALFVPROC glGetMaterialfv; PFNGLGETMATERIALIVPROC glGetMaterialiv; PFNGLCOLORMATERIALPROC glColorMaterial; PFNGLPIXELZOOMPROC glPixelZoom; PFNGLPIXELSTOREFPROC glPixelStoref; PFNGLPIXELSTOREIPROC glPixelStorei; PFNGLPIXELTRANSFERFPROC glPixelTransferf; PFNGLPIXELTRANSFERIPROC glPixelTransferi; PFNGLPIXELMAPFVPROC glPixelMapfv; PFNGLPIXELMAPUIVPROC glPixelMapuiv; PFNGLPIXELMAPUSVPROC glPixelMapusv; PFNGLGETPIXELMAPFVPROC glGetPixelMapfv; PFNGLGETPIXELMAPUIVPROC glGetPixelMapuiv; PFNGLGETPIXELMAPUSVPROC glGetPixelMapusv; PFNGLBITMAPPROC glBitmap; PFNGLREADPIXELSPROC glReadPixels; PFNGLDRAWPIXELSPROC glDrawPixels; PFNGLCOPYPIXELSPROC glCopyPixels; PFNGLSTENCILFUNCPROC glStencilFunc; PFNGLSTENCILMASKPROC glStencilMask; PFNGLSTENCILOPPROC glStencilOp; PFNGLCLEARSTENCILPROC glClearStencil; PFNGLTEXGENDPROC glTexGend; PFNGLTEXGENFPROC glTexGenf; PFNGLTEXGENIPROC glTexGeni; PFNGLTEXGENDVPROC glTexGendv; PFNGLTEXGENFVPROC glTexGenfv; PFNGLTEXGENIVPROC glTexGeniv; PFNGLGETTEXGENDVPROC glGetTexGendv; PFNGLGETTEXGENFVPROC glGetTexGenfv; PFNGLGETTEXGENIVPROC glGetTexGeniv; PFNGLTEXENVFPROC glTexEnvf; PFNGLTEXENVIPROC glTexEnvi; PFNGLTEXENVFVPROC glTexEnvfv; PFNGLTEXENVIVPROC glTexEnviv; PFNGLGETTEXENVFVPROC glGetTexEnvfv; PFNGLGETTEXENVIVPROC glGetTexEnviv; PFNGLTEXPARAMETERFPROC glTexParameterf; PFNGLTEXPARAMETERIPROC glTexParameteri; PFNGLTEXPARAMETERFVPROC glTexParameterfv; PFNGLTEXPARAMETERIVPROC glTexParameteriv; PFNGLGETTEXPARAMETERFVPROC glGetTexParameterfv; PFNGLGETTEXPARAMETERIVPROC glGetTexParameteriv; PFNGLGETTEXLEVELPARAMETERFVPROC glGetTexLevelParameterfv; PFNGLGETTEXLEVELPARAMETERIVPROC glGetTexLevelParameteriv; PFNGLTEXIMAGE1DPROC glTexImage1D; PFNGLTEXIMAGE2DPROC glTexImage2D; PFNGLGETTEXIMAGEPROC glGetTexImage; PFNGLGENTEXTURESPROC glGenTextures; PFNGLDELETETEXTURESPROC glDeleteTextures; PFNGLBINDTEXTUREPROC glBindTexture; PFNGLPRIORITIZETEXTURESPROC glPrioritizeTextures; PFNGLARETEXTURESRESIDENTPROC glAreTexturesResident; PFNGLISTEXTUREPROC glIsTexture; PFNGLTEXSUBIMAGE1DPROC glTexSubImage1D; PFNGLTEXSUBIMAGE2DPROC glTexSubImage2D; PFNGLCOPYTEXIMAGE1DPROC glCopyTexImage1D; PFNGLCOPYTEXIMAGE2DPROC glCopyTexImage2D; PFNGLCOPYTEXSUBIMAGE1DPROC glCopyTexSubImage1D; PFNGLCOPYTEXSUBIMAGE2DPROC glCopyTexSubImage2D; PFNGLMAP1DPROC glMap1d; PFNGLMAP1FPROC glMap1f; PFNGLMAP2DPROC glMap2d; PFNGLMAP2FPROC glMap2f; PFNGLGETMAPDVPROC glGetMapdv; PFNGLGETMAPFVPROC glGetMapfv; PFNGLGETMAPIVPROC glGetMapiv; PFNGLEVALCOORD1DPROC glEvalCoord1d; PFNGLEVALCOORD1FPROC glEvalCoord1f; PFNGLEVALCOORD1DVPROC glEvalCoord1dv; PFNGLEVALCOORD1FVPROC glEvalCoord1fv; PFNGLEVALCOORD2DPROC glEvalCoord2d; PFNGLEVALCOORD2FPROC glEvalCoord2f; PFNGLEVALCOORD2DVPROC glEvalCoord2dv; PFNGLEVALCOORD2FVPROC glEvalCoord2fv; PFNGLMAPGRID1DPROC glMapGrid1d; PFNGLMAPGRID1FPROC glMapGrid1f; PFNGLMAPGRID2DPROC glMapGrid2d; PFNGLMAPGRID2FPROC glMapGrid2f; PFNGLEVALPOINT1PROC glEvalPoint1; PFNGLEVALPOINT2PROC glEvalPoint2; PFNGLEVALMESH1PROC glEvalMesh1; PFNGLEVALMESH2PROC glEvalMesh2; PFNGLFOGFPROC glFogf; PFNGLFOGIPROC glFogi; PFNGLFOGFVPROC glFogfv; PFNGLFOGIVPROC glFogiv; PFNGLFEEDBACKBUFFERPROC glFeedbackBuffer; PFNGLPASSTHROUGHPROC glPassThrough; PFNGLSELECTBUFFERPROC glSelectBuffer; PFNGLINITNAMESPROC glInitNames; PFNGLLOADNAMEPROC glLoadName; PFNGLPUSHNAMEPROC glPushName; PFNGLPOPNAMEPROC glPopName; // gl_1_2 PFNGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D; PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements; PFNGLTEXIMAGE3DPROC glTexImage3D; PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D; // gl_1_3 PFNGLACTIVETEXTUREARBPROC glActiveTexture; PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTexture; PFNGLCOMPRESSEDTEXIMAGE1DPROC glCompressedTexImage1D; PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D; PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D; PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glCompressedTexSubImage1D; PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D; PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D; PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage; PFNGLLOADTRANSPOSEMATRIXDARBPROC glLoadTransposeMatrixd; PFNGLLOADTRANSPOSEMATRIXFARBPROC glLoadTransposeMatrixf; PFNGLMULTTRANSPOSEMATRIXDARBPROC glMultTransposeMatrixd; PFNGLMULTTRANSPOSEMATRIXFARBPROC glMultTransposeMatrixf; PFNGLMULTITEXCOORD1DARBPROC glMultiTexCoord1d; PFNGLMULTITEXCOORD1DVARBPROC glMultiTexCoord1dv; PFNGLMULTITEXCOORD1FARBPROC glMultiTexCoord1f; PFNGLMULTITEXCOORD1FVARBPROC glMultiTexCoord1fv; PFNGLMULTITEXCOORD1IARBPROC glMultiTexCoord1i; PFNGLMULTITEXCOORD1IVARBPROC glMultiTexCoord1iv; PFNGLMULTITEXCOORD1SARBPROC glMultiTexCoord1s; PFNGLMULTITEXCOORD1SVARBPROC glMultiTexCoord1sv; PFNGLMULTITEXCOORD2DARBPROC glMultiTexCoord2d; PFNGLMULTITEXCOORD2DVARBPROC glMultiTexCoord2dv; PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2f; PFNGLMULTITEXCOORD2FVARBPROC glMultiTexCoord2fv; PFNGLMULTITEXCOORD2IARBPROC glMultiTexCoord2i; PFNGLMULTITEXCOORD2IVARBPROC glMultiTexCoord2iv; PFNGLMULTITEXCOORD2SARBPROC glMultiTexCoord2s; PFNGLMULTITEXCOORD2SVARBPROC glMultiTexCoord2sv; PFNGLMULTITEXCOORD3DARBPROC glMultiTexCoord3d; PFNGLMULTITEXCOORD3DVARBPROC glMultiTexCoord3dv; PFNGLMULTITEXCOORD3FARBPROC glMultiTexCoord3f; PFNGLMULTITEXCOORD3FVARBPROC glMultiTexCoord3fv; PFNGLMULTITEXCOORD3IARBPROC glMultiTexCoord3i; PFNGLMULTITEXCOORD3IVARBPROC glMultiTexCoord3iv; PFNGLMULTITEXCOORD3SARBPROC glMultiTexCoord3s; PFNGLMULTITEXCOORD3SVARBPROC glMultiTexCoord3sv; PFNGLMULTITEXCOORD4DARBPROC glMultiTexCoord4d; PFNGLMULTITEXCOORD4DVARBPROC glMultiTexCoord4dv; PFNGLMULTITEXCOORD4FARBPROC glMultiTexCoord4f; PFNGLMULTITEXCOORD4FVARBPROC glMultiTexCoord4fv; PFNGLMULTITEXCOORD4IARBPROC glMultiTexCoord4i; PFNGLMULTITEXCOORD4IVARBPROC glMultiTexCoord4iv; PFNGLMULTITEXCOORD4SARBPROC glMultiTexCoord4s; PFNGLMULTITEXCOORD4SVARBPROC glMultiTexCoord4sv; PFNGLSAMPLECOVERAGEARBPROC 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 PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback; PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl; PFNGLDEBUGMESSAGEINSERTPROC glDebugMessageInsert; PFNGLGETDEBUGMESSAGELOGPROC glGetDebugMessageLog; PFNGLGETOBJECTLABELPROC glGetObjectLabel; PFNGLGETOBJECTPTRLABELPROC glGetObjectPtrLabel; PFNGLOBJECTLABELPROC glObjectLabel; PFNGLOBJECTPTRLABELPROC glObjectPtrLabel; PFNGLPOPDEBUGGROUPPROC glPopDebugGroup; PFNGLPUSHDEBUGGROUPPROC glPushDebugGroup; // ARB_buffer_storage PFNGLBUFFERSTORAGEPROC glBufferStorage; PFNGLNAMEDBUFFERSTORAGEEXTPROC glNamedBufferStorageEXT; namespace GLExtensions { // Private members and functions bool _isES3; bool _isES; u32 _GLVersion; std::unordered_map _extensionlist; // Forward declared init functions bool init_gl_1_1(); 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(); bool init_arb_buffer_storage(); // Initializes the extension list the old way void InitExtensionList21() { const char* extensions = (const char*)glGetString(GL_EXTENSIONS); std::string tmp(extensions); std::istringstream buffer(tmp); while (buffer >> tmp) _extensionlist[tmp] = true; } 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; } else if (!_isES) { // Some OpenGL implementations chose to not expose core extensions as extensions // Let's add them to the list manually depending on which version of OpenGL we have // We need to be slightly careful here // When an extension got merged in to core, the naming may have changed // This has intentional fall through switch (_GLVersion) { default: case 330: { std::string gl330exts[] = { "GL_ARB_shader_bit_encoding", "GL_ARB_blend_func_extended", "GL_ARB_explicit_attrib_location", "GL_ARB_occlusion_query2", "GL_ARB_sampler_objects", "GL_ARB_texture_swizzle", "GL_ARB_timer_query", "GL_ARB_instanced_arrays", "GL_ARB_texture_rgb10_a2ui", "GL_ARB_vertex_type_2_10_10_10_rev", }; for (auto it : gl330exts) _extensionlist[it] = true; } case 320: { std::string gl320exts[] = { "GL_ARB_geometry_shader4", "GL_ARB_sync", "GL_ARB_vertex_array_bgra", "GL_ARB_draw_elements_base_vertex", "GL_ARB_seamless_cube_map", "GL_ARB_texture_multisample", "GL_ARB_fragment_coord_conventions", "GL_ARB_provoking_vertex", "GL_ARB_depth_clamp", }; for (auto it : gl320exts) _extensionlist[it] = true; } case 310: { // Can't add NV_primitive_restart since function name changed std::string gl310exts[] = { "GL_ARB_draw_instanced", "GL_ARB_copy_buffer", "GL_ARB_texture_buffer_object", "GL_ARB_texture_rectangle", "GL_ARB_uniform_buffer_object", //"GL_NV_primitive_restart", }; for (auto it : gl310exts) _extensionlist[it] = true; } case 300: { // Quite a lot of these had their names changed when merged in to core // Disable the ones that have std::string gl300exts[] = { "GL_ARB_map_buffer_range", //"GL_EXT_gpu_shader4", //"GL_APPLE_flush_buffer_range", "GL_ARB_color_buffer_float", //"GL_NV_depth_buffer_float", "GL_ARB_texture_float", //"GL_EXT_packed_float", //"GL_EXT_texture_shared_exponent", "GL_ARB_half_float_pixel", //"GL_NV_half_float", "GL_ARB_framebuffer_object", //"GL_EXT_framebuffer_sRGB", "GL_ARB_texture_float", //"GL_EXT_texture_integer", //"GL_EXT_draw_buffers2", //"GL_EXT_texture_integer", //"GL_EXT_texture_array", //"GL_EXT_texture_compression_rgtc", //"GL_EXT_transform_feedback", "GL_ARB_vertex_array_object", //"GL_NV_conditional_render", }; for (auto it : gl300exts) _extensionlist[it] = true; } case 210: case 200: case 150: case 140: case 130: case 121: case 120: case 110: case 100: break; } } if (_GLVersion < 300) { InitExtensionList21(); return; } 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); if (glGetError() == GL_NO_ERROR) _GLVersion = major * 100 + minor * 10; else _GLVersion = 210; if (_isES3) _GLVersion = 330; // Get all the fun things } void* GetFuncAddress(std::string name, void **func) { *func = GLInterface->GetFuncAddress(name); if (*func == NULL) { #if defined(__linux__) || defined(__APPLE__) // Give it a second try with dlsym *func = dlsym(RTLD_NEXT, name.c_str()); #endif if (*func == NULL && _isES) *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; } void Disable(std::string names) { std::string tmp; std::istringstream buffer(names); while (buffer >> tmp) _extensionlist[tmp] = false; } // Public members u32 Version() { return _GLVersion; } bool Supports(std::string name) { return _extensionlist.find(name) != _extensionlist.end(); } bool Init() { bool success = true; _isES3 = GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGLES3; _isES = GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGLES3 || GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGLES2; // Grab a few functions for initial checking // We need them to grab the extension list // Also to check if there is an error grabbing the version // If it fails then the user's drivers don't support GL 3.0 if (GetFuncAddress ("glGetIntegerv", (void**)&glGetIntegerv) == NULL) return false; if (GetFuncAddress("glGetString", (void**)&glGetString) == NULL) return false; if (GetFuncAddress("glGetStringi", (void**)&glGetStringi) == NULL) return false; if (GetFuncAddress("glGetError", (void**)&glGetError) == NULL) return false; InitVersion(); InitExtensionList(); if (success && !init_gl_1_1()) success = false; 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) { if (!init_arb_uniform_buffer_object()) Disable("GL_ARB_uniform_buffer_object"); if (!init_arb_sampler_objects()) Disable("GL_ARB_sampler_objects"); if (!init_arb_map_buffer_range()) Disable("GL_ARB_map_buffer_range"); if (!init_arb_vertex_array_object()) Disable("GL_ARB_vertex_array_object GL_APPLE_vertex_array_object"); if (!init_arb_framebuffer_object()) Disable("GL_ARB_framebuffer_object"); if (!init_arb_get_program_binary()) Disable("GL_ARB_get_program_binary"); if (!init_arb_sync()) Disable("GL_ARB_sync"); if (!init_arb_es2_compatibility()) Disable("GL_ARB_ES2_compatibility"); if (!init_nv_primitive_restart()) Disable("GL_NV_primitive_restart"); if (!init_arb_blend_func_extended()) Disable("GL_ARB_blend_func_extended"); if (!init_arb_viewport_array()) Disable("GL_ARB_viewport_array"); if (!init_arb_draw_elements_base_vertex()) Disable("GL_ARB_draw_elements_base_vertex"); if (!init_arb_sample_shading()) Disable("GL_ARB_sample_shading"); if (!init_arb_debug_output()) Disable("GL_ARB_debug_output"); if (!init_nv_framebuffer_multisample_coverage()) Disable("GL_NV_framebuffer_multisample_coverage"); if (!init_khr_debug()) Disable("GL_KHR_debug"); if (!init_arb_buffer_storage()) Disable("GL_ARB_buffer_storage"); } return success; } // Private initialization functions // These defines are slightly evil and used in all of the init_* functions // Pass the function name in, it'll use it as both the string to grab, and the function pointer name // Suffix edition adds a string suffix to the end of the function string as well // Upon loading the function pointer, it checks if it is NULL so we can do a simple conditional to see if it is loaded // eg if (GrabFunction(glGetStringi)) return true; #define GrabFunction(x) \ (!!GetFuncAddress(#x, (void**)&x)) #define GrabFunctionSuffix(x, y) \ (!!GetFuncAddress(#x #y, (void**)&x)) bool init_gl_1_1() { return GrabFunction(glClearIndex) & GrabFunction(glClearColor) & GrabFunction(glClear) & GrabFunction(glIndexMask) & GrabFunction(glColorMask) & GrabFunction(glAlphaFunc) & GrabFunction(glBlendFunc) & GrabFunction(glLogicOp) & GrabFunction(glCullFace) & GrabFunction(glFrontFace) & GrabFunction(glPointSize) & GrabFunction(glLineWidth) & GrabFunction(glLineStipple) & GrabFunction(glPolygonMode) & GrabFunction(glPolygonOffset) & GrabFunction(glPolygonStipple) & GrabFunction(glGetPolygonStipple) & GrabFunction(glEdgeFlag) & GrabFunction(glEdgeFlagv) & GrabFunction(glScissor) & GrabFunction(glClipPlane) & GrabFunction(glGetClipPlane) & GrabFunction(glDrawBuffer) & GrabFunction(glReadBuffer) & GrabFunction(glEnable) & GrabFunction(glDisable) & GrabFunction(glIsEnabled) & GrabFunction(glEnableClientState) & GrabFunction(glDisableClientState) & GrabFunction(glGetBooleanv) & GrabFunction(glGetDoublev) & GrabFunction(glGetFloatv) & GrabFunction(glPushAttrib) & GrabFunction(glPopAttrib) & GrabFunction(glPushClientAttrib) & GrabFunction(glPopClientAttrib) & GrabFunction(glRenderMode) & GrabFunction(glFinish) & GrabFunction(glFlush) & GrabFunction(glHint) & GrabFunction(glClearDepth) & GrabFunction(glDepthFunc) & GrabFunction(glDepthMask) & GrabFunction(glDepthRange) & GrabFunction(glClearAccum) & GrabFunction(glAccum) & GrabFunction(glMatrixMode) & GrabFunction(glOrtho) & GrabFunction(glFrustum) & GrabFunction(glViewport) & GrabFunction(glPushMatrix) & GrabFunction(glPopMatrix) & GrabFunction(glLoadIdentity) & GrabFunction(glLoadMatrixd) & GrabFunction(glLoadMatrixf) & GrabFunction(glMultMatrixd) & GrabFunction(glMultMatrixf) & GrabFunction(glRotated) & GrabFunction(glRotatef) & GrabFunction(glScaled) & GrabFunction(glScalef) & GrabFunction(glTranslated) & GrabFunction(glTranslatef) & GrabFunction(glIsList) & GrabFunction(glDeleteLists) & GrabFunction(glGenLists) & GrabFunction(glNewList) & GrabFunction(glEndList) & GrabFunction(glCallList) & GrabFunction(glCallLists) & GrabFunction(glListBase) & GrabFunction(glBegin) & GrabFunction(glEnd) & GrabFunction(glVertex2d) & GrabFunction(glVertex2f) & GrabFunction(glVertex2i) & GrabFunction(glVertex2s) & GrabFunction(glVertex3d) & GrabFunction(glVertex3f) & GrabFunction(glVertex3i) & GrabFunction(glVertex3s) & GrabFunction(glVertex4d) & GrabFunction(glVertex4f) & GrabFunction(glVertex4i) & GrabFunction(glVertex4s) & GrabFunction(glVertex2dv) & GrabFunction(glVertex2fv) & GrabFunction(glVertex2iv) & GrabFunction(glVertex2sv) & GrabFunction(glVertex3dv) & GrabFunction(glVertex3fv) & GrabFunction(glVertex3iv) & GrabFunction(glVertex3sv) & GrabFunction(glVertex4dv) & GrabFunction(glVertex4fv) & GrabFunction(glVertex4iv) & GrabFunction(glVertex4sv) & GrabFunction(glNormal3b) & GrabFunction(glNormal3d) & GrabFunction(glNormal3f) & GrabFunction(glNormal3i) & GrabFunction(glNormal3s) & GrabFunction(glNormal3bv) & GrabFunction(glNormal3dv) & GrabFunction(glNormal3fv) & GrabFunction(glNormal3iv) & GrabFunction(glNormal3sv) & GrabFunction(glIndexd) & GrabFunction(glIndexf) & GrabFunction(glIndexi) & GrabFunction(glIndexs) & GrabFunction(glIndexub) & GrabFunction(glIndexdv) & GrabFunction(glIndexfv) & GrabFunction(glIndexiv) & GrabFunction(glIndexsv) & GrabFunction(glIndexubv) & GrabFunction(glColor3b) & GrabFunction(glColor3d) & GrabFunction(glColor3f) & GrabFunction(glColor3i) & GrabFunction(glColor3s) & GrabFunction(glColor3ub) & GrabFunction(glColor3ui) & GrabFunction(glColor3us) & GrabFunction(glColor4b) & GrabFunction(glColor4d) & GrabFunction(glColor4f) & GrabFunction(glColor4i) & GrabFunction(glColor4s) & GrabFunction(glColor4ub) & GrabFunction(glColor4ui) & GrabFunction(glColor4us) & GrabFunction(glColor3bv) & GrabFunction(glColor3dv) & GrabFunction(glColor3fv) & GrabFunction(glColor3iv) & GrabFunction(glColor3sv) & GrabFunction(glColor3ubv) & GrabFunction(glColor3uiv) & GrabFunction(glColor3usv) & GrabFunction(glColor4bv) & GrabFunction(glColor4dv) & GrabFunction(glColor4fv) & GrabFunction(glColor4iv) & GrabFunction(glColor4sv) & GrabFunction(glColor4ubv) & GrabFunction(glColor4uiv) & GrabFunction(glColor4usv) & GrabFunction(glTexCoord1d) & GrabFunction(glTexCoord1f) & GrabFunction(glTexCoord1i) & GrabFunction(glTexCoord1s) & GrabFunction(glTexCoord2d) & GrabFunction(glTexCoord2f) & GrabFunction(glTexCoord2i) & GrabFunction(glTexCoord2s) & GrabFunction(glTexCoord3d) & GrabFunction(glTexCoord3f) & GrabFunction(glTexCoord3i) & GrabFunction(glTexCoord3s) & GrabFunction(glTexCoord4d) & GrabFunction(glTexCoord4f) & GrabFunction(glTexCoord4i) & GrabFunction(glTexCoord4s) & GrabFunction(glTexCoord1dv) & GrabFunction(glTexCoord1fv) & GrabFunction(glTexCoord1iv) & GrabFunction(glTexCoord1sv) & GrabFunction(glTexCoord2dv) & GrabFunction(glTexCoord2fv) & GrabFunction(glTexCoord2iv) & GrabFunction(glTexCoord2sv) & GrabFunction(glTexCoord3dv) & GrabFunction(glTexCoord3fv) & GrabFunction(glTexCoord3iv) & GrabFunction(glTexCoord3sv) & GrabFunction(glTexCoord4dv) & GrabFunction(glTexCoord4fv) & GrabFunction(glTexCoord4iv) & GrabFunction(glTexCoord4sv) & GrabFunction(glRasterPos2d) & GrabFunction(glRasterPos2f) & GrabFunction(glRasterPos2i) & GrabFunction(glRasterPos2s) & GrabFunction(glRasterPos3d) & GrabFunction(glRasterPos3f) & GrabFunction(glRasterPos3i) & GrabFunction(glRasterPos3s) & GrabFunction(glRasterPos4d) & GrabFunction(glRasterPos4f) & GrabFunction(glRasterPos4i) & GrabFunction(glRasterPos4s) & GrabFunction(glRasterPos2dv) & GrabFunction(glRasterPos2fv) & GrabFunction(glRasterPos2iv) & GrabFunction(glRasterPos2sv) & GrabFunction(glRasterPos3dv) & GrabFunction(glRasterPos3fv) & GrabFunction(glRasterPos3iv) & GrabFunction(glRasterPos3sv) & GrabFunction(glRasterPos4dv) & GrabFunction(glRasterPos4fv) & GrabFunction(glRasterPos4iv) & GrabFunction(glRasterPos4sv) & GrabFunction(glRectd) & GrabFunction(glRectf) & GrabFunction(glRecti) & GrabFunction(glRects) & GrabFunction(glRectdv) & GrabFunction(glRectfv) & GrabFunction(glRectiv) & GrabFunction(glRectsv) & GrabFunction(glVertexPointer) & GrabFunction(glNormalPointer) & GrabFunction(glColorPointer) & GrabFunction(glIndexPointer) & GrabFunction(glTexCoordPointer) & GrabFunction(glEdgeFlagPointer) & GrabFunction(glGetPointerv) & GrabFunction(glArrayElement) & GrabFunction(glDrawArrays) & GrabFunction(glDrawElements) & GrabFunction(glInterleavedArrays) & GrabFunction(glShadeModel) & GrabFunction(glLightf) & GrabFunction(glLighti) & GrabFunction(glLightfv) & GrabFunction(glLightiv) & GrabFunction(glGetLightfv) & GrabFunction(glGetLightiv) & GrabFunction(glLightModelf) & GrabFunction(glLightModeli) & GrabFunction(glLightModelfv) & GrabFunction(glLightModeliv) & GrabFunction(glMaterialf) & GrabFunction(glMateriali) & GrabFunction(glMaterialfv) & GrabFunction(glMaterialiv) & GrabFunction(glGetMaterialfv) & GrabFunction(glGetMaterialiv) & GrabFunction(glColorMaterial) & GrabFunction(glPixelZoom) & GrabFunction(glPixelStoref) & GrabFunction(glPixelStorei) & GrabFunction(glPixelTransferf) & GrabFunction(glPixelTransferi) & GrabFunction(glPixelMapfv) & GrabFunction(glPixelMapuiv) & GrabFunction(glPixelMapusv) & GrabFunction(glGetPixelMapfv) & GrabFunction(glGetPixelMapuiv) & GrabFunction(glGetPixelMapusv) & GrabFunction(glBitmap) & GrabFunction(glReadPixels) & GrabFunction(glDrawPixels) & GrabFunction(glCopyPixels) & GrabFunction(glStencilFunc) & GrabFunction(glStencilMask) & GrabFunction(glStencilOp) & GrabFunction(glClearStencil) & GrabFunction(glTexGend) & GrabFunction(glTexGenf) & GrabFunction(glTexGeni) & GrabFunction(glTexGendv) & GrabFunction(glTexGenfv) & GrabFunction(glTexGeniv) & GrabFunction(glGetTexGendv) & GrabFunction(glGetTexGenfv) & GrabFunction(glGetTexGeniv) & GrabFunction(glTexEnvf) & GrabFunction(glTexEnvi) & GrabFunction(glTexEnvfv) & GrabFunction(glTexEnviv) & GrabFunction(glGetTexEnvfv) & GrabFunction(glGetTexEnviv) & GrabFunction(glTexParameterf) & GrabFunction(glTexParameteri) & GrabFunction(glTexParameterfv) & GrabFunction(glTexParameteriv) & GrabFunction(glGetTexParameterfv) & GrabFunction(glGetTexParameteriv) & GrabFunction(glGetTexLevelParameterfv) & GrabFunction(glGetTexLevelParameteriv) & GrabFunction(glTexImage1D) & GrabFunction(glTexImage2D) & GrabFunction(glGetTexImage) & GrabFunction(glGenTextures) & GrabFunction(glDeleteTextures) & GrabFunction(glBindTexture) & GrabFunction(glPrioritizeTextures) & GrabFunction(glAreTexturesResident) & GrabFunction(glIsTexture) & GrabFunction(glTexSubImage1D) & GrabFunction(glTexSubImage2D) & GrabFunction(glCopyTexImage1D) & GrabFunction(glCopyTexImage2D) & GrabFunction(glCopyTexSubImage1D) & GrabFunction(glCopyTexSubImage2D) & GrabFunction(glMap1d) & GrabFunction(glMap1f) & GrabFunction(glMap2d) & GrabFunction(glMap2f) & GrabFunction(glGetMapdv) & GrabFunction(glGetMapfv) & GrabFunction(glGetMapiv) & GrabFunction(glEvalCoord1d) & GrabFunction(glEvalCoord1f) & GrabFunction(glEvalCoord1dv) & GrabFunction(glEvalCoord1fv) & GrabFunction(glEvalCoord2d) & GrabFunction(glEvalCoord2f) & GrabFunction(glEvalCoord2dv) & GrabFunction(glEvalCoord2fv) & GrabFunction(glMapGrid1d) & GrabFunction(glMapGrid1f) & GrabFunction(glMapGrid2d) & GrabFunction(glMapGrid2f) & GrabFunction(glEvalPoint1) & GrabFunction(glEvalPoint2) & GrabFunction(glEvalMesh1) & GrabFunction(glEvalMesh2) & GrabFunction(glFogf) & GrabFunction(glFogi) & GrabFunction(glFogfv) & GrabFunction(glFogiv) & GrabFunction(glFeedbackBuffer) & GrabFunction(glPassThrough) & GrabFunction(glSelectBuffer) & GrabFunction(glInitNames) & GrabFunction(glLoadName) & GrabFunction(glPushName) & GrabFunction(glPopName); } bool init_gl_1_2() { return GrabFunction(glCopyTexSubImage3D) & GrabFunction(glDrawRangeElements) & GrabFunction(glTexImage3D) & GrabFunction(glTexSubImage3D); } bool init_gl_1_3() { return 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); } bool init_gl_1_4() { return 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); } bool init_gl_1_5() { return 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); } bool init_gl_2_0() { return 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); } bool init_gl_3_0() { if (Version() < 300) return true; return 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); } bool init_gl_3_1() { if (Version() < 310) return true; return GrabFunction(glDrawArraysInstanced) & GrabFunction(glDrawElementsInstanced) & GrabFunction(glPrimitiveRestartIndex) & GrabFunction(glTexBuffer); } bool init_gl_3_2() { if (Version() < 320) return true; return GrabFunction(glFramebufferTexture) & GrabFunction(glGetBufferParameteri64v) & GrabFunction(glGetInteger64i_v); } bool init_arb_uniform_buffer_object() { if (!Supports("GL_ARB_uniform_buffer_object")) return true; return GrabFunction(glBindBufferBase) & GrabFunction(glBindBufferRange) & GrabFunction(glGetActiveUniformBlockName) & GrabFunction(glGetActiveUniformBlockiv) & GrabFunction(glGetActiveUniformName) & GrabFunction(glGetActiveUniformsiv) & GrabFunction(glGetIntegeri_v) & GrabFunction(glGetUniformBlockIndex) & GrabFunction(glGetUniformIndices) & GrabFunction(glUniformBlockBinding); } bool init_arb_sampler_objects() { if (!Supports("GL_ARB_sampler_objects")) return true; return 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); } bool init_arb_map_buffer_range() { if (!Supports("GL_ARB_map_buffer_range")) return true; return GrabFunction(glFlushMappedBufferRange) & GrabFunction(glMapBufferRange); } 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")) { return GrabFunction(glBindVertexArray) & GrabFunction(glDeleteVertexArrays) & GrabFunction(glGenVertexArrays) & GrabFunction(glIsVertexArray); } else if (Supports("GL_APPLE_vertex_array_object")) { return GrabFunctionSuffix(glBindVertexArray, APPLE) & GrabFunctionSuffix(glDeleteVertexArrays, APPLE) & GrabFunctionSuffix(glGenVertexArrays, APPLE) & GrabFunctionSuffix(glIsVertexArray, APPLE); } return true; // Quell compiler warning. Won't ever be reached } bool init_arb_framebuffer_object() { if (!Supports("GL_ARB_framebuffer_object")) return true; return 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); } bool init_arb_get_program_binary() { if (!Supports("GL_ARB_get_program_binary")) return true; return GrabFunction(glGetProgramBinary) & GrabFunction(glProgramBinary) & GrabFunction(glProgramParameteri); } bool init_arb_sync() { if (!(Supports("GL_ARB_sync") || Version() >= 320)) return true; return GrabFunction(glClientWaitSync) & GrabFunction(glDeleteSync) & GrabFunction(glFenceSync) & GrabFunction(glGetInteger64v) & GrabFunction(glGetSynciv) & GrabFunction(glIsSync) & GrabFunction(glWaitSync); } bool init_arb_es2_compatibility() { if (!Supports("GL_ARB_ES2_compatibility")) return true; return GrabFunction(glClearDepthf) & GrabFunction(glDepthRangef) & GrabFunction(glGetShaderPrecisionFormat) & GrabFunction(glReleaseShaderCompiler) & GrabFunction(glShaderBinary); } bool init_nv_primitive_restart() { if (!Supports("GL_NV_primitive_restart")) return true; return GrabFunction(glPrimitiveRestartIndexNV) & GrabFunction(glPrimitiveRestartNV); } bool init_arb_blend_func_extended() { if (!Supports("GL_ARB_blend_func_extended")) return true; return GrabFunction(glBindFragDataLocationIndexed) & GrabFunction(glGetFragDataIndex); } bool init_arb_viewport_array() { if (!Supports("GL_ARB_viewport_array")) return true; return GrabFunction(glDepthRangeArrayv) & GrabFunction(glDepthRangeIndexed) & GrabFunction(glGetDoublei_v) & GrabFunction(glGetFloati_v) & GrabFunction(glScissorArrayv) & GrabFunction(glScissorIndexed) & GrabFunction(glScissorIndexedv) & GrabFunction(glViewportArrayv) & GrabFunction(glViewportIndexedf) & GrabFunction(glViewportIndexedfv); } bool init_arb_draw_elements_base_vertex() { if (!Supports("GL_ARB_draw_elements_base_vertex")) return true; return GrabFunction(glDrawElementsBaseVertex) & GrabFunction(glDrawElementsInstancedBaseVertex) & GrabFunction(glDrawRangeElementsBaseVertex) & GrabFunction(glMultiDrawElementsBaseVertex); } bool init_nv_framebuffer_multisample_coverage() { if (!Supports("GL_NV_framebuffer_multisample_coverage")) return true; return GrabFunction(glRenderbufferStorageMultisampleCoverageNV); } bool init_arb_sample_shading() { if (!Supports("GL_ARB_sample_shading")) return true; return GrabFunction(glMinSampleShadingARB); } bool init_arb_debug_output() { if (!Supports("GL_ARB_debug_output")) return true; return GrabFunction(glDebugMessageCallbackARB) & GrabFunction(glDebugMessageControlARB) & GrabFunction(glDebugMessageInsertARB) & GrabFunction(glGetDebugMessageLogARB); } bool init_khr_debug() { if (!Supports("GL_KHR_debug")) return true; if (_isES3) return GrabFunctionSuffix(glDebugMessageCallback, KHR) & GrabFunctionSuffix(glDebugMessageControl, KHR) & GrabFunctionSuffix(glDebugMessageInsert, KHR) & GrabFunctionSuffix(glGetDebugMessageLog, KHR) & GrabFunctionSuffix(glGetObjectLabel, KHR) & GrabFunctionSuffix(glGetObjectPtrLabel, KHR) & GrabFunctionSuffix(glObjectLabel, KHR) & GrabFunctionSuffix(glObjectPtrLabel, KHR) & GrabFunctionSuffix(glPopDebugGroup, KHR) & GrabFunctionSuffix(glPushDebugGroup, KHR); else return GrabFunction(glDebugMessageCallback) & GrabFunction(glDebugMessageControl) & GrabFunction(glDebugMessageInsert) & GrabFunction(glGetDebugMessageLog) & GrabFunction(glGetObjectLabel) & GrabFunction(glGetObjectPtrLabel) & GrabFunction(glObjectLabel) & GrabFunction(glObjectPtrLabel) & GrabFunction(glPopDebugGroup) & GrabFunction(glPushDebugGroup); } bool init_arb_buffer_storage() { if (!Supports("GL_ARB_buffer_storage")) return true; bool res = GrabFunction(glBufferStorage); if (Supports("GL_EXT_direct_state_access")) res &= GrabFunction(glNamedBufferStorageEXT); return res; } }