Skip to content
  • Lina Versace's avatar
    egl: Partially revert 23c86c74, fix eglMakeCurrent · b6ad01c7
    Lina Versace authored and Emil Velikov's avatar Emil Velikov committed
    Fixes regressions in Android CtsVerifier.apk on Intel Chrome OS devices
    due to incorrect error handling in eglMakeCurrent. See below on how to
    confirm the regression is fixed.
    
    This partially reverts
    
        commit 23c86c74
        Author:  Chad Versace <chadversary@chromium.org>
        Subject: egl: Emit error when EGLSurface is lost
    
    The problem with commit 23c86c74 is that, once an EGLSurface became
    lost, the app could never unbind the bad surface. Each attempt to unbind
    the bad surface with eglMakeCurrent failed with EGL_BAD_CURRENT_SURFACE.
    
    Specificaly, the bad commit added the error handling below. #2 and #3
    were right, but #1 was wrong.
    
        1. eglMakeCurrent emits EGL_BAD_CURRENT_SURFACE if the calling
           thread has unflushed commands and either previous surface is no
           longer valid.
    
        2. eglMakeCurrent emits EGL_BAD_NATIVE_WINDOW if either new surface
           is no longer valid.
    
        3. eglSwapBuffers emits EGL_BAD_NATIVE_WINDOW if the swapped surface
           is no longer valid.
    
    Whe I wrote the bad commit, I misunderstood the EGL spec language
    for #1. The correct behavior is, if I understand correctly now, is
    below. This patch doesn't implement the correct behavior, though, it
    just reverts the broken behavior.
    
        - Assume a bound EGLSurface is no longer valid.
        - Assume the bound EGLContext has unflushed commands.
        - The app calls eglMakeCurrent. The spec requires eglMakeCurrent to
          implicitly flush. After flushing, eglMakeCurrent emits
          EGL_BAD_CURRENT_SURFACE and does *not* alter the thread's
          current bindings.
        - If the app calls eglMakeCurrent again, and the app inserts no
          commands into the GL command stream between the two eglMakeCurrent
          calls, then this second eglMakeCurrent succeeds without emitting an
          error.
    
    How to confirm this fixes the regression:
    
        Download android-cts-verifier-7.1_r5-linux_x86-x86.zip from
        source.android.com, unpack, and `adb install CtsVerifier.apk`.
        Run test "Projection Cube". Click the Pass button (a
        green checkmark). Then run test "Projection Widget". Confirm that
        widgets are visible and that logcat does not complain about
        eglMakeCurrent failure.
    
        Then confirm there are no regressions in the cts-traded module that
        commit 263243b1 fixed:
    
            cts-tf > run cts --skip-preconditions --skip-device-info \
                     -m CtsCameraTestCases \
                     -t android.hardware.camera2.cts.RobustnessTest
    
        Tested with Chrome OS board "reef".
    
    Fixes: 23c86c74
    
     (egl: Emit error when EGLSurface is lost)
    Acked-by: default avatarTapani Pälli <tapani.palli@intel.com>
    Cc: "17.1" <mesa-stable@lists.freedesktop.org>
    Cc: Tomasz Figa <tfiga@chromium.org>
    Cc: Nicolas Boichat <drinkcat@chromium.org>
    Cc: Emil Velikov <emil.velikov@collabora.com>
    (cherry picked from commit 8f62d21b)
    b6ad01c7