diff options
| author | 2018-04-19 16:23:44 -0700 | |
|---|---|---|
| committer | 2018-04-26 15:31:12 -0700 | |
| commit | df34b49fa2920cdc81a94b438c5abbeb9409f320 (patch) | |
| tree | 9e9d08b9838140bf50d4b8ffc40b811b153bd1a7 | |
| parent | 0b2f7503a8069086d2671418d13270caf97853ef (diff) | |
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)
| -rw-r--r-- | core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java index a05a8ec00e79..83a02285e720 100644 --- a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java +++ b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java @@ -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) { - throw new LegacyExceptionUtils.BufferQueueAbandonedException(); - } else if (error != EGL14.EGL_SUCCESS) { - throw new IllegalStateException("swapBuffers: EGL error: 0x" + - Integer.toHexString(error)); + 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(); + + default: + throw new IllegalStateException( + "swapBuffers: EGL error: 0x" + Integer.toHexString(error)); } - return result; } private void checkEglError(String msg) { |