diff options
| author | Romain Guy <romainguy@google.com> | 2010-12-13 14:43:41 -0800 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-12-13 14:43:41 -0800 |
| commit | c0734f6c8d67deab00b10bd0bb75516cd1502dc0 (patch) | |
| tree | 1a8ef58a72731eabd5624827ff4f24c1f1a50386 /core/java | |
| parent | ffdd591a829af7fddd36a7b80d2a3b8188c871a6 (diff) | |
| parent | b8c0de2c2726f4e8f0029710047efe0c8e6661ed (diff) | |
| download | frameworks_base-c0734f6c8d67deab00b10bd0bb75516cd1502dc0.zip frameworks_base-c0734f6c8d67deab00b10bd0bb75516cd1502dc0.tar.gz frameworks_base-c0734f6c8d67deab00b10bd0bb75516cd1502dc0.tar.bz2 | |
Merge "Improve error detection in HardwareRenderer.draw(). Bug #3280872"
Diffstat (limited to 'core/java')
| -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; + } } } |
