diff options
author | Steve Kondik <shade@chemlab.org> | 2011-03-30 09:55:14 -0400 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2011-03-30 09:55:14 -0400 |
commit | d732eddf709d302ef22cf5c0748aeafd5c71696e (patch) | |
tree | d7f5f70125aa1daf4b4cc2161e93c5186fc671b1 /opengl/libs/EGL/egl.cpp | |
parent | a799afd72ffc689de57a50e3e9c2c8d092d9ccec (diff) | |
parent | c3fba3be74669d59141a25b36e3a07a8e2605144 (diff) | |
download | frameworks_base-d732eddf709d302ef22cf5c0748aeafd5c71696e.zip frameworks_base-d732eddf709d302ef22cf5c0748aeafd5c71696e.tar.gz frameworks_base-d732eddf709d302ef22cf5c0748aeafd5c71696e.tar.bz2 |
Merge branch 'gingerbread' of git://android.git.kernel.org/platform/frameworks/base into HEAD
Diffstat (limited to 'opengl/libs/EGL/egl.cpp')
-rw-r--r-- | opengl/libs/EGL/egl.cpp | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp index cecedd7..ffb3189 100644 --- a/opengl/libs/EGL/egl.cpp +++ b/opengl/libs/EGL/egl.cpp @@ -828,7 +828,7 @@ EGLBoolean eglTerminate(EGLDisplay dpy) dp->refs--; dp->numTotalConfigs = 0; delete [] dp->configs; - clearTLS(); + return res; } @@ -1165,6 +1165,27 @@ EGLBoolean eglDestroyContext(EGLDisplay dpy, EGLContext ctx) return result; } +static void loseCurrent(egl_context_t * cur_c) +{ + if (cur_c) { + egl_surface_t * cur_r = get_surface(cur_c->read); + egl_surface_t * cur_d = get_surface(cur_c->draw); + + // by construction, these are either 0 or valid (possibly terminated) + // it should be impossible for these to be invalid + ContextRef _cur_c(cur_c); + SurfaceRef _cur_r(cur_r); + SurfaceRef _cur_d(cur_d); + + cur_c->read = NULL; + cur_c->draw = NULL; + + _cur_c.release(); + _cur_r.release(); + _cur_d.release(); + } +} + EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx) { @@ -1193,13 +1214,9 @@ EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, // these are the current objects structs egl_context_t * cur_c = get_context(getContext()); - egl_surface_t * cur_r = NULL; - egl_surface_t * cur_d = NULL; if (ctx != EGL_NO_CONTEXT) { c = get_context(ctx); - cur_r = get_surface(c->read); - cur_d = get_surface(c->draw); impl_ctx = c->context; } else { // no context given, use the implementation of the current context @@ -1245,30 +1262,21 @@ EGLBoolean eglMakeCurrent( EGLDisplay dpy, EGLSurface draw, } if (result == EGL_TRUE) { - // by construction, these are either 0 or valid (possibly terminated) - // it should be impossible for these to be invalid - ContextRef _cur_c(cur_c); - SurfaceRef _cur_r(cur_r); - SurfaceRef _cur_d(cur_d); - // cur_c has to be valid here (but could be terminated) + loseCurrent(cur_c); + if (ctx != EGL_NO_CONTEXT) { setGlThreadSpecific(c->cnx->hooks[c->version]); setContext(ctx); _c.acquire(); + _r.acquire(); + _d.acquire(); + c->read = read; + c->draw = draw; } else { setGlThreadSpecific(&gHooksNoContext); setContext(EGL_NO_CONTEXT); } - _cur_c.release(); - - _r.acquire(); - _cur_r.release(); - if (c) c->read = read; - - _d.acquire(); - _cur_d.release(); - if (c) c->draw = draw; } return result; } @@ -1700,6 +1708,9 @@ EGLenum eglQueryAPI(void) EGLBoolean eglReleaseThread(void) { + // If there is context bound to the thread, release it + loseCurrent(get_context(getContext())); + for (int i=0 ; i<IMPL_NUM_IMPLEMENTATIONS ; i++) { egl_connection_t* const cnx = &gEGLImpl[i]; if (cnx->dso) { |