From ae85c31176728d1b3944844572bf6c7c690b9698 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sat, 1 Mar 2025 12:43:08 +0100 Subject: [PATCH] render/vulkan: add luminance multiplier for texture shader --- include/render/vulkan.h | 1 + render/vulkan/pass.c | 10 ++++++++++ render/vulkan/shaders/texture.frag | 3 +++ 3 files changed, 14 insertions(+) diff --git a/include/render/vulkan.h b/include/render/vulkan.h index 1ed69d6e4..deff0eac3 100644 --- a/include/render/vulkan.h +++ b/include/render/vulkan.h @@ -343,6 +343,7 @@ struct wlr_vk_vert_pcr_data { struct wlr_vk_frag_texture_pcr_data { float matrix[4][4]; // only a 3x3 subset is used float alpha; + float luminance_multiplier; }; struct wlr_vk_frag_output_pcr_data { diff --git a/render/vulkan/pass.c b/render/vulkan/pass.c index 0ff4f52c6..4fd357113 100644 --- a/render/vulkan/pass.c +++ b/render/vulkan/pass.c @@ -849,8 +849,18 @@ static void render_pass_add_texture(struct wlr_render_pass *wlr_pass, wlr_matrix_identity(color_matrix); } + float luminance_multiplier = 1; + if (tf != WLR_COLOR_TRANSFER_FUNCTION_SRGB) { + struct wlr_color_luminances src_lum, srgb_lum; + wlr_color_transfer_function_get_default_luminance(tf, &src_lum); + wlr_color_transfer_function_get_default_luminance( + WLR_COLOR_TRANSFER_FUNCTION_SRGB, &srgb_lum); + luminance_multiplier = get_luminance_multiplier(&src_lum, &srgb_lum); + } + struct wlr_vk_frag_texture_pcr_data frag_pcr_data = { .alpha = alpha, + .luminance_multiplier = luminance_multiplier, }; encode_color_matrix(color_matrix, frag_pcr_data.matrix); diff --git a/render/vulkan/shaders/texture.frag b/render/vulkan/shaders/texture.frag index e1467023b..2a7e2c517 100644 --- a/render/vulkan/shaders/texture.frag +++ b/render/vulkan/shaders/texture.frag @@ -9,6 +9,7 @@ layout(location = 0) out vec4 out_color; layout(push_constant, row_major) uniform UBO { layout(offset = 80) mat4 matrix; float alpha; + float luminance_multiplier; } data; layout (constant_id = 0) const int TEXTURE_TRANSFORM = 0; @@ -61,6 +62,8 @@ void main() { rgb = pq_color_to_linear(rgb); } + rgb *= data.luminance_multiplier; + rgb = mat3(data.matrix) * rgb; // Back to pre-multiplied alpha