diff options
author | Jack Palevich <jackpal@google.com> | 2010-04-19 22:32:15 +0800 |
---|---|---|
committer | Jack Palevich <jackpal@google.com> | 2010-04-19 22:32:15 +0800 |
commit | 0e4aa37872810e46775374596e0beb11f7123727 (patch) | |
tree | 2912acd68ef1814444c3d8dbf2d2daef2b016a27 /opengl/java/android | |
parent | 7171ea8179e09270e4d6ab825a2320816eee39c5 (diff) | |
download | frameworks_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')
-rw-r--r-- | opengl/java/android/opengl/GLSurfaceView.java | 24 |
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; } |