summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChad Versace <[email protected]>2017-05-03 13:26:28 -0700
committerChad Versace <[email protected]>2017-05-03 16:46:01 -0700
commit58bfeb4ef25512ef89487bb97de0960711ba7bad (patch)
treee69ffd8dd1fe399543a6fd28e59fe3d99c18984b /src
parent9c2b74ba2a508d2833f288f9974cba02dfaecbec (diff)
egl/android: Cancel any outstanding ANativeBuffer in surface destructor
That is, call ANativeWindow::cancelBuffer in droid_destroy_surface(). This should prevent application deadlock when the app destroys the EGLSurface after EGL has acquired a buffer from SurfaceFlinger (ANativeWindow::dequeueBuffer) but before EGL has released it (ANativeWindow::enqueueBuffer). This patch is part of a series for fixing android.hardware.camera2.cts.RobustnessTest#testAbandonRepeatingRequestSurface on Chrome OS x86 devices. Cc: Tomasz Figa <[email protected]> Cc: Nicolas Boichat <[email protected]> Cc: Tapani Pälli <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/egl/drivers/dri2/platform_android.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c
index 35f2e5dbe63..f45fcdf4ff7 100644
--- a/src/egl/drivers/dri2/platform_android.c
+++ b/src/egl/drivers/dri2/platform_android.c
@@ -264,10 +264,15 @@ droid_window_enqueue_buffer(_EGLDisplay *disp, struct dri2_egl_surface *dri2_sur
}
static void
-droid_window_cancel_buffer(_EGLDisplay *disp, struct dri2_egl_surface *dri2_surf)
+droid_window_cancel_buffer(struct dri2_egl_surface *dri2_surf)
{
- /* no cancel buffer? */
- droid_window_enqueue_buffer(disp, dri2_surf);
+ int ret;
+
+ ret = dri2_surf->window->cancelBuffer(dri2_surf->window, dri2_surf->buffer, -1);
+ if (ret < 0) {
+ _eglLog(_EGL_WARNING, "ANativeWindow::cancelBuffer failed");
+ dri2_surf->base.Lost = true;
+ }
}
static __DRIbuffer *
@@ -399,7 +404,7 @@ droid_destroy_surface(_EGLDriver *drv, _EGLDisplay *disp, _EGLSurface *surf)
if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
if (dri2_surf->buffer)
- droid_window_cancel_buffer(disp, dri2_surf);
+ droid_window_cancel_buffer(dri2_surf);
dri2_surf->window->common.decRef(&dri2_surf->window->common);
}