From eb8acfd7b1cd0eeab75fe699e6aa0751150e80a2 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 5 Jun 2025 13:15:38 +0200 Subject: [PATCH] Stop using wlr_scene_buffer_send_frame_done() That function now takes the output as input. We don't always have the output at hand, so use the function operating on a wlr_scene_surface instead. --- sway/desktop/output.c | 19 +++++++++++++------ sway/tree/view.c | 6 +++++- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/sway/desktop/output.c b/sway/desktop/output.c index e6fe2ee4d..12dc9cc7a 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -97,11 +97,11 @@ struct buffer_timer { }; static int handle_buffer_timer(void *data) { - struct wlr_scene_buffer *buffer = data; + struct wlr_scene_surface *scene_surface = data; struct timespec now; clock_gettime(CLOCK_MONOTONIC, &now); - wlr_scene_buffer_send_frame_done(buffer, &now); + wlr_scene_surface_send_frame_done(scene_surface, &now); return 0; } @@ -114,7 +114,9 @@ static void handle_buffer_timer_destroy(struct wl_listener *listener, free(timer); } -static struct buffer_timer *buffer_timer_get_or_create(struct wlr_scene_buffer *buffer) { +static struct buffer_timer *buffer_timer_get_or_create(struct wlr_scene_surface *scene_surface) { + struct wlr_scene_buffer *buffer = scene_surface->buffer; + struct buffer_timer *timer = scene_descriptor_try_get(&buffer->node, SWAY_SCENE_DESC_BUFFER_TIMER); if (timer) { @@ -127,7 +129,7 @@ static struct buffer_timer *buffer_timer_get_or_create(struct wlr_scene_buffer * } timer->frame_done_timer = wl_event_loop_add_timer(server.wl_event_loop, - handle_buffer_timer, buffer); + handle_buffer_timer, scene_surface); if (!timer->frame_done_timer) { free(timer); return NULL; @@ -151,6 +153,11 @@ static void send_frame_done_iterator(struct wlr_scene_buffer *buffer, return; } + struct wlr_scene_surface *scene_surface = wlr_scene_surface_try_from_buffer(buffer); + if (scene_surface == NULL) { + return; + } + struct wlr_scene_node *current = &buffer->node; while (true) { struct sway_view *view = scene_descriptor_try_get(current, @@ -173,13 +180,13 @@ static void send_frame_done_iterator(struct wlr_scene_buffer *buffer, struct buffer_timer *timer = NULL; if (output->max_render_time != 0 && view_max_render_time != 0 && delay > 0) { - timer = buffer_timer_get_or_create(buffer); + timer = buffer_timer_get_or_create(scene_surface); } if (timer) { wl_event_source_timer_update(timer->frame_done_timer, delay); } else { - wlr_scene_buffer_send_frame_done(buffer, &data->when); + wlr_scene_surface_send_frame_done(scene_surface, &data->when); } } diff --git a/sway/tree/view.c b/sway/tree/view.c index 9a5cf06e0..742a66c2d 100644 --- a/sway/tree/view.c +++ b/sway/tree/view.c @@ -1242,7 +1242,11 @@ bool view_can_tear(struct sway_view *view) { static void send_frame_done_iterator(struct wlr_scene_buffer *scene_buffer, int x, int y, void *data) { struct timespec *when = data; - wl_signal_emit_mutable(&scene_buffer->events.frame_done, when); + struct wlr_scene_surface *scene_surface = wlr_scene_surface_try_from_buffer(scene_buffer); + if (scene_surface == NULL) { + return; + } + wlr_scene_surface_send_frame_done(scene_surface, when); } void view_send_frame_done(struct sway_view *view) {