diff options
author | Lepton Wu <[email protected]> | 2019-09-17 13:49:17 -0700 |
---|---|---|
committer | Tapani Pälli <[email protected]> | 2019-10-21 07:50:31 +0000 |
commit | f4ba31ff504489b7195c83fa8703ba091406d808 (patch) | |
tree | 28c63d3dc860e9a2f73ff4d6de2c90435362ef7b /src/egl | |
parent | b72205a4c1411881985d29a1e137a91a214f5f20 (diff) |
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: 0212db35040 ("egl/android: Cancel any outstanding ANativeBuffer in surface destructor")
Reviewed-by: Chia-I Wu <[email protected]> (v1)
Reviewed-By: Tapani Pälli <[email protected]>
Signed-off-by: Lepton Wu <[email protected]>
Diffstat (limited to 'src/egl')
-rw-r--r-- | src/egl/drivers/dri2/platform_android.c | 4 |
1 files changed, 1 insertions, 3 deletions
diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c index 35d40e567dc..6ed0b416cf8 100644 --- a/src/egl/drivers/dri2/platform_android.c +++ b/src/egl/drivers/dri2/platform_android.c @@ -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; |