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>
This commit is contained in:
@@ -297,6 +297,7 @@ struct dri2_egl_surface
|
|||||||
struct {
|
struct {
|
||||||
#ifdef HAVE_WAYLAND_PLATFORM
|
#ifdef HAVE_WAYLAND_PLATFORM
|
||||||
struct wl_buffer *wl_buffer;
|
struct wl_buffer *wl_buffer;
|
||||||
|
bool wl_release;
|
||||||
__DRIimage *dri_image;
|
__DRIimage *dri_image;
|
||||||
/* for is_different_gpu case. NULL else */
|
/* for is_different_gpu case. NULL else */
|
||||||
__DRIimage *linear_copy;
|
__DRIimage *linear_copy;
|
||||||
|
@@ -182,9 +182,12 @@ wl_buffer_release(void *data, struct wl_buffer *buffer)
|
|||||||
if (dri2_surf->color_buffers[i].wl_buffer == buffer)
|
if (dri2_surf->color_buffers[i].wl_buffer == buffer)
|
||||||
break;
|
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);
|
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;
|
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);
|
dri2_egl_display(dri2_surf->base.Resource.Display);
|
||||||
|
|
||||||
for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
|
for (int i = 0; i < ARRAY_SIZE(dri2_surf->color_buffers); i++) {
|
||||||
if (dri2_surf->color_buffers[i].wl_buffer &&
|
if (dri2_surf->color_buffers[i].wl_buffer) {
|
||||||
!dri2_surf->color_buffers[i].locked)
|
if (dri2_surf->color_buffers[i].locked) {
|
||||||
wl_buffer_destroy(dri2_surf->color_buffers[i].wl_buffer);
|
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)
|
if (dri2_surf->color_buffers[i].dri_image)
|
||||||
dri2_dpy->image->destroyImage(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)
|
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,
|
munmap(dri2_surf->color_buffers[i].data,
|
||||||
dri2_surf->color_buffers[i].data_size);
|
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].dri_image = NULL;
|
||||||
dri2_surf->color_buffers[i].linear_copy = NULL;
|
dri2_surf->color_buffers[i].linear_copy = NULL;
|
||||||
dri2_surf->color_buffers[i].data = NULL;
|
dri2_surf->color_buffers[i].data = NULL;
|
||||||
dri2_surf->color_buffers[i].locked = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dri2_dpy->dri2)
|
if (dri2_dpy->dri2)
|
||||||
@@ -968,6 +974,8 @@ dri2_wl_swap_buffers_with_damage(_EGLDriver *drv,
|
|||||||
dri2_surf->current->wl_buffer =
|
dri2_surf->current->wl_buffer =
|
||||||
create_wl_buffer(dri2_dpy, dri2_surf, image);
|
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_add_listener(dri2_surf->current->wl_buffer,
|
||||||
&wl_buffer_listener, dri2_surf);
|
&wl_buffer_listener, dri2_surf);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user