From 3d3d5fb1b7fbf7d3cdfcd597d8b21ea02eee962e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Poisot?= Date: Wed, 12 Nov 2025 13:45:14 +0000 Subject: [PATCH] render: remove buffer primaries from pass options colorspace conversion is now carried explicitely by setting a wlr_color_transform_matrix in the color transform --- include/render/vulkan.h | 3 --- include/wlr/render/pass.h | 2 -- render/vulkan/pass.c | 12 ------------ types/output/cursor.c | 21 +++++++++++++++------ types/scene/wlr_scene.c | 20 ++++++++++++++------ 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/include/render/vulkan.h b/include/render/vulkan.h index bbb0495a6..ac0af65fb 100644 --- a/include/render/vulkan.h +++ b/include/render/vulkan.h @@ -430,9 +430,6 @@ struct wlr_vk_render_pass { bool two_pass; // rendering via intermediate blending buffer struct wlr_color_transform *color_transform; - bool has_primaries; - struct wlr_color_primaries primaries; - struct wlr_drm_syncobj_timeline *signal_timeline; uint64_t signal_point; diff --git a/include/wlr/render/pass.h b/include/wlr/render/pass.h index 9cce7c0a8..1ef888f46 100644 --- a/include/wlr/render/pass.h +++ b/include/wlr/render/pass.h @@ -35,8 +35,6 @@ struct wlr_buffer_pass_options { * Leave NULL to indicate the default transform (Gamma 2.2 encoding for * sRGB monitors) */ struct wlr_color_transform *color_transform; - /** Primaries describing the color volume of the destination buffer */ - const struct wlr_color_primaries *primaries; /* Signal a timeline synchronization point when the render pass completes. * diff --git a/render/vulkan/pass.c b/render/vulkan/pass.c index 4c745ffae..db7a659d6 100644 --- a/render/vulkan/pass.c +++ b/render/vulkan/pass.c @@ -253,14 +253,6 @@ static bool render_pass_submit(struct wlr_render_pass *wlr_pass) { .lut_3d_scale = (float)(dim - 1) / dim, }; - if (pass->has_primaries) { - // overwrite matrix from color_tranform, if any - struct wlr_color_primaries srgb; - wlr_color_primaries_from_named(&srgb, WLR_COLOR_NAMED_PRIMARIES_SRGB); - - wlr_color_primaries_transform_absolute_colorimetric(&srgb, &pass->primaries, matrix); - } - encode_color_matrix(matrix, frag_pcr_data.matrix); VkPipeline pipeline = VK_NULL_HANDLE; @@ -1284,10 +1276,6 @@ struct wlr_vk_render_pass *vulkan_begin_render_pass(struct wlr_vk_renderer *rend pass->signal_timeline = wlr_drm_syncobj_timeline_ref(options->signal_timeline); pass->signal_point = options->signal_point; } - if (options != NULL && options->primaries != NULL) { - pass->has_primaries = true; - pass->primaries = *options->primaries; - } rect_union_init(&pass->updated_region); diff --git a/types/output/cursor.c b/types/output/cursor.c index a24f4abd1..1b33eb335 100644 --- a/types/output/cursor.c +++ b/types/output/cursor.c @@ -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); diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c index 447b5b162..ce6348dc2 100644 --- a/types/scene/wlr_scene.c +++ b/types/scene/wlr_scene.c @@ -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, });