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:
1 parent
05656cdae7
commit
6179a24741
1 file changed
+5
-7
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user