From 3075e6a6f9f6c60beffa912240d2a5df5cf77f25 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 14 Mar 2024 12:35:13 +0100 Subject: [PATCH] compositor: use compositor to get renderer This allows us to remove the renderer destroy listener. The listener was buggy: compositors can't destroy surface resources on their own. The wlr_compositor will always outlive the wlr_surface, so no need for a destroy listener. --- include/wlr/types/wlr_compositor.h | 3 +-- types/wlr_compositor.c | 25 +++++-------------------- 2 files changed, 6 insertions(+), 22 deletions(-) diff --git a/include/wlr/types/wlr_compositor.h b/include/wlr/types/wlr_compositor.h index 78de8388..3f57a6cb 100644 --- a/include/wlr/types/wlr_compositor.h +++ b/include/wlr/types/wlr_compositor.h @@ -121,7 +121,7 @@ struct wlr_surface_output { struct wlr_surface { struct wl_resource *resource; - struct wlr_renderer *renderer; // may be NULL + struct wlr_compositor *compositor; /** * The surface's buffer, if any. A surface has an attached buffer when it * commits with a non-null buffer in its pending state. A surface will not @@ -212,7 +212,6 @@ struct wlr_surface { // private state - struct wl_listener renderer_destroy; struct wl_listener role_resource_destroy; struct { diff --git a/types/wlr_compositor.c b/types/wlr_compositor.c index 915b95e6..3fde1dad 100644 --- a/types/wlr_compositor.c +++ b/types/wlr_compositor.c @@ -426,12 +426,12 @@ static void surface_apply_damage(struct wlr_surface *surface) { } } - if (surface->renderer == NULL) { + if (surface->compositor->renderer == NULL) { return; } struct wlr_client_buffer *buffer = wlr_client_buffer_create( - surface->current.buffer, surface->renderer); + surface->current.buffer, surface->compositor->renderer); if (buffer == NULL) { wlr_log(WLR_ERROR, "Failed to upload buffer"); @@ -736,7 +736,6 @@ static void surface_handle_resource_destroy(struct wl_resource *resource) { surface_state_destroy_cached(cached, surface); } - wl_list_remove(&surface->renderer_destroy.link); wl_list_remove(&surface->role_resource_destroy.link); wl_list_remove(&surface->pending_buffer_resource_destroy.link); @@ -752,15 +751,8 @@ static void surface_handle_resource_destroy(struct wl_resource *resource) { free(surface); } -static void surface_handle_renderer_destroy(struct wl_listener *listener, - void *data) { - struct wlr_surface *surface = - wl_container_of(listener, surface, renderer_destroy); - wl_resource_destroy(surface->resource); -} - static struct wlr_surface *surface_create(struct wl_client *client, - uint32_t version, uint32_t id, struct wlr_renderer *renderer) { + uint32_t version, uint32_t id, struct wlr_compositor *compositor) { struct wlr_surface *surface = calloc(1, sizeof(*surface)); if (!surface) { wl_client_post_no_memory(client); @@ -778,7 +770,7 @@ static struct wlr_surface *surface_create(struct wl_client *client, wlr_log(WLR_DEBUG, "New wlr_surface %p (res %p)", surface, surface->resource); - surface->renderer = renderer; + surface->compositor = compositor; surface_state_init(&surface->current, surface); surface_state_init(&surface->pending, surface); @@ -798,13 +790,6 @@ static struct wlr_surface *surface_create(struct wl_client *client, wlr_addon_set_init(&surface->addons); wl_list_init(&surface->synced); - if (renderer != NULL) { - wl_signal_add(&renderer->events.destroy, &surface->renderer_destroy); - surface->renderer_destroy.notify = surface_handle_renderer_destroy; - } else { - wl_list_init(&surface->renderer_destroy.link); - } - wl_list_init(&surface->role_resource_destroy.link); surface->pending_buffer_resource_destroy.notify = pending_buffer_resource_handle_destroy; @@ -1310,7 +1295,7 @@ static void compositor_create_surface(struct wl_client *client, struct wlr_compositor *compositor = compositor_from_resource(resource); struct wlr_surface *surface = surface_create(client, - wl_resource_get_version(resource), id, compositor->renderer); + wl_resource_get_version(resource), id, compositor); if (surface == NULL) { wl_client_post_no_memory(client); return;