[Mesa-dev] [PATCH] egl/wayland: do not leak wl_buffer when it is locked
daniel at fooishbar.org
Wed Aug 8 16:49:00 UTC 2018
On Wed, 8 Aug 2018 at 17:40, Juan A. Suarez Romero <jasuarez at igalia.com> wrote:
> On Wed, 2018-08-08 at 17:21 +0100, Daniel Stone wrote:
> > On Thu, 2 Aug 2018 at 10:02, Juan A. Suarez Romero <jasuarez at igalia.com> wrote:
> > > If color buffer is locked, do not set its wayland buffer to NULL;
> > > otherwise it can not be freed later.
> > It can: see the 'if (i == ARRAY_SIZE(...))' branch inside wl_buffer_release.
> I think I didn't explain wrongly :)
> If color buffer is locked, we set color_buffer.wl_buffer to NULL, and thus we
> can't free wl_buffer later.
If a surface is resized, we will orphan all its wl_buffers by clearing
their pointers to NULL, hence losing the ability to directly free
them. But when a new buffer has been attached and displayed, a
'release' event will be delivered for the old buffer (handled by
wl_buffer_release as an event listener), which will detect that the
wl_buffer is not in the list and should be immediately destroyed.
In fact, I have to rescind my R-b since I'm pretty sure this breaks resizing:
- buffer 1 is allocated with original size, committed to server
(locked == true)
- user resizes surface, release_buffers() is called but leaves
wl_buffer intact in color_buffers list
- buffers 2..4 are allocated with new size and committed to server
(locked == true)
- release event for buffer 1 is delivered, locked = false
- get_back_bo() finds buffer 1 has a wl_buffer and is not locked,
but dri_image is NULL so a new image is created
- swap_buffers_with_damage() finds buffer 1 (with new DRIimage)
still has wl_buffer (old) and attaches that buffer
So we need to either find a way to still destroy the wl_buffer inside
wl_buffer_release(), or at least do it later, e.g. in get_back_bo().
More information about the mesa-dev