diff options
author | Jason Sams <rjsams@android.com> | 2009-10-29 02:03:37 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2009-10-29 02:03:37 -0700 |
commit | 060746b3831fcc31eede09e55240143d413460e5 (patch) | |
tree | 00bc93a3d4f42fd7a146ba7775c2d92a35be3d2e /libs/rs | |
parent | 0a9416482c3fa0c55af242277cc695c6e1268b61 (diff) | |
parent | 3c249da7eaceaffae87657aeb7179ffc4a5e1570 (diff) | |
download | frameworks_base-060746b3831fcc31eede09e55240143d413460e5.zip frameworks_base-060746b3831fcc31eede09e55240143d413460e5.tar.gz frameworks_base-060746b3831fcc31eede09e55240143d413460e5.tar.bz2 |
am 3c249da7: am 21e799ed: am e9e50b57: Merge change I7136220b into eclair
Merge commit '3c249da7eaceaffae87657aeb7179ffc4a5e1570'
* commit '3c249da7eaceaffae87657aeb7179ffc4a5e1570':
Fix egl cleanup code on context teardown.
Diffstat (limited to 'libs/rs')
-rw-r--r-- | libs/rs/rsContext.cpp | 61 | ||||
-rw-r--r-- | libs/rs/rsContext.h | 2 |
2 files changed, 60 insertions, 3 deletions
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 463f63f..abe7b4a 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 dcdd65a..a919983 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 { @@ -214,6 +215,7 @@ private: Context(); void initEGL(); + void deinitEGL(); bool runRootScript(); |