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

Commit df34b49f authored by Lloyd Pique's avatar Lloyd Pique
Browse files

camera2/legacy: Fix expected errors on eglSwapBuffers

SurfaceTextureRenderer::swapBuffers interpreted EGL_BAD_SURFACE as
indicating an abandanoned buffer queue. But the EGL 1.4 lists additional
errors that also indicate extreme failure: EGL_CONTEXT_LOST, and
EGL_BAD_NATIVE_WINDOW.

Discovered while debugging CTS test
android.hardware.camera2.cts.RobustnessTest#testAbandonRepeatingRequestSurface
on ARC++ x86 boards.

Test: cts-tradefed/android.hardware.camera2.cts.RobustnessTest#testAbandonRepeatingRequestSurface
Bug: 64496778
Bug: 36063477
Change-Id: I782f2c923aa5ff2442bbcf3dfb09861e129a2872
(cherry picked from commit 3511f99cf986a9fe7a67a8aee301e05f1be07f62)
parent 0b2f7503
Loading
Loading
Loading
Loading
+24 −6
Original line number Diff line number Diff line
@@ -529,14 +529,32 @@ public class SurfaceTextureRenderer {
    private boolean swapBuffers(EGLSurface surface)
            throws LegacyExceptionUtils.BufferQueueAbandonedException {
        boolean result = EGL14.eglSwapBuffers(mEGLDisplay, surface);

        int error = EGL14.eglGetError();
        if (error == EGL14.EGL_BAD_SURFACE) {
        switch (error) {
            case EGL14.EGL_SUCCESS:
                return result;

            // Check for an abandoned buffer queue, or other error conditions out
            // of the user's control.
            //
            // From the EGL 1.4 spec (2013-12-04), Section 3.9.4 Posting Errors:
            //
            //   If eglSwapBuffers is called and the native window associated with
            //   surface is no longer valid, an EGL_BAD_NATIVE_WINDOW error is
            //   generated.
            //
            // We also interpret EGL_BAD_SURFACE as indicating an abandoned
            // surface, even though the EGL spec does not document it as such, for
            // backwards compatibility with older versions of this file.
            case EGL14.EGL_BAD_NATIVE_WINDOW:
            case EGL14.EGL_BAD_SURFACE:
                throw new LegacyExceptionUtils.BufferQueueAbandonedException();
        } else if (error != EGL14.EGL_SUCCESS) {
            throw new IllegalStateException("swapBuffers: EGL error: 0x" +
                    Integer.toHexString(error));

            default:
                throw new IllegalStateException(
                        "swapBuffers: EGL error: 0x" + Integer.toHexString(error));
        }
        return result;
    }

    private void checkEglError(String msg) {