From 7b6eec530c03e3e611d32269497416e728643897 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 27 Feb 2025 18:36:15 +0100 Subject: [PATCH] render/vulkan: add luminance multipler for output shader --- include/render/vulkan.h | 1 + render/vulkan/pass.c | 12 ++++++++++++ render/vulkan/shaders/output.frag | 3 +++ 3 files changed, 16 insertions(+) diff --git a/include/render/vulkan.h b/include/render/vulkan.h index 530fa1d27..b6bd0c2e8 100644 --- a/include/render/vulkan.h +++ b/include/render/vulkan.h @@ -339,6 +339,7 @@ struct wlr_vk_vert_pcr_data { struct wlr_vk_frag_output_pcr_data { float matrix[4][4]; // only a 3x3 subset is used + float luminance_multiplier; float lut_3d_offset; float lut_3d_scale; }; diff --git a/render/vulkan/pass.c b/render/vulkan/pass.c index 68ee78e67..ab044f6a0 100644 --- a/render/vulkan/pass.c +++ b/render/vulkan/pass.c @@ -149,6 +149,11 @@ static VkSemaphore render_pass_wait_sync_file(struct wlr_vk_render_pass *pass, return *sem_ptr; } +static float get_luminance_multiplier(const struct wlr_color_luminances *src_lum, + const struct wlr_color_luminances *dst_lum) { + return (dst_lum->reference / src_lum->reference) * (src_lum->max / dst_lum->max); +} + static bool render_pass_submit(struct wlr_render_pass *wlr_pass) { struct wlr_vk_render_pass *pass = get_render_pass(wlr_pass); struct wlr_vk_renderer *renderer = pass->renderer; @@ -197,6 +202,7 @@ static bool render_pass_submit(struct wlr_render_pass *wlr_pass) { } struct wlr_vk_frag_output_pcr_data frag_pcr_data = { + .luminance_multiplier = 1, .lut_3d_offset = 0.5f / dim, .lut_3d_scale = (float)(dim - 1) / dim, }; @@ -238,6 +244,12 @@ static bool render_pass_submit(struct wlr_render_pass *wlr_pass) { pipeline = render_buffer->plain.render_setup->output_pipe_pq; break; } + + struct wlr_color_luminances srgb_lum, dst_lum; + wlr_color_transfer_function_get_default_luminance( + WLR_COLOR_TRANSFER_FUNCTION_SRGB, &srgb_lum); + wlr_color_transfer_function_get_default_luminance(tf, &dst_lum); + frag_pcr_data.luminance_multiplier = get_luminance_multiplier(&srgb_lum, &dst_lum); } bind_pipeline(pass, pipeline); vkCmdPushConstants(render_cb->vk, renderer->output_pipe_layout, diff --git a/render/vulkan/shaders/output.frag b/render/vulkan/shaders/output.frag index 7478e249d..f2d5d645c 100644 --- a/render/vulkan/shaders/output.frag +++ b/render/vulkan/shaders/output.frag @@ -10,6 +10,7 @@ layout(location = 0) out vec4 out_color; /* struct wlr_vk_frag_output_pcr_data */ layout(push_constant, row_major) uniform UBO { layout(offset = 80) mat4 matrix; + float luminance_multiplier; float lut_3d_offset; float lut_3d_scale; } data; @@ -56,6 +57,8 @@ void main() { rgb = in_color.rgb / alpha; } + rgb *= data.luminance_multiplier; + rgb = mat3(data.matrix) * rgb; if (OUTPUT_TRANSFORM == OUTPUT_TRANSFORM_LUT_3D) {