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

Commit 04b17ab7 authored by Jack Palevich's avatar Jack Palevich
Browse files

Improve eglSwapBuffers error handling.

We now distinguish EGL_CONTEXT_LOST errors from
other kinds of errors. We return "true" if
the swap completes successfully, "false" if
the swap fails due to EGL_CONTEXT_LOST, and
throw a RuntimeException if the swap fails due
to any other cause.

If eglSwapBuffers succeeds, we now avoid calling
eglGetError at all, which means we avoid clearing
any EGL errors that might already have been
pending before eglSwapBuffers is called.
parent 7d740861
Loading
Loading
Loading
Loading
+20 −9
Original line number Diff line number Diff line
@@ -977,15 +977,22 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
         * @return false if the context has been lost.
         */
        public boolean swap() {
            mEgl.eglSwapBuffers(mEglDisplay, mEglSurface);
            if (! mEgl.eglSwapBuffers(mEglDisplay, mEglSurface)) {

                /*
             * Always check for EGL_CONTEXT_LOST, which means the context
                 * Check for EGL_CONTEXT_LOST, which means the context
                 * and all associated data were lost (For instance because
                 * the device went to sleep). We need to sleep until we
                 * get a new surface.
                 */
            return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;
                int error = mEgl.eglGetError();
                if (error == EGL11.EGL_CONTEXT_LOST) {
                    return false;
                } else {
                    throwEglException("eglSwapBuffers", error);
                }
            }
            return true;
        }

        public void destroySurface() {
@@ -1010,7 +1017,11 @@ public class GLSurfaceView extends SurfaceView implements SurfaceHolder.Callback
        }

        private void throwEglException(String function) {
            throw new RuntimeException(function + " failed: " + mEgl.eglGetError());
            throwEglException(function, mEgl.eglGetError());
        }

        private void throwEglException(String function, int error) {
            throw new RuntimeException(function + " failed: " + error);
        }

        EGL10 mEgl;