diff options
| author | Romain Guy <romainguy@google.com> | 2011-08-03 16:23:35 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-08-03 16:23:35 -0700 |
| commit | 8c8333c80ea6f178294c054bc9de233105134ce2 (patch) | |
| tree | 6b898415976972fde0e925a1156cde3bca892675 /core/java/android | |
| parent | 271865565a5c18089853d3e9c804c941742511d3 (diff) | |
| parent | 1d0c708961f824ac5171238c205a7bf328d5d8a5 (diff) | |
Merge "Destroy the EGL surface when the ViewRootImpl surface is invalid Bug #5109839"
Diffstat (limited to 'core/java/android')
| -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); |
