From 35b900310b244639108b06d25c1b39aed057d24c Mon Sep 17 00:00:00 2001 From: Lepton Wu Date: Tue, 17 Sep 2019 13:49:17 -0700 Subject: egl/android: Remove our own reference to buffers. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We currently doesn't maintain it correctly and the buffer gets leaked if surface is destroyed before calling swapping buffers. From Android frameworks/native/libs/nativewindow/include/system/window.h: The window holds a reference to the buffer between dequeueBuffer and either queueBuffer or cancelBuffer, so clients only need their own reference if they might use the buffer after queueing or canceling it. v2: Remove our own reference. Fixes: 0212db35040 ("egl/android: Cancel any outstanding ANativeBuffer in surface destructor") Reviewed-by: Chia-I Wu (v1) Reviewed-By: Tapani Pälli Signed-off-by: Lepton Wu (cherry picked from commit f4ba31ff504489b7195c83fa8703ba091406d808) --- src/egl/drivers/dri2/platform_android.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/egl') diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index dda38d67265..ec79c4a1147 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -231,8 +231,6 @@ droid_window_dequeue_buffer(struct dri2_egl_surface *dri2_surf) close(fence_fd); } - dri2_surf->buffer->common.incRef(&dri2_surf->buffer->common); - /* Record all the buffers created by ANativeWindow and update back buffer * for updating buffer's age in swap_buffers. */ @@ -289,7 +287,6 @@ droid_window_enqueue_buffer(_EGLDisplay *disp, struct dri2_egl_surface *dri2_sur dri2_surf->window->queueBuffer(dri2_surf->window, dri2_surf->buffer, fence_fd); - dri2_surf->buffer->common.decRef(&dri2_surf->buffer->common); dri2_surf->buffer = NULL; dri2_surf->back = NULL; @@ -312,6 +309,7 @@ droid_window_cancel_buffer(struct dri2_egl_surface *dri2_surf) dri2_surf->out_fence_fd = -1; ret = dri2_surf->window->cancelBuffer(dri2_surf->window, dri2_surf->buffer, fence_fd); + dri2_surf->buffer = NULL; if (ret < 0) { _eglLog(_EGL_WARNING, "ANativeWindow::cancelBuffer failed"); dri2_surf->base.Lost = EGL_TRUE; -- cgit v1.2.3