diff --git a/libweston/compositor.c b/libweston/compositor.c index b00602ccd..01138a72d 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -2848,6 +2848,9 @@ weston_buffer_from_resource(struct weston_compositor *ec, buffer->type = WESTON_BUFFER_RENDERER_OPAQUE; } + if (ec->renderer->buffer_init) + ec->renderer->buffer_init(ec, buffer); + /* Don't accept any formats we can't reason about: the importer should * make sure this never happens */ assert(buffer->pixel_format); diff --git a/libweston/libweston-internal.h b/libweston/libweston-internal.h index d46a53042..06d272695 100644 --- a/libweston/libweston-internal.h +++ b/libweston/libweston-internal.h @@ -99,6 +99,9 @@ struct weston_renderer { bool (*fill_buffer_info)(struct weston_compositor *ec, struct weston_buffer *buffer); + void (*buffer_init)(struct weston_compositor *ec, + struct weston_buffer *buffer); + enum weston_renderer_type type; const struct gl_renderer_interface *gl; const struct pixman_renderer_interface *pixman; diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 83c4df399..020fa4eb9 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -3335,25 +3335,10 @@ gl_renderer_attach_dmabuf(struct weston_surface *surface, struct gl_renderer *gr = get_renderer(surface->compositor); struct gl_surface_state *gs = get_surface_state(surface); struct gl_buffer_state *gb; - struct linux_dmabuf_buffer *dmabuf = buffer->dmabuf; GLenum target; int i; - /* Thanks to linux-dmabuf being totally independent of libweston, - * the first time a dmabuf is attached, the gl_buffer_state will - * only be set as userdata on the dmabuf, not on the weston_buffer. - * When this happens, steal it away into the weston_buffer. */ - if (!buffer->renderer_private) { - gb = linux_dmabuf_buffer_get_user_data(dmabuf); - assert(gb); - linux_dmabuf_buffer_set_user_data(dmabuf, NULL, NULL); - buffer->renderer_private = gb; - gb->destroy_listener.notify = handle_buffer_destroy; - wl_signal_add(&buffer->destroy_signal, &gb->destroy_listener); - } - assert(buffer->renderer_private); - assert(linux_dmabuf_buffer_get_user_data(dmabuf) == NULL); gb = buffer->renderer_private; gs->buffer = gb; @@ -3520,6 +3505,27 @@ out: weston_buffer_release_reference(&gs->buffer_release_ref, NULL); } +static void +gl_renderer_buffer_init(struct weston_compositor *etc, + struct weston_buffer *buffer) +{ + struct gl_buffer_state *gb; + + if (buffer->type != WESTON_BUFFER_DMABUF) + return; + + /* Thanks to linux-dmabuf being totally independent of libweston, + * the gl_buffer_state willonly be set as userdata on the dmabuf, + * not on the weston_buffer. Steal it away into the weston_buffer. */ + assert(!buffer->renderer_private); + gb = linux_dmabuf_buffer_get_user_data(buffer->dmabuf); + assert(gb); + linux_dmabuf_buffer_set_user_data(buffer->dmabuf, NULL, NULL); + buffer->renderer_private = gb; + gb->destroy_listener.notify = handle_buffer_destroy; + wl_signal_add(&buffer->destroy_signal, &gb->destroy_listener); +} + static void gl_renderer_attach(struct weston_paint_node *pnode) { @@ -4177,6 +4183,7 @@ gl_renderer_display_create(struct weston_compositor *ec, gr->base.destroy = gl_renderer_destroy; gr->base.surface_copy_content = gl_renderer_surface_copy_content; gr->base.fill_buffer_info = gl_renderer_fill_buffer_info; + gr->base.buffer_init = gl_renderer_buffer_init; gr->base.type = WESTON_RENDERER_GL; if (gl_renderer_setup_egl_display(gr, options->egl_native_display) < 0)