summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2010-12-13 14:42:34 -0800
committerRomain Guy <romainguy@google.com>2010-12-13 14:44:36 -0800
commitb8c0de2c2726f4e8f0029710047efe0c8e6661ed (patch)
treec4f2a62504b442b4df656ab5457dded1f4e798a7
parent14b0a6bc0ec8814291751b2b8e80da606cfa12b3 (diff)
downloadframeworks_base-b8c0de2c2726f4e8f0029710047efe0c8e6661ed.zip
frameworks_base-b8c0de2c2726f4e8f0029710047efe0c8e6661ed.tar.gz
frameworks_base-b8c0de2c2726f4e8f0029710047efe0c8e6661ed.tar.bz2
Improve error detection in HardwareRenderer.draw().
Bug #3280872 This should avoid crashes before we detect a GL error and we switch over to software rendering. Change-Id: Ieb4992576d20014e194aab863a456f09c5e19672
-rw-r--r--core/java/android/view/HardwareRenderer.java66
1 files changed, 38 insertions, 28 deletions
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 5bb8c50..63490ee 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -478,35 +478,35 @@ public abstract class HardwareRenderer {
startTime = SystemClock.elapsedRealtime();
}
- checkCurrent();
-
- onPreDraw();
-
- Canvas canvas = mCanvas;
- int saveCount = canvas.save();
- callbacks.onHardwarePreDraw(canvas);
-
- try {
- view.draw(canvas);
- } finally {
- callbacks.onHardwarePostDraw(canvas);
- canvas.restoreToCount(saveCount);
- }
-
- onPostDraw();
-
- if (ViewDebug.DEBUG_PROFILE_DRAWING) {
- EventLog.writeEvent(60000, SystemClock.elapsedRealtime() - startTime);
+ if (checkCurrent()) {
+ onPreDraw();
+
+ Canvas canvas = mCanvas;
+ int saveCount = canvas.save();
+ callbacks.onHardwarePreDraw(canvas);
+
+ try {
+ view.draw(canvas);
+ } finally {
+ callbacks.onHardwarePostDraw(canvas);
+ canvas.restoreToCount(saveCount);
+ }
+
+ onPostDraw();
+
+ if (ViewDebug.DEBUG_PROFILE_DRAWING) {
+ EventLog.writeEvent(60000, SystemClock.elapsedRealtime() - startTime);
+ }
+
+ attachInfo.mIgnoreDirtyState = false;
+
+ sEgl.eglSwapBuffers(sEglDisplay, mEglSurface);
+ checkEglErrors();
}
-
- attachInfo.mIgnoreDirtyState = false;
-
- sEgl.eglSwapBuffers(sEglDisplay, mEglSurface);
- checkEglErrors();
}
}
- private void checkCurrent() {
+ private boolean checkCurrent() {
// TODO: Don't check the current context when we have one per UI thread
// TODO: Use a threadlocal flag to know whether the surface has changed
if (sEgl.eglGetCurrentContext() != sEglContext ||
@@ -515,8 +515,10 @@ public abstract class HardwareRenderer {
fallback(true);
Log.e(LOG_TAG, "eglMakeCurrent failed " +
getEGLErrorString(sEgl.eglGetError()));
+ return false;
}
}
+ return true;
}
static abstract class EglConfigChooser {
@@ -649,6 +651,11 @@ public abstract class HardwareRenderer {
GLES20Canvas createCanvas() {
return mGlCanvas = new GLES20Canvas(mTranslucent);
}
+
+ @Override
+ boolean canDraw() {
+ return super.canDraw() && mGlCanvas != null;
+ }
@Override
void onPreDraw() {
@@ -662,9 +669,12 @@ public abstract class HardwareRenderer {
@Override
void destroy(boolean full) {
- super.destroy(full);
- if (full && mGlCanvas != null) {
- mGlCanvas = null;
+ try {
+ super.destroy(full);
+ } finally {
+ if (full && mGlCanvas != null) {
+ mGlCanvas = null;
+ }
}
}