Commit f919b866 by Krzysztof Kosiński

Implement EGL_KHR_get_all_proc_addresses.

This also improves GetProcAddress performance by using binary search instead of linear search. Fixes bug b/20110899 Change-Id: I6c58e17f0580904338e4d806e310cccbec398f28 Reviewed-on: https://swiftshader-review.googlesource.com/15748Tested-by: 's avatarKrzysztof Kosiński <krzysio@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 423377e7
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include "Main/libX11.hpp" #include "Main/libX11.hpp"
#endif #endif
#include <algorithm>
#include <string.h> #include <string.h>
using namespace egl; using namespace egl;
...@@ -174,6 +175,7 @@ const char *QueryString(EGLDisplay dpy, EGLint name) ...@@ -174,6 +175,7 @@ const char *QueryString(EGLDisplay dpy, EGLint name)
if(dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS) if(dpy == EGL_NO_DISPLAY && name == EGL_EXTENSIONS)
{ {
return success( return success(
"EGL_KHR_client_get_all_proc_addresses "
#if defined(__linux__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
"EGL_KHR_platform_gbm " "EGL_KHR_platform_gbm "
"EGL_KHR_platform_x11 " "EGL_KHR_platform_x11 "
...@@ -195,6 +197,7 @@ const char *QueryString(EGLDisplay dpy, EGLint name) ...@@ -195,6 +197,7 @@ const char *QueryString(EGLDisplay dpy, EGLint name)
return success("OpenGL_ES"); return success("OpenGL_ES");
case EGL_EXTENSIONS: case EGL_EXTENSIONS:
return success("EGL_KHR_create_context " return success("EGL_KHR_create_context "
"EGL_KHR_get_all_proc_addresses "
"EGL_KHR_gl_texture_2D_image " "EGL_KHR_gl_texture_2D_image "
"EGL_KHR_gl_texture_cubemap_image " "EGL_KHR_gl_texture_cubemap_image "
"EGL_KHR_gl_renderbuffer_image " "EGL_KHR_gl_renderbuffer_image "
...@@ -1241,34 +1244,85 @@ __eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname) ...@@ -1241,34 +1244,85 @@ __eglMustCastToProperFunctionPointerType GetProcAddress(const char *procname)
{ {
TRACE("(const char *procname = \"%s\")", procname); TRACE("(const char *procname = \"%s\")", procname);
struct Extension struct Function
{ {
const char *name; const char *name;
__eglMustCastToProperFunctionPointerType address; __eglMustCastToProperFunctionPointerType address;
}; };
static const Extension eglExtensions[] = struct CompareFunctor
{ {
#define EXTENSION(name) {#name, (__eglMustCastToProperFunctionPointerType)name} bool operator()(const Function &a, const Function &b) const
{
EXTENSION(eglCreateImageKHR), return strcmp(a.name, b.name) < 0;
EXTENSION(eglDestroyImageKHR), }
EXTENSION(eglGetPlatformDisplayEXT), };
EXTENSION(eglCreatePlatformWindowSurfaceEXT),
EXTENSION(eglCreatePlatformPixmapSurfaceEXT),
EXTENSION(eglCreateSyncKHR),
EXTENSION(eglDestroySyncKHR),
EXTENSION(eglClientWaitSyncKHR),
EXTENSION(eglGetSyncAttribKHR),
#undef EXTENSION // This array must be kept sorted with respect to strcmp(), so that binary search works correctly.
// The Unix command "LC_COLLATE=C sort" will generate the correct order.
static const Function eglFunctions[] =
{
#define FUNCTION(name) {#name, (__eglMustCastToProperFunctionPointerType)name}
FUNCTION(eglBindAPI),
FUNCTION(eglBindTexImage),
FUNCTION(eglChooseConfig),
FUNCTION(eglClientWaitSyncKHR),
FUNCTION(eglCopyBuffers),
FUNCTION(eglCreateContext),
FUNCTION(eglCreateImageKHR),
FUNCTION(eglCreatePbufferFromClientBuffer),
FUNCTION(eglCreatePbufferSurface),
FUNCTION(eglCreatePixmapSurface),
FUNCTION(eglCreatePlatformPixmapSurfaceEXT),
FUNCTION(eglCreatePlatformWindowSurfaceEXT),
FUNCTION(eglCreateSyncKHR),
FUNCTION(eglCreateWindowSurface),
FUNCTION(eglDestroyContext),
FUNCTION(eglDestroyImageKHR),
FUNCTION(eglDestroySurface),
FUNCTION(eglDestroySyncKHR),
FUNCTION(eglGetConfigAttrib),
FUNCTION(eglGetConfigs),
FUNCTION(eglGetCurrentContext),
FUNCTION(eglGetCurrentDisplay),
FUNCTION(eglGetCurrentSurface),
FUNCTION(eglGetDisplay),
FUNCTION(eglGetError),
FUNCTION(eglGetPlatformDisplayEXT),
FUNCTION(eglGetProcAddress),
FUNCTION(eglGetSyncAttribKHR),
FUNCTION(eglInitialize),
FUNCTION(eglMakeCurrent),
FUNCTION(eglQueryAPI),
FUNCTION(eglQueryContext),
FUNCTION(eglQueryString),
FUNCTION(eglQuerySurface),
FUNCTION(eglReleaseTexImage),
FUNCTION(eglReleaseThread),
FUNCTION(eglSurfaceAttrib),
FUNCTION(eglSwapBuffers),
FUNCTION(eglSwapInterval),
FUNCTION(eglTerminate),
FUNCTION(eglWaitClient),
FUNCTION(eglWaitGL),
FUNCTION(eglWaitNative),
#undef FUNCTION
}; };
for(unsigned int ext = 0; ext < sizeof(eglExtensions) / sizeof(Extension); ext++) static const size_t numFunctions = sizeof eglFunctions / sizeof(Function);
static const Function *const eglFunctionsEnd = eglFunctions + numFunctions;
Function needle;
needle.name = procname;
if(procname && strncmp("egl", procname, 3) == 0)
{ {
if(strcmp(procname, eglExtensions[ext].name) == 0) const Function *result = std::lower_bound(eglFunctions, eglFunctionsEnd, needle, CompareFunctor());
if (result != eglFunctionsEnd && strcmp(procname, result->name) == 0)
{ {
return success((__eglMustCastToProperFunctionPointerType)eglExtensions[ext].address); return success((__eglMustCastToProperFunctionPointerType)result->address);
} }
} }
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include <GLES/gl.h> #include <GLES/gl.h>
#include <GLES/glext.h> #include <GLES/glext.h>
#include <algorithm>
#include <limits> #include <limits>
namespace es1 namespace es1
...@@ -4727,46 +4728,215 @@ void DrawTexfvOES(const GLfloat *coords) ...@@ -4727,46 +4728,215 @@ void DrawTexfvOES(const GLfloat *coords)
extern "C" __eglMustCastToProperFunctionPointerType es1GetProcAddress(const char *procname) extern "C" __eglMustCastToProperFunctionPointerType es1GetProcAddress(const char *procname)
{ {
struct Extension struct Function
{ {
const char *name; const char *name;
__eglMustCastToProperFunctionPointerType address; __eglMustCastToProperFunctionPointerType address;
}; };
static const Extension glExtensions[] = struct CompareFunctor
{ {
#define EXTENSION(name) {#name, (__eglMustCastToProperFunctionPointerType)name} bool operator()(const Function &a, const Function &b) const
{
EXTENSION(glEGLImageTargetTexture2DOES), return strcmp(a.name, b.name) < 0;
EXTENSION(glEGLImageTargetRenderbufferStorageOES), }
EXTENSION(glIsRenderbufferOES),
EXTENSION(glBindRenderbufferOES),
EXTENSION(glDeleteRenderbuffersOES),
EXTENSION(glGenRenderbuffersOES),
EXTENSION(glRenderbufferStorageOES),
EXTENSION(glGetRenderbufferParameterivOES),
EXTENSION(glIsFramebufferOES),
EXTENSION(glBindFramebufferOES),
EXTENSION(glDeleteFramebuffersOES),
EXTENSION(glGenFramebuffersOES),
EXTENSION(glCheckFramebufferStatusOES),
EXTENSION(glFramebufferRenderbufferOES),
EXTENSION(glFramebufferTexture2DOES),
EXTENSION(glGetFramebufferAttachmentParameterivOES),
EXTENSION(glGenerateMipmapOES),
EXTENSION(glBlendEquationOES),
EXTENSION(glBlendEquationSeparateOES),
EXTENSION(glBlendFuncSeparateOES),
EXTENSION(glPointSizePointerOES),
#undef EXTENSION
}; };
for(unsigned int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++) // This array must be kept sorted with respect to strcmp(), so that binary search works correctly.
// The Unix command "LC_COLLATE=C sort" will generate the correct order.
static const Function glFunctions[] =
{
#define FUNCTION(name) {#name, (__eglMustCastToProperFunctionPointerType)name}
FUNCTION(glActiveTexture),
FUNCTION(glAlphaFunc),
FUNCTION(glAlphaFuncx),
FUNCTION(glBindBuffer),
FUNCTION(glBindFramebufferOES),
FUNCTION(glBindRenderbufferOES),
FUNCTION(glBindTexture),
FUNCTION(glBlendEquationOES),
FUNCTION(glBlendEquationSeparateOES),
FUNCTION(glBlendFunc),
FUNCTION(glBlendFuncSeparateOES),
FUNCTION(glBufferData),
FUNCTION(glBufferSubData),
FUNCTION(glCheckFramebufferStatusOES),
FUNCTION(glClear),
FUNCTION(glClearColor),
FUNCTION(glClearColorx),
FUNCTION(glClearDepthf),
FUNCTION(glClearDepthx),
FUNCTION(glClearStencil),
FUNCTION(glClientActiveTexture),
FUNCTION(glClipPlanef),
FUNCTION(glClipPlanex),
FUNCTION(glColor4f),
FUNCTION(glColor4ub),
FUNCTION(glColor4x),
FUNCTION(glColorMask),
FUNCTION(glColorPointer),
FUNCTION(glCompressedTexImage2D),
FUNCTION(glCompressedTexSubImage2D),
FUNCTION(glCopyTexImage2D),
FUNCTION(glCopyTexSubImage2D),
FUNCTION(glCullFace),
FUNCTION(glDeleteBuffers),
FUNCTION(glDeleteFramebuffersOES),
FUNCTION(glDeleteRenderbuffersOES),
FUNCTION(glDeleteTextures),
FUNCTION(glDepthFunc),
FUNCTION(glDepthMask),
FUNCTION(glDepthRangef),
FUNCTION(glDepthRangex),
FUNCTION(glDisable),
FUNCTION(glDisableClientState),
FUNCTION(glDrawArrays),
FUNCTION(glDrawElements),
FUNCTION(glDrawTexfOES),
FUNCTION(glDrawTexfvOES),
FUNCTION(glDrawTexiOES),
FUNCTION(glDrawTexivOES),
FUNCTION(glDrawTexsOES),
FUNCTION(glDrawTexsvOES),
FUNCTION(glDrawTexxOES),
FUNCTION(glDrawTexxvOES),
FUNCTION(glEGLImageTargetRenderbufferStorageOES),
FUNCTION(glEGLImageTargetTexture2DOES),
FUNCTION(glEnable),
FUNCTION(glEnableClientState),
FUNCTION(glFinish),
FUNCTION(glFlush),
FUNCTION(glFogf),
FUNCTION(glFogfv),
FUNCTION(glFogx),
FUNCTION(glFogxv),
FUNCTION(glFramebufferRenderbufferOES),
FUNCTION(glFramebufferTexture2DOES),
FUNCTION(glFrontFace),
FUNCTION(glFrustumf),
FUNCTION(glFrustumx),
FUNCTION(glGenBuffers),
FUNCTION(glGenFramebuffersOES),
FUNCTION(glGenRenderbuffersOES),
FUNCTION(glGenTextures),
FUNCTION(glGenerateMipmapOES),
FUNCTION(glGetBooleanv),
FUNCTION(glGetBufferParameteriv),
FUNCTION(glGetClipPlanef),
FUNCTION(glGetClipPlanex),
FUNCTION(glGetError),
FUNCTION(glGetFixedv),
FUNCTION(glGetFloatv),
FUNCTION(glGetFramebufferAttachmentParameterivOES),
FUNCTION(glGetIntegerv),
FUNCTION(glGetLightfv),
FUNCTION(glGetLightxv),
FUNCTION(glGetMaterialfv),
FUNCTION(glGetMaterialxv),
FUNCTION(glGetPointerv),
FUNCTION(glGetRenderbufferParameterivOES),
FUNCTION(glGetString),
FUNCTION(glGetTexEnvfv),
FUNCTION(glGetTexEnviv),
FUNCTION(glGetTexEnvxv),
FUNCTION(glGetTexParameterfv),
FUNCTION(glGetTexParameteriv),
FUNCTION(glGetTexParameterxv),
FUNCTION(glHint),
FUNCTION(glIsBuffer),
FUNCTION(glIsEnabled),
FUNCTION(glIsFramebufferOES),
FUNCTION(glIsRenderbufferOES),
FUNCTION(glIsTexture),
FUNCTION(glLightModelf),
FUNCTION(glLightModelfv),
FUNCTION(glLightModelx),
FUNCTION(glLightModelxv),
FUNCTION(glLightf),
FUNCTION(glLightfv),
FUNCTION(glLightx),
FUNCTION(glLightxv),
FUNCTION(glLineWidth),
FUNCTION(glLineWidthx),
FUNCTION(glLoadIdentity),
FUNCTION(glLoadMatrixf),
FUNCTION(glLoadMatrixx),
FUNCTION(glLogicOp),
FUNCTION(glMaterialf),
FUNCTION(glMaterialfv),
FUNCTION(glMaterialx),
FUNCTION(glMaterialxv),
FUNCTION(glMatrixMode),
FUNCTION(glMultMatrixf),
FUNCTION(glMultMatrixx),
FUNCTION(glMultiTexCoord4f),
FUNCTION(glMultiTexCoord4x),
FUNCTION(glNormal3f),
FUNCTION(glNormal3x),
FUNCTION(glNormalPointer),
FUNCTION(glOrthof),
FUNCTION(glOrthox),
FUNCTION(glPixelStorei),
FUNCTION(glPointParameterf),
FUNCTION(glPointParameterfv),
FUNCTION(glPointParameterx),
FUNCTION(glPointParameterxv),
FUNCTION(glPointSize),
FUNCTION(glPointSizePointerOES),
FUNCTION(glPointSizex),
FUNCTION(glPolygonOffset),
FUNCTION(glPolygonOffsetx),
FUNCTION(glPopMatrix),
FUNCTION(glPushMatrix),
FUNCTION(glReadPixels),
FUNCTION(glRenderbufferStorageOES),
FUNCTION(glRotatef),
FUNCTION(glRotatex),
FUNCTION(glSampleCoverage),
FUNCTION(glSampleCoveragex),
FUNCTION(glScalef),
FUNCTION(glScalex),
FUNCTION(glScissor),
FUNCTION(glShadeModel),
FUNCTION(glStencilFunc),
FUNCTION(glStencilMask),
FUNCTION(glStencilOp),
FUNCTION(glTexCoordPointer),
FUNCTION(glTexEnvf),
FUNCTION(glTexEnvfv),
FUNCTION(glTexEnvi),
FUNCTION(glTexEnviv),
FUNCTION(glTexEnvx),
FUNCTION(glTexEnvxv),
FUNCTION(glTexImage2D),
FUNCTION(glTexParameterf),
FUNCTION(glTexParameterfv),
FUNCTION(glTexParameteri),
FUNCTION(glTexParameteriv),
FUNCTION(glTexParameterx),
FUNCTION(glTexParameterxv),
FUNCTION(glTexSubImage2D),
FUNCTION(glTranslatef),
FUNCTION(glTranslatex),
FUNCTION(glVertexPointer),
FUNCTION(glViewport),
#undef FUNCTION
};
static const size_t numFunctions = sizeof glFunctions / sizeof(Function);
static const Function *const glFunctionsEnd = glFunctions + numFunctions;
Function needle;
needle.name = procname;
if(procname && strncmp("gl", procname, 2) == 0)
{ {
if(strcmp(procname, glExtensions[ext].name) == 0) const Function *result = std::lower_bound(glFunctions, glFunctionsEnd, needle, CompareFunctor());
if(result != glFunctionsEnd && strcmp(procname, result->name) == 0)
{ {
return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address; return (__eglMustCastToProperFunctionPointerType)result->address;
} }
} }
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <GLES2/gl2ext.h> #include <GLES2/gl2ext.h>
#include <GLES3/gl3.h> #include <GLES3/gl3.h>
#include <algorithm>
#include <limits> #include <limits>
#ifdef __ANDROID__ #ifdef __ANDROID__
...@@ -6872,71 +6873,327 @@ void DrawBuffersEXT(GLsizei n, const GLenum *bufs) ...@@ -6872,71 +6873,327 @@ void DrawBuffersEXT(GLsizei n, const GLenum *bufs)
extern "C" NO_SANITIZE_FUNCTION __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname) extern "C" NO_SANITIZE_FUNCTION __eglMustCastToProperFunctionPointerType es2GetProcAddress(const char *procname)
{ {
struct Extension struct Function
{ {
const char *name; const char *name;
__eglMustCastToProperFunctionPointerType address; __eglMustCastToProperFunctionPointerType address;
}; };
static const Extension glExtensions[] = struct CompareFunctor
{ {
#define EXTENSION(name) {#name, (__eglMustCastToProperFunctionPointerType)name} bool operator()(const Function &a, const Function &b) const
{
EXTENSION(glTexImage3DOES), return strcmp(a.name, b.name) < 0;
EXTENSION(glBlitFramebufferANGLE), }
EXTENSION(glBlitFramebufferNV),
EXTENSION(glRenderbufferStorageMultisampleANGLE),
EXTENSION(glDeleteFencesNV),
EXTENSION(glGenFencesNV),
EXTENSION(glIsFenceNV),
EXTENSION(glTestFenceNV),
EXTENSION(glGetFenceivNV),
EXTENSION(glFinishFenceNV),
EXTENSION(glSetFenceNV),
EXTENSION(glGetGraphicsResetStatusEXT),
EXTENSION(glReadnPixelsEXT),
EXTENSION(glGetnUniformfvEXT),
EXTENSION(glGetnUniformivEXT),
EXTENSION(glGenQueriesEXT),
EXTENSION(glDeleteQueriesEXT),
EXTENSION(glIsQueryEXT),
EXTENSION(glBeginQueryEXT),
EXTENSION(glEndQueryEXT),
EXTENSION(glGetQueryivEXT),
EXTENSION(glGetQueryObjectuivEXT),
EXTENSION(glEGLImageTargetTexture2DOES),
EXTENSION(glEGLImageTargetRenderbufferStorageOES),
EXTENSION(glDrawElementsInstancedEXT),
EXTENSION(glDrawArraysInstancedEXT),
EXTENSION(glVertexAttribDivisorEXT),
EXTENSION(glDrawArraysInstancedANGLE),
EXTENSION(glDrawElementsInstancedANGLE),
EXTENSION(glVertexAttribDivisorANGLE),
EXTENSION(glIsRenderbufferOES),
EXTENSION(glBindRenderbufferOES),
EXTENSION(glDeleteRenderbuffersOES),
EXTENSION(glGenRenderbuffersOES),
EXTENSION(glRenderbufferStorageOES),
EXTENSION(glGetRenderbufferParameterivOES),
EXTENSION(glIsFramebufferOES),
EXTENSION(glBindFramebufferOES),
EXTENSION(glDeleteFramebuffersOES),
EXTENSION(glGenFramebuffersOES),
EXTENSION(glCheckFramebufferStatusOES),
EXTENSION(glFramebufferRenderbufferOES),
EXTENSION(glFramebufferTexture2DOES),
EXTENSION(glGetFramebufferAttachmentParameterivOES),
EXTENSION(glGenerateMipmapOES),
EXTENSION(glDrawBuffersEXT),
#undef EXTENSION
}; };
for(unsigned int ext = 0; ext < sizeof(glExtensions) / sizeof(Extension); ext++) // This array must be kept sorted with respect to strcmp(), so that binary search works correctly.
// The Unix command "LC_COLLATE=C sort" will generate the correct order.
static const Function glFunctions[] =
{
#define FUNCTION(name) {#name, (__eglMustCastToProperFunctionPointerType)name}
FUNCTION(glActiveTexture),
FUNCTION(glAttachShader),
FUNCTION(glBeginQuery),
FUNCTION(glBeginQueryEXT),
FUNCTION(glBeginTransformFeedback),
FUNCTION(glBindAttribLocation),
FUNCTION(glBindBuffer),
FUNCTION(glBindBufferBase),
FUNCTION(glBindBufferRange),
FUNCTION(glBindFramebuffer),
FUNCTION(glBindFramebufferOES),
FUNCTION(glBindRenderbuffer),
FUNCTION(glBindRenderbufferOES),
FUNCTION(glBindSampler),
FUNCTION(glBindTexture),
FUNCTION(glBindTransformFeedback),
FUNCTION(glBindVertexArray),
FUNCTION(glBlendColor),
FUNCTION(glBlendEquation),
FUNCTION(glBlendEquationSeparate),
FUNCTION(glBlendFunc),
FUNCTION(glBlendFuncSeparate),
FUNCTION(glBlitFramebuffer),
FUNCTION(glBlitFramebufferANGLE),
FUNCTION(glBufferData),
FUNCTION(glBufferSubData),
FUNCTION(glCheckFramebufferStatus),
FUNCTION(glCheckFramebufferStatusOES),
FUNCTION(glClear),
FUNCTION(glClearBufferfi),
FUNCTION(glClearBufferfv),
FUNCTION(glClearBufferiv),
FUNCTION(glClearBufferuiv),
FUNCTION(glClearColor),
FUNCTION(glClearDepthf),
FUNCTION(glClearStencil),
FUNCTION(glClientWaitSync),
FUNCTION(glColorMask),
FUNCTION(glCompileShader),
FUNCTION(glCompressedTexImage2D),
FUNCTION(glCompressedTexImage3D),
FUNCTION(glCompressedTexSubImage2D),
FUNCTION(glCompressedTexSubImage3D),
FUNCTION(glCopyBufferSubData),
FUNCTION(glCopyTexImage2D),
FUNCTION(glCopyTexSubImage2D),
FUNCTION(glCopyTexSubImage3D),
FUNCTION(glCreateProgram),
FUNCTION(glCreateShader),
FUNCTION(glCullFace),
FUNCTION(glDeleteBuffers),
FUNCTION(glDeleteFencesNV),
FUNCTION(glDeleteFramebuffers),
FUNCTION(glDeleteFramebuffersOES),
FUNCTION(glDeleteProgram),
FUNCTION(glDeleteQueries),
FUNCTION(glDeleteQueriesEXT),
FUNCTION(glDeleteRenderbuffers),
FUNCTION(glDeleteRenderbuffersOES),
FUNCTION(glDeleteSamplers),
FUNCTION(glDeleteShader),
FUNCTION(glDeleteSync),
FUNCTION(glDeleteTextures),
FUNCTION(glDeleteTransformFeedbacks),
FUNCTION(glDeleteVertexArrays),
FUNCTION(glDepthFunc),
FUNCTION(glDepthMask),
FUNCTION(glDepthRangef),
FUNCTION(glDetachShader),
FUNCTION(glDisable),
FUNCTION(glDisableVertexAttribArray),
FUNCTION(glDrawArrays),
FUNCTION(glDrawArraysInstanced),
FUNCTION(glDrawBuffers),
FUNCTION(glDrawBuffersEXT),
FUNCTION(glDrawElements),
FUNCTION(glDrawElementsInstanced),
FUNCTION(glDrawRangeElements),
FUNCTION(glEGLImageTargetRenderbufferStorageOES),
FUNCTION(glEGLImageTargetTexture2DOES),
FUNCTION(glEnable),
FUNCTION(glEnableVertexAttribArray),
FUNCTION(glEndQuery),
FUNCTION(glEndQueryEXT),
FUNCTION(glEndTransformFeedback),
FUNCTION(glFenceSync),
FUNCTION(glFinish),
FUNCTION(glFinishFenceNV),
FUNCTION(glFlush),
FUNCTION(glFlushMappedBufferRange),
FUNCTION(glFramebufferRenderbuffer),
FUNCTION(glFramebufferRenderbufferOES),
FUNCTION(glFramebufferTexture2D),
FUNCTION(glFramebufferTexture2DOES),
FUNCTION(glFramebufferTextureLayer),
FUNCTION(glFrontFace),
FUNCTION(glGenBuffers),
FUNCTION(glGenFencesNV),
FUNCTION(glGenFramebuffers),
FUNCTION(glGenFramebuffersOES),
FUNCTION(glGenQueries),
FUNCTION(glGenQueriesEXT),
FUNCTION(glGenRenderbuffers),
FUNCTION(glGenRenderbuffersOES),
FUNCTION(glGenSamplers),
FUNCTION(glGenTextures),
FUNCTION(glGenTransformFeedbacks),
FUNCTION(glGenVertexArrays),
FUNCTION(glGenerateMipmap),
FUNCTION(glGenerateMipmapOES),
FUNCTION(glGetActiveAttrib),
FUNCTION(glGetActiveUniform),
FUNCTION(glGetActiveUniformBlockName),
FUNCTION(glGetActiveUniformBlockiv),
FUNCTION(glGetActiveUniformsiv),
FUNCTION(glGetAttachedShaders),
FUNCTION(glGetAttribLocation),
FUNCTION(glGetBooleanv),
FUNCTION(glGetBufferParameteri64v),
FUNCTION(glGetBufferParameteriv),
FUNCTION(glGetBufferPointerv),
FUNCTION(glGetError),
FUNCTION(glGetFenceivNV),
FUNCTION(glGetFloatv),
FUNCTION(glGetFragDataLocation),
FUNCTION(glGetFramebufferAttachmentParameteriv),
FUNCTION(glGetFramebufferAttachmentParameterivOES),
FUNCTION(glGetGraphicsResetStatusEXT),
FUNCTION(glGetInteger64i_v),
FUNCTION(glGetInteger64v),
FUNCTION(glGetIntegeri_v),
FUNCTION(glGetIntegerv),
FUNCTION(glGetInternalformativ),
FUNCTION(glGetProgramBinary),
FUNCTION(glGetProgramInfoLog),
FUNCTION(glGetProgramiv),
FUNCTION(glGetQueryObjectuiv),
FUNCTION(glGetQueryObjectuivEXT),
FUNCTION(glGetQueryiv),
FUNCTION(glGetQueryivEXT),
FUNCTION(glGetRenderbufferParameteriv),
FUNCTION(glGetRenderbufferParameterivOES),
FUNCTION(glGetSamplerParameterfv),
FUNCTION(glGetSamplerParameteriv),
FUNCTION(glGetShaderInfoLog),
FUNCTION(glGetShaderPrecisionFormat),
FUNCTION(glGetShaderSource),
FUNCTION(glGetShaderiv),
FUNCTION(glGetString),
FUNCTION(glGetStringi),
FUNCTION(glGetSynciv),
FUNCTION(glGetTexParameterfv),
FUNCTION(glGetTexParameteriv),
FUNCTION(glGetTransformFeedbackVarying),
FUNCTION(glGetUniformBlockIndex),
FUNCTION(glGetUniformIndices),
FUNCTION(glGetUniformLocation),
FUNCTION(glGetUniformfv),
FUNCTION(glGetUniformiv),
FUNCTION(glGetUniformuiv),
FUNCTION(glGetVertexAttribIiv),
FUNCTION(glGetVertexAttribIuiv),
FUNCTION(glGetVertexAttribPointerv),
FUNCTION(glGetVertexAttribfv),
FUNCTION(glGetVertexAttribiv),
FUNCTION(glGetnUniformfvEXT),
FUNCTION(glGetnUniformivEXT),
FUNCTION(glHint),
FUNCTION(glInvalidateFramebuffer),
FUNCTION(glInvalidateSubFramebuffer),
FUNCTION(glIsBuffer),
FUNCTION(glIsEnabled),
FUNCTION(glIsFenceNV),
FUNCTION(glIsFramebuffer),
FUNCTION(glIsFramebufferOES),
FUNCTION(glIsProgram),
FUNCTION(glIsQuery),
FUNCTION(glIsQueryEXT),
FUNCTION(glIsRenderbuffer),
FUNCTION(glIsRenderbufferOES),
FUNCTION(glIsSampler),
FUNCTION(glIsShader),
FUNCTION(glIsSync),
FUNCTION(glIsTexture),
FUNCTION(glIsTransformFeedback),
FUNCTION(glIsVertexArray),
FUNCTION(glLineWidth),
FUNCTION(glLinkProgram),
FUNCTION(glMapBufferRange),
FUNCTION(glPauseTransformFeedback),
FUNCTION(glPixelStorei),
FUNCTION(glPolygonOffset),
FUNCTION(glProgramBinary),
FUNCTION(glProgramParameteri),
FUNCTION(glReadBuffer),
FUNCTION(glReadPixels),
FUNCTION(glReadnPixelsEXT),
FUNCTION(glReleaseShaderCompiler),
FUNCTION(glRenderbufferStorage),
FUNCTION(glRenderbufferStorageMultisample),
FUNCTION(glRenderbufferStorageMultisampleANGLE),
FUNCTION(glRenderbufferStorageOES),
FUNCTION(glResumeTransformFeedback),
FUNCTION(glSampleCoverage),
FUNCTION(glSamplerParameterf),
FUNCTION(glSamplerParameterfv),
FUNCTION(glSamplerParameteri),
FUNCTION(glSamplerParameteriv),
FUNCTION(glScissor),
FUNCTION(glSetFenceNV),
FUNCTION(glShaderBinary),
FUNCTION(glShaderSource),
FUNCTION(glStencilFunc),
FUNCTION(glStencilFuncSeparate),
FUNCTION(glStencilMask),
FUNCTION(glStencilMaskSeparate),
FUNCTION(glStencilOp),
FUNCTION(glStencilOpSeparate),
FUNCTION(glTestFenceNV),
FUNCTION(glTexImage2D),
FUNCTION(glTexImage3D),
FUNCTION(glTexImage3DOES),
FUNCTION(glTexParameterf),
FUNCTION(glTexParameterfv),
FUNCTION(glTexParameteri),
FUNCTION(glTexParameteriv),
FUNCTION(glTexStorage2D),
FUNCTION(glTexStorage3D),
FUNCTION(glTexSubImage2D),
FUNCTION(glTexSubImage3D),
FUNCTION(glTransformFeedbackVaryings),
FUNCTION(glUniform1f),
FUNCTION(glUniform1fv),
FUNCTION(glUniform1i),
FUNCTION(glUniform1iv),
FUNCTION(glUniform1ui),
FUNCTION(glUniform1uiv),
FUNCTION(glUniform2f),
FUNCTION(glUniform2fv),
FUNCTION(glUniform2i),
FUNCTION(glUniform2iv),
FUNCTION(glUniform2ui),
FUNCTION(glUniform2uiv),
FUNCTION(glUniform3f),
FUNCTION(glUniform3fv),
FUNCTION(glUniform3i),
FUNCTION(glUniform3iv),
FUNCTION(glUniform3ui),
FUNCTION(glUniform3uiv),
FUNCTION(glUniform4f),
FUNCTION(glUniform4fv),
FUNCTION(glUniform4i),
FUNCTION(glUniform4iv),
FUNCTION(glUniform4ui),
FUNCTION(glUniform4uiv),
FUNCTION(glUniformBlockBinding),
FUNCTION(glUniformMatrix2fv),
FUNCTION(glUniformMatrix2x3fv),
FUNCTION(glUniformMatrix2x4fv),
FUNCTION(glUniformMatrix3fv),
FUNCTION(glUniformMatrix3x2fv),
FUNCTION(glUniformMatrix3x4fv),
FUNCTION(glUniformMatrix4fv),
FUNCTION(glUniformMatrix4x2fv),
FUNCTION(glUniformMatrix4x3fv),
FUNCTION(glUnmapBuffer),
FUNCTION(glUseProgram),
FUNCTION(glValidateProgram),
FUNCTION(glVertexAttrib1f),
FUNCTION(glVertexAttrib1fv),
FUNCTION(glVertexAttrib2f),
FUNCTION(glVertexAttrib2fv),
FUNCTION(glVertexAttrib3f),
FUNCTION(glVertexAttrib3fv),
FUNCTION(glVertexAttrib4f),
FUNCTION(glVertexAttrib4fv),
FUNCTION(glVertexAttribDivisor),
FUNCTION(glVertexAttribI4i),
FUNCTION(glVertexAttribI4iv),
FUNCTION(glVertexAttribI4ui),
FUNCTION(glVertexAttribI4uiv),
FUNCTION(glVertexAttribIPointer),
FUNCTION(glVertexAttribPointer),
FUNCTION(glViewport),
FUNCTION(glWaitSync),
#undef FUNCTION
};
static const size_t numFunctions = sizeof glFunctions / sizeof(Function);
static const Function *const glFunctionsEnd = glFunctions + numFunctions;
Function needle;
needle.name = procname;
if(procname && strncmp("gl", procname, 2) == 0)
{ {
if(strcmp(procname, glExtensions[ext].name) == 0) const Function *result = std::lower_bound(glFunctions, glFunctionsEnd, needle, CompareFunctor());
if(result != glFunctionsEnd && strcmp(procname, result->name) == 0)
{ {
return (__eglMustCastToProperFunctionPointerType)glExtensions[ext].address; return (__eglMustCastToProperFunctionPointerType)result->address;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment