From 5b5380cce6be568654b9d974e0b16af333371fd1 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sat, 8 Mar 2025 14:32:09 +0100 Subject: [PATCH] scene: add support for TF/primaries direct scanout --- types/scene/wlr_scene.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c index 144329491..4069467a7 100644 --- a/types/scene/wlr_scene.c +++ b/types/scene/wlr_scene.c @@ -1961,13 +1961,25 @@ static enum scene_direct_scanout_result scene_entry_try_direct_scanout( .height = default_height, }; + enum wlr_color_named_primaries primaries = 0; + if (buffer->primaries != WLR_COLOR_NAMED_PRIMARIES_SRGB) { + primaries = buffer->primaries; + } + enum wlr_color_transfer_function tf = 0; + if (buffer->transfer_function != WLR_COLOR_TRANSFER_FUNCTION_SRGB) { + tf = buffer->transfer_function; + } + if (buffer->transform != data->transform) { return SCANOUT_INELIGIBLE; } - if (buffer->transfer_function != 0 && buffer->transfer_function != WLR_COLOR_TRANSFER_FUNCTION_SRGB) { + if ((tf == 0) != (primaries == 0)) { return false; } - if (buffer->primaries != 0 && buffer->primaries != WLR_COLOR_NAMED_PRIMARIES_SRGB) { + if (primaries != 0 && (primaries & scene_output->output->supported_primaries) == 0) { + return false; + } + if (tf != 0 && (tf & scene_output->output->supported_transfer_functions) == 0) { return false; } @@ -2012,6 +2024,14 @@ static enum scene_direct_scanout_result scene_entry_try_direct_scanout( if (buffer->wait_timeline != NULL) { wlr_output_state_set_wait_timeline(&pending, buffer->wait_timeline, buffer->wait_point); } + + if (primaries != 0 && tf != 0) { + wlr_output_state_set_image_description(&pending, &(struct wlr_output_image_description){ + .primaries = primaries, + .transfer_function = tf, + }); + } + if (!wlr_output_test_state(scene_output->output, &pending)) { wlr_output_state_finish(&pending); return SCANOUT_CANDIDATE;