diff options
author | Romain Guy <romainguy@google.com> | 2010-12-13 14:42:34 -0800 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2010-12-13 14:44:36 -0800 |
commit | b8c0de2c2726f4e8f0029710047efe0c8e6661ed (patch) | |
tree | c4f2a62504b442b4df656ab5457dded1f4e798a7 | |
parent | 14b0a6bc0ec8814291751b2b8e80da606cfa12b3 (diff) | |
download | frameworks_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.java | 66 |
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; + } } } |