summaryrefslogtreecommitdiffstats
path: root/opengl/java/android/opengl/GLSurfaceView.java
diff options
context:
space:
mode:
authorJack Palevich <jackpal@google.com>2010-04-19 22:32:15 +0800
committerJack Palevich <jackpal@google.com>2010-04-19 22:32:15 +0800
commit0e4aa37872810e46775374596e0beb11f7123727 (patch)
tree2912acd68ef1814444c3d8dbf2d2daef2b016a27 /opengl/java/android/opengl/GLSurfaceView.java
parent7171ea8179e09270e4d6ab825a2320816eee39c5 (diff)
downloadframeworks_base-0e4aa37872810e46775374596e0beb11f7123727.zip
frameworks_base-0e4aa37872810e46775374596e0beb11f7123727.tar.gz
frameworks_base-0e4aa37872810e46775374596e0beb11f7123727.tar.bz2
Quietly handle EGL_BAD_NATIVE_WINDOW errors
We believe these errors happen when the window manager has told surface flinger to close the native window. If this error happens while we are creating the EGL surface we exit the render loop (and therefore exit the render thread.) If the error happens while swapping the surface we ignore it. In either situation, we expect that the application is about to be shut down by the window manager, so it should not be necessary to try and recover from the error.
Diffstat (limited to 'opengl/java/android/opengl/GLSurfaceView.java')
-rw-r--r--opengl/java/android/opengl/GLSurfaceView.java24
1 files changed, 19 insertions, 5 deletions
diff --git a/opengl/java/android/opengl/GLSurfaceView.java b/opengl/java/android/opengl/GLSurfaceView.java
index 5ad0361..f904cdf 100644
--- a/opengl/java/android/opengl/GLSurfaceView.java
+++ b/opengl/java/android/opengl/GLSurfaceView.java
@@ -973,9 +973,12 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
mEglDisplay, mEglConfig, holder);
if (mEglSurface == null || mEglSurface == EGL10.EGL_NO_SURFACE) {
- Log.w("EglHelper", "createWindowSurface failed. mEglDisplay: " + mEglDisplay +
- " mEglConfig: " + mEglConfig + " holder: " + holder);
- throwEglException("createWindowSurface");
+ int error = mEgl.eglGetError();
+ if (error == EGL10.EGL_BAD_NATIVE_WINDOW) {
+ Log.e("EglHelper", "createWindowSurface returned EGL_BAD_NATIVE_WINDOW.");
+ return null;
+ }
+ throwEglException("createWindowSurface", error);
}
/*
@@ -1019,9 +1022,16 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
* get a new surface.
*/
int error = mEgl.eglGetError();
- if (error == EGL11.EGL_CONTEXT_LOST) {
+ switch(error) {
+ case EGL11.EGL_CONTEXT_LOST:
return false;
- } else {
+ case EGL10.EGL_BAD_NATIVE_WINDOW:
+ // The native window is bad, probably because the
+ // window manager has closed it. Ignore this error,
+ // on the expectation that the application will be closed soon.
+ Log.e("EglHelper", "eglSwapBuffers returned EGL_BAD_NATIVE_WINDOW. tid=" + Thread.currentThread().getId());
+ break;
+ default:
throwEglException("eglSwapBuffers", error);
}
}
@@ -1292,6 +1302,10 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
Log.w("GLThread", "egl createSurface");
}
gl = (GL10) mEglHelper.createSurface(getHolder());
+ if (gl == null) {
+ // Couldn't create a surface. Quit quietly.
+ break;
+ }
sGLThreadManager.checkGLDriver(gl);
createEglSurface = false;
}