summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2011-03-29 13:54:35 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2011-03-29 13:54:43 -0700
commitad663d8040ddd4f3e537117847f20d42797b429e (patch)
tree99f4d78d9d929beb165926d7fb400c6f26ec5837
parent1e7fb7aed7b00cebc8f0e501c911727af6527523 (diff)
parentc3fba3be74669d59141a25b36e3a07a8e2605144 (diff)
downloadframeworks_base-ad663d8040ddd4f3e537117847f20d42797b429e.zip
frameworks_base-ad663d8040ddd4f3e537117847f20d42797b429e.tar.gz
frameworks_base-ad663d8040ddd4f3e537117847f20d42797b429e.tar.bz2
Merge from gingerbread
Change-Id: I31e3da083b642d5c7cf6332095fa228b840ee7bb
-rw-r--r--opengl/libs/EGL/egl.cpp51
1 files changed, 31 insertions, 20 deletions
diff --git a/opengl/libs/EGL/egl.cpp b/opengl/libs/EGL/egl.cpp
index 6d34927..d26d13e 100644
--- a/opengl/libs/EGL/egl.cpp
+++ b/opengl/libs/EGL/egl.cpp
@@ -814,7 +814,7 @@ EGLBoolean eglTerminate(EGLDisplay dpy)
dp->refs--;
dp->numTotalConfigs = 0;
delete [] dp->configs;
- clearTLS();
+
return res;
}
@@ -1150,6 +1150,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)
{
@@ -1178,13 +1199,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
@@ -1230,30 +1247,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;
}
@@ -1637,6 +1645,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) {