From fe84bfc8d92c07c5c58c2b90e9884d74caa7bdb8 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Fri, 14 Jul 2023 15:16:12 +0200 Subject: [PATCH] scene: add wlr_scene_output_sample_event This contains the output and a bool indicating direct scan-out. --- include/wlr/types/wlr_scene.h | 7 ++++++- types/scene/surface.c | 3 ++- types/scene/wlr_scene.c | 12 ++++++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/include/wlr/types/wlr_scene.h b/include/wlr/types/wlr_scene.h index b00f33b4..2dd9401f 100644 --- a/include/wlr/types/wlr_scene.h +++ b/include/wlr/types/wlr_scene.h @@ -140,6 +140,11 @@ struct wlr_scene_outputs_update_event { size_t size; }; +struct wlr_scene_output_sample_event { + struct wlr_scene_output *output; + bool direct_scanout; +}; + /** A scene-graph node displaying a buffer */ struct wlr_scene_buffer { struct wlr_scene_node node; @@ -151,7 +156,7 @@ struct wlr_scene_buffer { struct wl_signal outputs_update; // struct wlr_scene_outputs_update_event struct wl_signal output_enter; // struct wlr_scene_output struct wl_signal output_leave; // struct wlr_scene_output - struct wl_signal output_sample; // struct wlr_scene_output + struct wl_signal output_sample; // struct wlr_scene_output_sample_event struct wl_signal frame_done; // struct timespec } events; diff --git a/types/scene/surface.c b/types/scene/surface.c index c4b9c39b..afefb917 100644 --- a/types/scene/surface.c +++ b/types/scene/surface.c @@ -40,7 +40,8 @@ static void handle_scene_buffer_output_sample( struct wl_listener *listener, void *data) { struct wlr_scene_surface *surface = wl_container_of(listener, surface, output_sample); - struct wlr_scene_output *scene_output = data; + const struct wlr_scene_output_sample_event *event = data; + struct wlr_scene_output *scene_output = event->output; if (surface->buffer->primary_output == scene_output) { struct wlr_scene *root = scene_node_get_root(&surface->buffer->node); diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c index cc67bc3e..90d76c16 100644 --- a/types/scene/wlr_scene.c +++ b/types/scene/wlr_scene.c @@ -1171,7 +1171,11 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren WLR_RENDER_BLEND_MODE_PREMULTIPLIED : WLR_RENDER_BLEND_MODE_NONE, }); - wl_signal_emit_mutable(&scene_buffer->events.output_sample, data->output); + struct wlr_scene_output_sample_event sample_event = { + .output = data->output, + .direct_scanout = false, + }; + wl_signal_emit_mutable(&scene_buffer->events.output_sample, &sample_event); break; } @@ -1572,7 +1576,11 @@ static bool scene_entry_try_direct_scanout(struct render_list_entry *entry, wlr_output_state_copy(state, &pending); wlr_output_state_finish(&pending); - wl_signal_emit_mutable(&buffer->events.output_sample, scene_output); + struct wlr_scene_output_sample_event sample_event = { + .output = scene_output, + .direct_scanout = true, + }; + wl_signal_emit_mutable(&buffer->events.output_sample, &sample_event); return true; }