vo_dmabuf_wayland: actually reuse OSD buffers

c958990833 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.
This commit is contained in:
Dudemanguy committed 2025-10-02 00:32:21 +00:00
1 parent 05656cdae7
commit 6179a24741
1 file changed
+5 -7
+5 -7
View File
@@ -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);