From 58bfeb4ef25512ef89487bb97de0960711ba7bad Mon Sep 17 00:00:00 2001 From: Chad Versace Date: Wed, 3 May 2017 13:26:28 -0700 Subject: egl/android: Cancel any outstanding ANativeBuffer in surface destructor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Cc: Nicolas Boichat Cc: Tapani Pälli --- src/egl/drivers/dri2/platform_android.c | 13 +++++++++---- 1 file 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); } -- cgit v1.2.3