diff options
author | Jason Sams <rjsams@android.com> | 2010-11-03 14:27:11 -0700 |
---|---|---|
committer | Jason Sams <rjsams@android.com> | 2010-11-03 14:27:11 -0700 |
commit | d5f06300341df0990be3e0b7a26fa49b13c6fc19 (patch) | |
tree | b6ab4893e599c401debbe0f0282e28303c5514d9 /libs/rs | |
parent | 4b8d36b30ad2e87f3969034eb42dc14b99f03686 (diff) | |
download | frameworks_base-d5f06300341df0990be3e0b7a26fa49b13c6fc19.zip frameworks_base-d5f06300341df0990be3e0b7a26fa49b13c6fc19.tar.gz frameworks_base-d5f06300341df0990be3e0b7a26fa49b13c6fc19.tar.bz2 |
RS Error cleanup.
Thow java exception during init if the
GL driver fails rather than native crash.
Change-Id: Ie96ef5a2ac12e64f9456545d86157c4c95179a8e
Diffstat (limited to 'libs/rs')
-rw-r--r-- | libs/rs/rsContext.cpp | 75 | ||||
-rw-r--r-- | libs/rs/rsContext.h | 7 |
2 files changed, 62 insertions, 20 deletions
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 0241455..678d327 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -107,7 +107,7 @@ void printEGLConfiguration(EGLDisplay dpy, EGLConfig config) { } -void Context::initGLThread() +bool Context::initGLThread() { pthread_mutex_lock(&gInitMutex); LOGV("initGLThread start %p", this); @@ -169,7 +169,9 @@ void Context::initGLThread() mEGL.mContext = eglCreateContext(mEGL.mDisplay, mEGL.mConfig, EGL_NO_CONTEXT, context_attribs2); checkEglError("eglCreateContext"); if (mEGL.mContext == EGL_NO_CONTEXT) { + pthread_mutex_unlock(&gInitMutex); LOGE("%p, eglCreateContext returned EGL_NO_CONTEXT", this); + return false; } gGLContextCount++; @@ -179,10 +181,19 @@ void Context::initGLThread() checkEglError("eglCreatePbufferSurface"); if (mEGL.mSurfaceDefault == EGL_NO_SURFACE) { LOGE("eglCreatePbufferSurface returned EGL_NO_SURFACE"); + pthread_mutex_unlock(&gInitMutex); + deinitEGL(); + return false; } EGLBoolean ret = eglMakeCurrent(mEGL.mDisplay, mEGL.mSurfaceDefault, mEGL.mSurfaceDefault, mEGL.mContext); - checkEglError("eglMakeCurrent", ret); + if (ret == EGL_FALSE) { + LOGE("eglMakeCurrent returned EGL_FALSE"); + checkEglError("eglMakeCurrent", ret); + pthread_mutex_unlock(&gInitMutex); + deinitEGL(); + return false; + } mGL.mVersion = glGetString(GL_VERSION); mGL.mVendor = glGetString(GL_VENDOR); @@ -207,6 +218,9 @@ void Context::initGLThread() if (!verptr) { LOGE("Error, OpenGL ES Lite not supported"); + pthread_mutex_unlock(&gInitMutex); + deinitEGL(); + return false; } else { sscanf(verptr, " %i.%i", &mGL.mMajorVersion, &mGL.mMinorVersion); } @@ -231,15 +245,18 @@ void Context::initGLThread() LOGV("initGLThread end %p", this); pthread_mutex_unlock(&gInitMutex); + return true; } void Context::deinitEGL() { LOGV("%p, deinitEGL", this); - eglMakeCurrent(mEGL.mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, mEGL.mContext); - eglDestroyContext(mEGL.mDisplay, mEGL.mContext); - checkEglError("eglDestroyContext"); + if (mEGL.mContext != EGL_NO_CONTEXT) { + eglMakeCurrent(mEGL.mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, mEGL.mContext); + eglDestroyContext(mEGL.mDisplay, mEGL.mContext); + checkEglError("eglDestroyContext"); + } gGLContextCount--; if (!gGLContextCount) { @@ -421,6 +438,7 @@ void * Context::threadProc(void *vrsc) rsc->mTlsStruct = new ScriptTLSStruct; if (!rsc->mTlsStruct) { LOGE("Error allocating tls storage"); + rsc->setError(RS_ERROR_OUT_OF_MEMORY, "Failed allocation for TLS"); return NULL; } rsc->mTlsStruct->mContext = rsc; @@ -430,7 +448,10 @@ void * Context::threadProc(void *vrsc) LOGE("pthread_setspecific %i", status); } - rsc->initGLThread(); + if (!rsc->initGLThread()) { + rsc->setError(RS_ERROR_OUT_OF_MEMORY, "Failed initializing GL"); + return NULL; + } rsc->mScriptC.init(rsc); if (rsc->mIsGraphicsContext) { @@ -580,18 +601,33 @@ void Context::setPriority(int32_t p) #endif } -Context::Context(Device *dev, const RsSurfaceConfig *sc) +Context::Context() { - pthread_mutex_lock(&gInitMutex); - - dev->addContext(this); - mDev = dev; + mDev = NULL; mRunning = false; mExit = false; mPaused = false; mObjHead = NULL; mError = RS_ERROR_NONE; mErrorMsg = NULL; +} + +Context * Context::createContext(Device *dev, const RsSurfaceConfig *sc) +{ + Context * rsc = new Context(); + if (!rsc->initContext(dev, sc)) { + delete rsc; + return NULL; + } + return rsc; +} + +bool Context::initContext(Device *dev, const RsSurfaceConfig *sc) +{ + pthread_mutex_lock(&gInitMutex); + + dev->addContext(this); + mDev = dev; if (sc) { mUserSurfaceConfig = *sc; } else { @@ -610,7 +646,7 @@ Context::Context(Device *dev, const RsSurfaceConfig *sc) if (status) { LOGE("Failed to init thread tls key."); pthread_mutex_unlock(&gInitMutex); - return; + return false; } } gThreadTLSKeyCount++; @@ -622,7 +658,7 @@ Context::Context(Device *dev, const RsSurfaceConfig *sc) status = pthread_attr_init(&threadAttr); if (status) { LOGE("Failed to init thread attribute."); - return; + return false; } mWndSurface = NULL; @@ -642,12 +678,16 @@ Context::Context(Device *dev, const RsSurfaceConfig *sc) status = pthread_create(&mThreadId, &threadAttr, threadProc, this); if (status) { LOGE("Failed to start rs context thread."); - return; + return false; } - while(!mRunning) { + while(!mRunning && (mError == RS_ERROR_NONE)) { usleep(100); } + if (mError != RS_ERROR_NONE) { + return false; + } + mWorkers.mCompleteSignal.init(); mWorkers.mRunningCount = 0; mWorkers.mLaunchCount = 0; @@ -660,6 +700,7 @@ Context::Context(Device *dev, const RsSurfaceConfig *sc) } } pthread_attr_destroy(&threadAttr); + return true; } Context::~Context() @@ -1020,7 +1061,7 @@ RsContext rsContextCreate(RsDevice vdev, uint32_t version) { LOGV("rsContextCreate %p", vdev); Device * dev = static_cast<Device *>(vdev); - Context *rsc = new Context(dev, NULL); + Context *rsc = Context::createContext(dev, NULL); return rsc; } @@ -1028,7 +1069,7 @@ RsContext rsContextCreateGL(RsDevice vdev, uint32_t version, RsSurfaceConfig sc) { LOGV("rsContextCreateGL %p", vdev); Device * dev = static_cast<Device *>(vdev); - Context *rsc = new Context(dev, &sc); + Context *rsc = Context::createContext(dev, &sc); LOGV("rsContextCreateGL ret %p ", rsc); return rsc; } diff --git a/libs/rs/rsContext.h b/libs/rs/rsContext.h index e269d4e..2017ceb 100644 --- a/libs/rs/rsContext.h +++ b/libs/rs/rsContext.h @@ -69,7 +69,7 @@ namespace renderscript { class Context { public: - Context(Device *, const RsSurfaceConfig *sc); + static Context * createContext(Device *, const RsSurfaceConfig *sc); ~Context(); static pthread_key_t gThreadTLSKey; @@ -276,9 +276,10 @@ protected: private: Context(); + bool initContext(Device *, const RsSurfaceConfig *sc); - void initEGL(); - void initGLThread(); + + bool initGLThread(); void deinitEGL(); uint32_t runRootScript(); |