summaryrefslogtreecommitdiffstats
path: root/libs/rs
diff options
context:
space:
mode:
authorJason Sams <rjsams@android.com>2009-10-27 14:44:31 -0700
committerJason Sams <rjsams@android.com>2009-10-27 14:44:31 -0700
commit7136220b54e68e0c7faac30577ed20b7482481fd (patch)
treefb54db17d9c13daa8c2910309465be13470eb8cf /libs/rs
parent3333fa4f3d2e1bd3842fe7d41d19557ff9a98372 (diff)
downloadframeworks_base-7136220b54e68e0c7faac30577ed20b7482481fd.zip
frameworks_base-7136220b54e68e0c7faac30577ed20b7482481fd.tar.gz
frameworks_base-7136220b54e68e0c7faac30577ed20b7482481fd.tar.bz2
Fix egl cleanup code on context teardown.
Diffstat (limited to 'libs/rs')
-rw-r--r--libs/rs/rsContext.cpp61
-rw-r--r--libs/rs/rsContext.h2
2 files changed, 60 insertions, 3 deletions
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index cc39dac..eb388af 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -30,8 +30,21 @@ using namespace android::renderscript;
pthread_key_t Context::gThreadTLSKey = 0;
uint32_t Context::gThreadTLSKeyCount = 0;
+uint32_t Context::gGLContextCount = 0;
pthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER;
+static void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) {
+ if (returnVal != EGL_TRUE) {
+ fprintf(stderr, "%s() returned %d\n", op, returnVal);
+ }
+
+ for (EGLint error = eglGetError(); error != EGL_SUCCESS; error
+ = eglGetError()) {
+ fprintf(stderr, "after %s() eglError %s (0x%x)\n", op, EGLUtils::strerror(error),
+ error);
+ }
+}
+
void Context::initEGL()
{
mEGL.mNumConfigs = -1;
@@ -61,7 +74,10 @@ void Context::initEGL()
LOGV("initEGL start");
mEGL.mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ checkEglError("eglGetDisplay");
+
eglInitialize(mEGL.mDisplay, &mEGL.mMajorVersion, &mEGL.mMinorVersion);
+ checkEglError("eglInitialize");
status_t err = EGLUtils::selectConfigForNativeWindow(mEGL.mDisplay, configAttribs, mWndSurface, &mEGL.mConfig);
if (err) {
@@ -76,9 +92,24 @@ void Context::initEGL()
android_createDisplaySurface(),
NULL);
}
+ checkEglError("eglCreateWindowSurface");
+ if (mEGL.mSurface == EGL_NO_SURFACE) {
+ LOGE("eglCreateWindowSurface returned EGL_NO_SURFACE");
+ }
+
+ mEGL.mContext = eglCreateContext(mEGL.mDisplay, mEGL.mConfig, EGL_NO_CONTEXT, NULL);
+ checkEglError("eglCreateContext");
+ if (mEGL.mContext == EGL_NO_CONTEXT) {
+ LOGE("eglCreateContext returned EGL_NO_CONTEXT");
+ }
+ gGLContextCount++;
+
+ EGLBoolean ret = eglMakeCurrent(mEGL.mDisplay, mEGL.mSurface, mEGL.mSurface, mEGL.mContext);
+ checkEglError("eglCreateContext", ret);
+ if (mEGL.mContext == EGL_NO_CONTEXT) {
+ LOGE("eglCreateContext returned EGL_NO_CONTEXT");
+ }
- mEGL.mContext = eglCreateContext(mEGL.mDisplay, mEGL.mConfig, NULL, NULL);
- eglMakeCurrent(mEGL.mDisplay, mEGL.mSurface, mEGL.mSurface, mEGL.mContext);
eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_WIDTH, &mEGL.mWidth);
eglQuerySurface(mEGL.mDisplay, mEGL.mSurface, EGL_HEIGHT, &mEGL.mHeight);
@@ -101,6 +132,24 @@ void Context::initEGL()
}
}
+void Context::deinitEGL()
+{
+ EGLBoolean ret = eglMakeCurrent(mEGL.mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ checkEglError("eglCreateContext", ret);
+ if (mEGL.mContext == EGL_NO_CONTEXT) {
+ LOGE("eglCreateContext returned EGL_NO_CONTEXT");
+ }
+
+ eglDestroyContext(mEGL.mDisplay, mEGL.mContext);
+ checkEglError("eglDestroyContext");
+
+ gGLContextCount--;
+ if (!gGLContextCount) {
+ eglTerminate(mEGL.mDisplay);
+ }
+}
+
+
bool Context::runScript(Script *s, uint32_t launchID)
{
ObjectBaseRef<ProgramFragment> frag(mFragment);
@@ -232,7 +281,9 @@ void * Context::threadProc(void *vrsc)
rsc->props.mLogScripts = getProp("debug.rs.script");
rsc->props.mLogObjects = getProp("debug.rs.objects");
+ pthread_mutex_lock(&gInitMutex);
rsc->initEGL();
+ pthread_mutex_unlock(&gInitMutex);
ScriptTLSStruct *tlsStruct = new ScriptTLSStruct;
if (!tlsStruct) {
@@ -294,7 +345,11 @@ void * Context::threadProc(void *vrsc)
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
eglSwapBuffers(rsc->mEGL.mDisplay, rsc->mEGL.mSurface);
- eglTerminate(rsc->mEGL.mDisplay);
+
+ pthread_mutex_lock(&gInitMutex);
+ rsc->deinitEGL();
+ pthread_mutex_unlock(&gInitMutex);
+
rsc->objDestroyOOBRun();
LOGV("RS Thread exited");
return NULL;
diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h
index 0dd90ed..c80fd5a 100644
--- a/libs/rs/rsContext.h
+++ b/libs/rs/rsContext.h
@@ -54,6 +54,7 @@ public:
static pthread_key_t gThreadTLSKey;
static uint32_t gThreadTLSKeyCount;
+ static uint32_t gGLContextCount;
static pthread_mutex_t gInitMutex;
struct ScriptTLSStruct {
@@ -215,6 +216,7 @@ private:
Context();
void initEGL();
+ void deinitEGL();
bool runRootScript();