diff options
| author | 2011-08-03 16:22:24 -0700 | |
|---|---|---|
| committer | 2011-08-03 16:22:24 -0700 | |
| commit | 1d0c708961f824ac5171238c205a7bf328d5d8a5 (patch) | |
| tree | 06dea698f1f38c02b6f005f5cfae0b3a36d2ee8b | |
| parent | d3facf341bf106588aade72c0164532cd4bf941f (diff) | |
Destroy the EGL surface when the ViewRootImpl surface is invalid
Bug #5109839
Change-Id: Icebde9abf43b852397a73ffef519004993b46901
| -rw-r--r-- | core/java/android/view/HardwareRenderer.java | 44 | ||||
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 7 |
2 files changed, 29 insertions, 22 deletions
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 744d564ef8f1..f2b6b1fd870b 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -635,16 +635,8 @@ public abstract class HardwareRenderer { destroySurface(); // Create an EGL surface we can render into. - mEglSurface = sEgl.eglCreateWindowSurface(sEglDisplay, sEglConfig, holder, null); - - if (mEglSurface == null || mEglSurface == EGL_NO_SURFACE) { - int error = sEgl.eglGetError(); - if (error == EGL_BAD_NATIVE_WINDOW) { - Log.e(LOG_TAG, "createWindowSurface returned EGL_BAD_NATIVE_WINDOW."); - return null; - } - throw new RuntimeException("createWindowSurface failed " - + getEGLErrorString(error)); + if (!createSurface(holder)) { + return null; } /* @@ -713,24 +705,34 @@ public abstract class HardwareRenderer { // Cancels any existing buffer to ensure we'll get a buffer // of the right size before we call eglSwapBuffers sEgl.eglMakeCurrent(sEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - + if (mEglSurface != null && mEglSurface != EGL_NO_SURFACE) { sEgl.eglDestroySurface(sEglDisplay, mEglSurface); + mEglSurface = null; + setEnabled(false); } if (holder.getSurface().isValid()) { - mEglSurface = sEgl.eglCreateWindowSurface(sEglDisplay, sEglConfig, holder, null); - - if (mEglSurface == null || mEglSurface == EGL_NO_SURFACE) { - int error = sEgl.eglGetError(); - if (error == EGL_BAD_NATIVE_WINDOW) { - Log.e(LOG_TAG, "createWindowSurface returned EGL_BAD_NATIVE_WINDOW."); - return; - } - throw new RuntimeException("createWindowSurface failed " - + getEGLErrorString(error)); + if (!createSurface(holder)) { + return; } + setEnabled(true); + } + } + + private boolean createSurface(SurfaceHolder holder) { + mEglSurface = sEgl.eglCreateWindowSurface(sEglDisplay, sEglConfig, holder, null); + + if (mEglSurface == null || mEglSurface == EGL_NO_SURFACE) { + int error = sEgl.eglGetError(); + if (error == EGL_BAD_NATIVE_WINDOW) { + Log.e(LOG_TAG, "createWindowSurface returned EGL_BAD_NATIVE_WINDOW."); + return false; + } + throw new RuntimeException("createWindowSurface failed " + + getEGLErrorString(error)); } + return true; } @Override diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 911bf2f6ee7c..ec4c5a29a0f6 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1253,6 +1253,11 @@ public final class ViewRootImpl extends Handler implements ViewParent, mScroller.abortAnimation(); } disposeResizeBuffer(); + // Our surface is gone + if (mAttachInfo.mHardwareRenderer != null && + mAttachInfo.mHardwareRenderer.isEnabled()) { + mAttachInfo.mHardwareRenderer.destroy(true); + } } else if (surfaceGenerationId != mSurface.getGenerationId() && mSurfaceHolder == null && mAttachInfo.mHardwareRenderer != null) { fullRedrawNeeded = true; @@ -1273,7 +1278,7 @@ public final class ViewRootImpl extends Handler implements ViewParent, } } catch (RemoteException e) { } - + if (DEBUG_ORIENTATION) Log.v( TAG, "Relayout returned: frame=" + frame + ", surface=" + mSurface); |