diff options
author | Mathias Agopian <mathias@google.com> | 2009-10-14 02:06:37 -0700 |
---|---|---|
committer | Mathias Agopian <mathias@google.com> | 2009-10-14 02:06:37 -0700 |
commit | 6fc569971faa342b2e2da46c55fbfbba3a2a7814 (patch) | |
tree | 56b790ce3ac8aa81b4481f7b6a4e9384aee7c84e /opengl/libs/EGL/Loader.cpp | |
parent | b10e2f1a861933f50d9ad8ea24b5dfa5643a2c11 (diff) | |
download | frameworks_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.cpp | 26 |
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); } |