Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0e4aa378 authored by Jack Palevich's avatar Jack Palevich
Browse files

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.
parent 7171ea81
Loading
Loading
Loading
Loading
+19 −5
Original line number Diff line number Diff line
@@ -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;
                    }