summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2011-08-03 16:23:35 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-08-03 16:23:35 -0700
commit8c8333c80ea6f178294c054bc9de233105134ce2 (patch)
tree6b898415976972fde0e925a1156cde3bca892675 /core/java/android
parent271865565a5c18089853d3e9c804c941742511d3 (diff)
parent1d0c708961f824ac5171238c205a7bf328d5d8a5 (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.java44
-rw-r--r--core/java/android/view/ViewRootImpl.java7
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);