Merge "RS Error cleanup. Thow java exception during init if the GL driver fails rather than native crash."
This commit is contained in:
32
graphics/java/android/renderscript/RSDriverException.java
Normal file
32
graphics/java/android/renderscript/RSDriverException.java
Normal file
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.renderscript;
|
||||
|
||||
|
||||
/**
|
||||
* Base class for all exceptions thrown by the Android
|
||||
* Renderscript
|
||||
* @hide
|
||||
*/
|
||||
public class RSDriverException extends RSRuntimeException {
|
||||
public RSDriverException(String string) {
|
||||
super(string);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.renderscript;
|
||||
|
||||
|
||||
/**
|
||||
* Base class for all exceptions thrown by the Android
|
||||
* Renderscript
|
||||
* @hide
|
||||
*/
|
||||
public class RSIllegalArgumentException extends RSRuntimeException {
|
||||
public RSIllegalArgumentException(String string) {
|
||||
super(string);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.renderscript;
|
||||
|
||||
|
||||
/**
|
||||
* Base class for all exceptions thrown by the Android
|
||||
* Renderscript
|
||||
* @hide
|
||||
*/
|
||||
public class RSInvalidStateException extends RSRuntimeException {
|
||||
public RSInvalidStateException(String string) {
|
||||
super(string);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
31
graphics/java/android/renderscript/RSRuntimeException.java
Normal file
31
graphics/java/android/renderscript/RSRuntimeException.java
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package android.renderscript;
|
||||
|
||||
|
||||
/**
|
||||
* Base class for all exceptions thrown by the Android
|
||||
* Renderscript
|
||||
* @hide
|
||||
*/
|
||||
public class RSRuntimeException
|
||||
extends java.lang.RuntimeException {
|
||||
public RSRuntimeException(String string) {
|
||||
super(string);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,6 +128,9 @@ public class RenderScriptGL extends RenderScript {
|
||||
mSurfaceConfig.mStencilMin, mSurfaceConfig.mStencilPref,
|
||||
mSurfaceConfig.mSamplesMin, mSurfaceConfig.mSamplesPref,
|
||||
mSurfaceConfig.mSamplesQ);
|
||||
if (mContext == 0) {
|
||||
throw new RSDriverException("Failed to create RS context.");
|
||||
}
|
||||
mMessageThread = new MessageThread(this);
|
||||
mMessageThread.start();
|
||||
Element.initPredefined(this);
|
||||
|
||||
@@ -33,8 +33,6 @@ public class Type extends BaseObj {
|
||||
int mElementCount;
|
||||
Element mElement;
|
||||
|
||||
Class mJavaClass;
|
||||
|
||||
public Element getElement() {
|
||||
return mElement;
|
||||
}
|
||||
@@ -124,12 +122,6 @@ public class Type extends BaseObj {
|
||||
calcElementCount();
|
||||
}
|
||||
|
||||
public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
|
||||
android.util.Log.e("RenderScript", "Calling depricated createFromClass");
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
public static class Builder {
|
||||
RenderScript mRS;
|
||||
Dimension[] mDimensions;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user