summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorRomain Guy <romainguy@google.com>2011-08-02 12:59:32 -0700
committerRomain Guy <romainguy@google.com>2011-08-02 12:59:32 -0700
commitcf15efba0792b052dca5baa350d9fb00e6a60667 (patch)
treed8429e515d6f8bc354d00f367ba9380b6f31f004 /core/java/android
parentb1216dd916e0f5fdec29684120c5bcc904800916 (diff)
Properly cancel pending buffers on window size change
Change-Id: Id6108ce61a971673f3ebc8270e9dd00849c91ae5
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/view/HardwareRenderer.java27
-rw-r--r--core/java/android/view/ViewRootImpl.java2
2 files changed, 21 insertions, 8 deletions
diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java
index 6f7183ab2563..66d2641c55ac 100644
--- a/core/java/android/view/HardwareRenderer.java
+++ b/core/java/android/view/HardwareRenderer.java
@@ -135,7 +135,7 @@ public abstract class HardwareRenderer {
/**
* Updates the hardware renderer for the specified surface.
*
- * @param holder The holder for the surface to hardware accelerate.
+ * @param holder The holder for the surface to hardware accelerate
*/
abstract void updateSurface(SurfaceHolder holder) throws Surface.OutOfResourcesException;
@@ -148,9 +148,11 @@ public abstract class HardwareRenderer {
/**
* This method should be invoked whenever the current hardware renderer
- * context should be reset.
+ * context should be reset.
+ *
+ * @param holder The holder for the surface to hardware accelerate
*/
- abstract void invalidate();
+ abstract void invalidate(SurfaceHolder holder);
/**
* This method should be invoked to ensure the hardware renderer is in
@@ -707,13 +709,24 @@ public abstract class HardwareRenderer {
}
@Override
- void invalidate() {
+ void invalidate(SurfaceHolder holder) {
// 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);
+ sEgl.eglMakeCurrent(sEglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ sEgl.eglDestroySurface(sEglDisplay, mEglSurface);
+ 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));
+ }
}
-
+
@Override
boolean validate() {
return checkCurrent() != SURFACE_STATE_ERROR;
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index b22ab7e72ba3..911bf2f6ee7c 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -1344,7 +1344,7 @@ public final class ViewRootImpl extends Handler implements ViewParent,
mAttachInfo.mHardwareRenderer.isEnabled())) {
mAttachInfo.mHardwareRenderer.setup(mWidth, mHeight);
if (!hwInitialized) {
- mAttachInfo.mHardwareRenderer.invalidate();
+ mAttachInfo.mHardwareRenderer.invalidate(mHolder);
}
}