Find non-extension GLES wrappers in eglGetProcAddress

This allows apps to find OpenGL ES 3.0 functions using
eglGetProcAddress() instead of dlopen/dlsym.

Bug: 9681677
Change-Id: I7ce6e1636bc47d6b0bf20a4e46bd67235714d129
This commit is contained in:
Jesse Hall 2013-07-04 12:08:16 -07:00
parent ef07386e2f
commit c07b52060a
3 changed files with 32 additions and 1 deletions

View File

@ -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;
}

View File

@ -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);

View File

@ -43,6 +43,9 @@ struct egl_connection_t {
EGLint major;
EGLint minor;
egl_t egl;
void* libGles1;
void* libGles2;
};
// ----------------------------------------------------------------------------