Browse Source

egl/android: Remove our own reference to buffers.

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: 0212db3504 ("egl/android: Cancel any outstanding ANativeBuffer in surface destructor")

Reviewed-by: Chia-I Wu <olvaffe@gmail.com> (v1)
Reviewed-By: Tapani Pälli <tapani.palli@intel.com>
Signed-off-by: Lepton Wu <lepton@chromium.org>
tags/19.3-branchpoint
Lepton Wu 6 years ago
parent
commit
f4ba31ff50
1 changed files with 1 additions and 3 deletions
  1. 1
    3
      src/egl/drivers/dri2/platform_android.c

+ 1
- 3
src/egl/drivers/dri2/platform_android.c View File

@@ -240,8 +240,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.
*/
@@ -298,7 +296,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;

@@ -321,6 +318,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;

Loading…
Cancel
Save