scene: add support for TF/primaries direct scanout

This commit is contained in:
Simon Ser 2025-03-08 14:32:09 +01:00
parent 0c272a3842
commit 5b5380cce6

View file

@ -1961,13 +1961,25 @@ static enum scene_direct_scanout_result scene_entry_try_direct_scanout(
.height = default_height, .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) { if (buffer->transform != data->transform) {
return SCANOUT_INELIGIBLE; return SCANOUT_INELIGIBLE;
} }
if (buffer->transfer_function != 0 && buffer->transfer_function != WLR_COLOR_TRANSFER_FUNCTION_SRGB) { if ((tf == 0) != (primaries == 0)) {
return false; 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; return false;
} }
@ -2012,6 +2024,14 @@ static enum scene_direct_scanout_result scene_entry_try_direct_scanout(
if (buffer->wait_timeline != NULL) { if (buffer->wait_timeline != NULL) {
wlr_output_state_set_wait_timeline(&pending, buffer->wait_timeline, buffer->wait_point); 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)) { if (!wlr_output_test_state(scene_output->output, &pending)) {
wlr_output_state_finish(&pending); wlr_output_state_finish(&pending);
return SCANOUT_CANDIDATE; return SCANOUT_CANDIDATE;