summaryrefslogtreecommitdiffstats
path: root/opengl/libs/EGL/Loader.cpp
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2009-10-14 02:06:37 -0700
committerMathias Agopian <mathias@google.com>2009-10-14 02:06:37 -0700
commit6fc569971faa342b2e2da46c55fbfbba3a2a7814 (patch)
tree56b790ce3ac8aa81b4481f7b6a4e9384aee7c84e /opengl/libs/EGL/Loader.cpp
parentb10e2f1a861933f50d9ad8ea24b5dfa5643a2c11 (diff)
downloadframeworks_base-6fc569971faa342b2e2da46c55fbfbba3a2a7814.zip
frameworks_base-6fc569971faa342b2e2da46c55fbfbba3a2a7814.tar.gz
frameworks_base-6fc569971faa342b2e2da46c55fbfbba3a2a7814.tar.bz2
fix [2187212] add support for GLESv2 dispatch based on TLS
Instead of using a different function pointer table for ES 1.x and ES 2.x, we use a single one that is the union (sort|uniq) of both tables. Two instances of this table are initialized with pointers to GL ES 1.x and GL ES 2.x entry-points. When a context is created, we store its version number and when it is bound to a thread we set the approruiate table based on the stored version. This introduce no penalty while dispatching gl calls to the right API version. [Pending Dr No approval for MR1]
Diffstat (limited to 'opengl/libs/EGL/Loader.cpp')
-rw-r--r--opengl/libs/EGL/Loader.cpp26
1 files changed, 14 insertions, 12 deletions
diff --git a/opengl/libs/EGL/Loader.cpp b/opengl/libs/EGL/Loader.cpp
index 7e7da1b..5d6ac26 100644
--- a/opengl/libs/EGL/Loader.cpp
+++ b/opengl/libs/EGL/Loader.cpp
@@ -128,7 +128,7 @@ const char* Loader::getTag(int dpy, int impl)
return 0;
}
-void* Loader::open(EGLNativeDisplayType display, int impl, gl_hooks_t* hooks)
+void* Loader::open(EGLNativeDisplayType display, int impl, egl_connection_t* cnx)
{
/*
* TODO: if we don't find display/0, then use 0/0
@@ -144,22 +144,22 @@ void* Loader::open(EGLNativeDisplayType display, int impl, gl_hooks_t* hooks)
char const* tag = getTag(index, impl);
if (tag) {
snprintf(path, PATH_MAX, format, "GLES", tag);
- dso = load_driver(path, hooks, EGL | GLESv1_CM | GLESv2);
+ dso = load_driver(path, cnx, EGL | GLESv1_CM | GLESv2);
if (dso) {
hnd = new driver_t(dso);
} else {
// Always load EGL first
snprintf(path, PATH_MAX, format, "EGL", tag);
- dso = load_driver(path, hooks, EGL);
+ dso = load_driver(path, cnx, EGL);
if (dso) {
hnd = new driver_t(dso);
// TODO: make this more automated
snprintf(path, PATH_MAX, format, "GLESv1_CM", tag);
- hnd->set( load_driver(path, hooks, GLESv1_CM), GLESv1_CM );
+ hnd->set( load_driver(path, cnx, GLESv1_CM), GLESv1_CM );
snprintf(path, PATH_MAX, format, "GLESv2", tag);
- hnd->set( load_driver(path, hooks, GLESv2), GLESv2 );
+ hnd->set( load_driver(path, cnx, GLESv2), GLESv2 );
}
}
}
@@ -223,7 +223,7 @@ void Loader::init_api(void* dso,
}
void *Loader::load_driver(const char* driver_absolute_path,
- gl_hooks_t* hooks, uint32_t mask)
+ egl_connection_t* cnx, uint32_t mask)
{
if (access(driver_absolute_path, R_OK)) {
// this happens often, we don't want to log an error
@@ -245,7 +245,7 @@ void *Loader::load_driver(const char* driver_absolute_path,
LOGE_IF(!getProcAddress,
"can't find eglGetProcAddress() in %s", driver_absolute_path);
- gl_hooks_t::egl_t* egl = &hooks->egl;
+ egl_t* egl = &cnx->egl;
__eglMustCastToProperFunctionPointerType* curr =
(__eglMustCastToProperFunctionPointerType*)egl;
char const * const * api = egl_names;
@@ -266,14 +266,16 @@ void *Loader::load_driver(const char* driver_absolute_path,
}
if (mask & GLESv1_CM) {
- init_api(dso, gl_names,
- (__eglMustCastToProperFunctionPointerType*)&hooks->gl,
- getProcAddress);
+ init_api(dso, gl_names,
+ (__eglMustCastToProperFunctionPointerType*)
+ &cnx->hooks[GLESv1_INDEX]->gl,
+ getProcAddress);
}
if (mask & GLESv2) {
- init_api(dso, gl2_names,
- (__eglMustCastToProperFunctionPointerType*)&hooks->gl2,
+ init_api(dso, gl_names,
+ (__eglMustCastToProperFunctionPointerType*)
+ &cnx->hooks[GLESv2_INDEX]->gl,
getProcAddress);
}