summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan A. Suarez Romero <jasuarez@igalia.com>2018-08-30 10:14:49 +0200
committerAndres Gomez <agomez@igalia.com>2018-09-04 23:39:10 +0300
commit552aaefff28ceb38716e6ba7ee97feb1d801dd4c (patch)
treeee7fc110f3339e6c9aaf358e704a82db2e3f1d35
parent7e0efcec63d6f41d0c8f59a9e09f373de1ffe725 (diff)
egl/wayland: do not leak wl_buffer when it is locked
If color buffer is locked, do not set its wayland buffer to NULL; otherwise it can not be freed later. Rather, flag it in order to destroy it later on the release event. v2: instruct release event to unlock only or free wl_buffer too (Daniel) This also fixes dEQP-EGL.functional.swap_buffers_with_damage.* tests. CC: Daniel Stone <daniel@fooishbar.org> Reviewed-by: Daniel Stone <daniels@collabora.com> (cherry picked from commit 54a9622dd5fdee7d18c05d968c97c4dd4fa9c83c)
-rw-r--r--src/egl/drivers/dri2/egl_dri2.h1
-rw-r--r--src/egl/drivers/dri2/platform_wayland.c22
2 files changed, 16 insertions, 7 deletions
diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h
index f8001ec4b66..93b06a0bc14 100644
--- a/src/egl/drivers/dri2/egl_dri2.h
+++ b/src/egl/drivers/dri2/egl_dri2.h
@@ -290,6 +290,7 @@ struct dri2_egl_surface
struct {
#ifdef HAVE_WAYLAND_PLATFORM
struct wl_buffer *wl_buffer;
+ bool wl_release;
__DRIimage *dri_image;
/* for is_different_gpu case. NULL else */
__DRIimage *linear_copy;
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index 83df0a8776b..cda6f25a7e0 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -182,9 +182,12 @@ wl_buffer_release(void *data, struct wl_buffer *buffer)
if (dri2_surf->color_buffers[i].wl_buffer == buffer)
break;
- if (i == ARRAY_SIZE(dri2_surf->color_buffers)) {
+ assert (i < ARRAY_SIZE(dri2_surf->color_buffers));
+
+ if (dri2_surf->color_buffers[i].wl_release) {
wl_buffer_destroy(buffer);
- return;
+ dri2_surf->color_buffers[i].wl_release = false;
+ dri2_surf->color_buffers[i].wl_buffer = NULL;
}
dri2_surf->color_buffers[i].locked = false;
@@ -425,9 +428,14 @@ dri2_wl_release_buffers(struct dri2_egl_surface *dri2_surf)
dri2_egl_display(dri2_surf->base.Resource.Display);
for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
- if (dri2_surf->color_buffers[i].wl_buffer &&
- !dri2_surf->color_buffers[i].locked)
- wl_buffer_destroy(dri2_surf->color_buffers[i].wl_buffer);
+ if (dri2_surf->color_buffers[i].wl_buffer) {
+ if (dri2_surf->color_buffers[i].locked) {
+ dri2_surf->color_buffers[i].wl_release = true;
+ } else {
+ wl_buffer_destroy(dri2_surf->color_buffers[i].wl_buffer);
+ dri2_surf->color_buffers[i].wl_buffer = NULL;
+ }
+ }
if (dri2_surf->color_buffers[i].dri_image)
dri2_dpy->image->destroyImage(dri2_surf->color_buffers[i].dri_image);
if (dri2_surf->color_buffers[i].linear_copy)
@@ -436,11 +444,9 @@ dri2_wl_release_buffers(struct dri2_egl_surface *dri2_surf)
munmap(dri2_surf->color_buffers[i].data,
dri2_surf->color_buffers[i].data_size);
- dri2_surf->color_buffers[i].wl_buffer = NULL;
dri2_surf->color_buffers[i].dri_image = NULL;
dri2_surf->color_buffers[i].linear_copy = NULL;
dri2_surf->color_buffers[i].data = NULL;
- dri2_surf->color_buffers[i].locked = false;
}
if (dri2_dpy->dri2)
@@ -969,6 +975,8 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
dri2_surf->current->wl_buffer =
create_wl_buffer(dri2_dpy, dri2_surf, image);
+ dri2_surf->current->wl_release = false;
+
wl_buffer_add_listener(dri2_surf->current->wl_buffer,
&wl_buffer_listener, dri2_surf);
}