render: remove buffer primaries from pass options

colorspace conversion is now carried explicitely by setting a
wlr_color_transform_matrix in the color transform
This commit is contained in:
Félix Poisot 2025-11-12 13:45:14 +00:00 committed by Simon Ser
parent fdb473e675
commit 3d3d5fb1b7
5 changed files with 29 additions and 29 deletions

View file

@ -257,13 +257,22 @@ static struct wlr_buffer *render_cursor_buffer(struct wlr_output_cursor *cursor)
buffer->width, buffer->height);
struct wlr_buffer_pass_options options = {0};
struct wlr_color_primaries primaries_value;
if (output->image_description != NULL) {
options.color_transform = wlr_color_transform_init_linear_to_inverse_eotf(
output->image_description->transfer_function);
wlr_color_primaries_from_named(&primaries_value,
output->image_description->primaries);
options.primaries = &primaries_value;
struct wlr_color_primaries primaries_srgb;
wlr_color_primaries_from_named(&primaries_srgb, WLR_COLOR_NAMED_PRIMARIES_SRGB);
struct wlr_color_primaries primaries;
wlr_color_primaries_from_named(&primaries, output->image_description->primaries);
float matrix[9];
wlr_color_primaries_transform_absolute_colorimetric(&primaries_srgb, &primaries, matrix);
struct wlr_color_transform *transforms[] = {
wlr_color_transform_init_matrix(matrix),
wlr_color_transform_init_linear_to_inverse_eotf(
output->image_description->transfer_function),
};
size_t transform_count = sizeof(transforms) / sizeof(transforms[0]);
options.color_transform = wlr_color_transform_init_pipeline(transforms, transform_count);
wlr_color_transform_unref(transforms[0]);
wlr_color_transform_unref(transforms[1]);
}
struct wlr_render_pass *pass = wlr_renderer_begin_buffer_pass(renderer, buffer, &options);
wlr_color_transform_unref(options.color_transform);

View file

@ -2385,13 +2385,22 @@ bool wlr_scene_output_build_state(struct wlr_scene_output *scene_output,
}
struct wlr_color_transform *color_transform = NULL;
const struct wlr_color_primaries *primaries = NULL;
struct wlr_color_primaries primaries_value;
const struct wlr_output_image_description *img_desc = output_pending_image_description(output, state);
if (img_desc != NULL) {
color_transform = wlr_color_transform_init_linear_to_inverse_eotf(img_desc->transfer_function);
wlr_color_primaries_from_named(&primaries_value, img_desc->primaries);
primaries = &primaries_value;
struct wlr_color_primaries primaries_srgb;
wlr_color_primaries_from_named(&primaries_srgb, WLR_COLOR_NAMED_PRIMARIES_SRGB);
struct wlr_color_primaries primaries;
wlr_color_primaries_from_named(&primaries, img_desc->primaries);
float matrix[9];
wlr_color_primaries_transform_absolute_colorimetric(&primaries_srgb, &primaries, matrix);
struct wlr_color_transform *transforms[] = {
wlr_color_transform_init_matrix(matrix),
wlr_color_transform_init_linear_to_inverse_eotf(img_desc->transfer_function),
};
size_t transform_count = sizeof(transforms) / sizeof(transforms[0]);
color_transform = wlr_color_transform_init_pipeline(transforms, transform_count);
wlr_color_transform_unref(transforms[0]);
wlr_color_transform_unref(transforms[1]);
}
if (options->color_transform != NULL) {
assert(color_transform == NULL);
@ -2414,7 +2423,6 @@ bool wlr_scene_output_build_state(struct wlr_scene_output *scene_output,
&(struct wlr_buffer_pass_options){
.timer = timer ? timer->render_timer : NULL,
.color_transform = color_transform,
.primaries = primaries,
.signal_timeline = scene_output->in_timeline,
.signal_point = scene_output->in_point,
});