diff options
-rw-r--r-- | opengl/libs/EGL/Loader.cpp | 13 | ||||
-rw-r--r-- | opengl/libs/EGL/eglApi.cpp | 17 | ||||
-rw-r--r-- | opengl/libs/EGL/egldefs.h | 3 |
3 files changed, 32 insertions, 1 deletions
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp index 00bfa5a..56550b3 100644 --- a/opengl/libs/EGL/Loader.cpp +++ b/opengl/libs/EGL/Loader.cpp @@ -175,6 +175,12 @@ Loader::~Loader() GLTrace_stop(); } +static void* load_wrapper(const char* path) { + void* so = dlopen(path, RTLD_NOW | RTLD_LOCAL); + ALOGE_IF(!so, "dlopen(\"%s\") failed: %s", path, dlerror()); + return so; +} + void* Loader::open(egl_connection_t* cnx) { void* dso; @@ -200,7 +206,12 @@ void* Loader::open(egl_connection_t* cnx) LOG_FATAL_IF(!index && !hnd, "couldn't find the default OpenGL ES implementation " "for default display"); - + + cnx->libGles2 = load_wrapper("system/lib/libGLESv2.so"); + cnx->libGles1 = load_wrapper("system/lib/libGLESv1_CM.so"); + LOG_ALWAYS_FATAL_IF(!cnx->libGles2 || !cnx->libGles1, + "couldn't load system OpenGL ES wrapper libraries"); + return (void*)hnd; } diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp index 74d3973..a243b32 100644 --- a/opengl/libs/EGL/eglApi.cpp +++ b/opengl/libs/EGL/eglApi.cpp @@ -16,6 +16,7 @@ #define ATRACE_TAG ATRACE_TAG_GRAPHICS +#include <dlfcn.h> #include <ctype.h> #include <stdlib.h> #include <string.h> @@ -772,6 +773,20 @@ EGLint eglGetError(void) return err; } +static __eglMustCastToProperFunctionPointerType findBuiltinGLWrapper( + const char* procname) { + const egl_connection_t* cnx = &gEGLImpl; + void* proc = NULL; + + proc = dlsym(cnx->libGles2, procname); + if (proc) return (__eglMustCastToProperFunctionPointerType)proc; + + proc = dlsym(cnx->libGles1, procname); + if (proc) return (__eglMustCastToProperFunctionPointerType)proc; + + return NULL; +} + __eglMustCastToProperFunctionPointerType eglGetProcAddress(const char *procname) { // eglGetProcAddress() could be the very first function called @@ -793,6 +808,8 @@ __eglMustCastToProperFunctionPointerType eglGetProcAddress(const char *procname) addr = findProcAddress(procname, sExtensionMap, NELEM(sExtensionMap)); if (addr) return addr; + addr = findBuiltinGLWrapper(procname); + if (addr) return addr; // this protects accesses to sGLExtentionMap and sGLExtentionSlot pthread_mutex_lock(&sExtensionMapMutex); diff --git a/opengl/libs/EGL/egldefs.h b/opengl/libs/EGL/egldefs.h index 1cfe561..b905ea0 100644 --- a/opengl/libs/EGL/egldefs.h +++ b/opengl/libs/EGL/egldefs.h @@ -43,6 +43,9 @@ struct egl_connection_t { EGLint major; EGLint minor; egl_t egl; + + void* libGles1; + void* libGles2; }; // ---------------------------------------------------------------------------- |