From 0e4aa37872810e46775374596e0beb11f7123727 Mon Sep 17 00:00:00 2001 From: Jack Palevich Date: Mon, 19 Apr 2010 22:32:15 +0800 Subject: 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. --- opengl/java/android/opengl/GLSurfaceView.java | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'opengl') 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; } -- cgit v1.1