From 6179a24741af62e4786ff012657ca04da150b258 Mon Sep 17 00:00:00 2001 From: Dudemanguy Date: Tue, 30 Sep 2025 17:03:59 -0500 Subject: [PATCH] vo_dmabuf_wayland: actually reuse OSD buffers c958990833f86747ffe290950495921bf4c73218 was supposed to implement this, but it got forgotten and the placeholder code which just created/destroyed every buffer for every frame was left. Oops. Finally fix this a couple of years later. Fixes #16863. --- video/out/vo_dmabuf_wayland.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/video/out/vo_dmabuf_wayland.c b/video/out/vo_dmabuf_wayland.c index 19144a77fb..7622bb8056 100644 --- a/video/out/vo_dmabuf_wayland.c +++ b/video/out/vo_dmabuf_wayland.c @@ -73,6 +73,7 @@ struct osd_buffer { struct wl_list link; struct mp_image image; size_t size; + bool attached; }; struct priv { @@ -125,12 +126,7 @@ static const struct wl_buffer_listener buffer_listener = { static void osd_buffer_handle_release(void *data, struct wl_buffer *wl_buffer) { struct osd_buffer *osd_buf = data; - wl_list_remove(&osd_buf->link); - if (osd_buf->buffer) { - wl_buffer_destroy(osd_buf->buffer); - osd_buf->buffer = NULL; - } - talloc_free(osd_buf); + osd_buf->attached = false; } static const struct wl_buffer_listener osd_buffer_listener = { @@ -416,7 +412,8 @@ static struct osd_buffer *osd_buffer_check(struct vo *vo) struct priv *p = vo->priv; struct osd_buffer *osd_buf; wl_list_for_each(osd_buf, &p->osd_buffer_list, link) { - return osd_buf; + if (!osd_buf->attached) + return osd_buf; } return NULL; } @@ -644,6 +641,7 @@ static bool draw_frame(struct vo *vo, struct vo_frame *frame) wl_surface_attach(wl->osd_surface, osd_buf->buffer, 0, 0); wl_surface_damage_buffer(wl->osd_surface, 0, 0, osd_buf->image.w, osd_buf->image.h); + osd_buf->attached = true; p->osd_surface_is_mapped = true; } else if (!p->osd_surface_has_contents && p->osd_surface_is_mapped) { wl_surface_attach(wl->osd_surface, NULL, 0, 0);