summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChad Versace <[email protected]>2017-05-04 17:46:34 -0700
committerChad Versace <[email protected]>2017-05-04 17:46:34 -0700
commite5eace586848511f4ceaffaa2d45131c31c45ae0 (patch)
tree2fb998663127e6982aa09ac7d4f4edd308a45535
parent0212db350407e1331ff23f04136684cf2b7396cf (diff)
egl/android: Mark surface as lost when dequeueBuffer fails
This ensures that future calls to eglSwapBuffers and eglMakeCurrent emit an error. This patch is part of a series for fixing android.hardware.camera2.cts.RobustnessTest#testAbandonRepeatingRequestSurface on Chrome OS x86 devices. Cc: [email protected] Cc: Tomasz Figa <[email protected]> Cc: Tapani Pälli <[email protected]> Reviewed-by: Nicolas Boichat <[email protected]> Reviewed-by: Emil Velikov <[email protected]>
-rw-r--r--src/egl/drivers/dri2/platform_android.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c
index f45fcdf4ff7..2450d9de476 100644
--- a/src/egl/drivers/dri2/platform_android.c
+++ b/src/egl/drivers/dri2/platform_android.c
@@ -431,12 +431,16 @@ droid_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
static int
update_buffers(struct dri2_egl_surface *dri2_surf)
{
+ if (dri2_surf->base.Lost)
+ return -1;
+
if (dri2_surf->base.Type != EGL_WINDOW_BIT)
return 0;
/* try to dequeue the next back buffer */
if (!dri2_surf->buffer && !droid_window_dequeue_buffer(dri2_surf)) {
_eglLog(_EGL_WARNING, "Could not dequeue buffer from native window");
+ dri2_surf->base.Lost = true;
return -1;
}
@@ -628,6 +632,12 @@ droid_swap_buffers(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *draw)
dri2_flush_drawable_for_swapbuffers(disp, draw);
+ /* dri2_surf->buffer can be null even when no error has occured. For
+ * example, if the user has called no GL rendering commands since the
+ * previous eglSwapBuffers, then the driver may have not triggered
+ * a callback to ANativeWindow::dequeueBuffer, in which case
+ * dri2_surf->buffer remains null.
+ */
if (dri2_surf->buffer)
droid_window_enqueue_buffer(disp, dri2_surf);