summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Lloyd Pique <lpique@google.com> 2018-04-19 16:23:44 -0700
committer Lloyd Pique <lpique@google.com> 2018-04-26 15:31:12 -0700
commitdf34b49fa2920cdc81a94b438c5abbeb9409f320 (patch)
tree9e9d08b9838140bf50d4b8ffc40b811b153bd1a7
parent0b2f7503a8069086d2671418d13270caf97853ef (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.java30
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) {