Improve RS error handling. On errors RS will now store the error and a message that can be read from the app. RS will then not continue rendering frames while an unchecked error is present until new state is received.
diff --git a/rsContext.cpp b/rsContext.cpp index cc3a74f..d8a9a99 100644 --- a/rsContext.cpp +++ b/rsContext.cpp
@@ -178,6 +178,11 @@ uint32_t ret = runScript(mRootScript.get(), 0); checkError("runRootScript"); + if (mError != RS_ERROR_NONE) { + // If we have an error condition we stop rendering until + // somthing changes that might fix it. + ret = 0; + } return ret; } @@ -240,10 +245,13 @@ } } -void Context::setupCheck() +bool Context::setupCheck() { if (checkVersion2_0()) { - mShaderCache.lookup(this, mVertex.get(), mFragment.get()); + if (!mShaderCache.lookup(this, mVertex.get(), mFragment.get())) { + LOGE("Context::setupCheck() 1 fail"); + return false; + } mFragmentStore->setupGL2(this, &mStateFragmentStore); mFragment->setupGL2(this, &mStateFragment, &mShaderCache); @@ -256,6 +264,7 @@ mRaster->setupGL(this, &mStateRaster); mVertex->setupGL(this, &mStateVertex); } + return true; } static bool getProp(const char *str) @@ -389,6 +398,9 @@ mUseDepth = useDepth; mPaused = false; mObjHead = NULL; + mError = RS_ERROR_NONE; + mErrorMsg = NULL; + memset(&mEGL, 0, sizeof(mEGL)); memset(&mGL, 0, sizeof(mGL)); mIsGraphicsContext = isGraphics; @@ -764,6 +776,23 @@ mIO.mToClient.shutdown(); } +const char * Context::getError(RsError *err) +{ + *err = mError; + mError = RS_ERROR_NONE; + if (*err != RS_ERROR_NONE) { + return mErrorMsg; + } + return NULL; +} + +void Context::setError(RsError e, const char *msg) +{ + mError = e; + mErrorMsg = msg; +} + + void Context::dumpDebug() const { LOGE("RS Context debug %p", this); @@ -874,6 +903,15 @@ ObjectBase::dumpAll(rsc); } +const char * rsi_ContextGetError(Context *rsc, RsError *e) +{ + const char *msg = rsc->getError(e); + if (*e != RS_ERROR_NONE) { + LOGE("RS Error %i %s", *e, msg); + } + return msg; +} + } }