From dac6836b938410694e53294ea3df3c1550b95ae8 Mon Sep 17 00:00:00 2001 From: Kenny Levinsen Date: Sun, 22 Mar 2026 13:45:17 +0100 Subject: [PATCH] cmm: Make log_100 and log_316 TFs symmetric log_100 and log_316 has the treshold implemented in the inverse EOTF, but missing from the EOTF. This causes black from a client buffer to be elevated to 0.01 and 0.00316 respectively, which can be seen in wl-colortest as having the black brightness tile become grey as you switch through the TFs. Add the threshold to the EOTF so that 0 means black. --- src/gfx_apis/vulkan/shaders/eotfs.glsl | 12 ++++++++++-- src/gfx_apis/vulkan/shaders_bin/out.frag.spv | Bin 13876 -> 13996 bytes src/gfx_apis/vulkan/shaders_bin/tex.frag.spv | Bin 15032 -> 15152 bytes src/gfx_apis/vulkan/shaders_hash.txt | 2 +- src/theme.rs | 12 ++++++++++-- 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/gfx_apis/vulkan/shaders/eotfs.glsl b/src/gfx_apis/vulkan/shaders/eotfs.glsl index 139f7a974..d20266925 100644 --- a/src/gfx_apis/vulkan/shaders/eotfs.glsl +++ b/src/gfx_apis/vulkan/shaders/eotfs.glsl @@ -67,7 +67,11 @@ vec3 inv_eotf_st240(vec3 c) { } vec3 eotf_log100(vec3 c) { - return pow(vec3(10), vec3(2.0) * (c - vec3(1.0))); + return mix( + vec3(0.0), + pow(vec3(10), vec3(2.0) * (c - vec3(1.0))), + greaterThan(c, vec3(0.0)) + ); } vec3 inv_eotf_log100(vec3 c) { @@ -80,7 +84,11 @@ vec3 inv_eotf_log100(vec3 c) { } vec3 eotf_log316(vec3 c) { - return pow(vec3(10), vec3(2.5) * (c - vec3(1.0))); + return mix( + vec3(0.0), + pow(vec3(10), vec3(2.5) * (c - vec3(1.0))), + greaterThan(c, vec3(0.0)) + ); } vec3 inv_eotf_log316(vec3 c) { diff --git a/src/gfx_apis/vulkan/shaders_bin/out.frag.spv b/src/gfx_apis/vulkan/shaders_bin/out.frag.spv index 8490503a6db1828b3660761511d86838dbef4a2b..306bc4546e318e9efd852cf83858e31d8ad97c8b 100644 GIT binary patch literal 13996 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 ImuK_e08VEyjsO4v diff --git a/src/gfx_apis/vulkan/shaders_bin/tex.frag.spv b/src/gfx_apis/vulkan/shaders_bin/tex.frag.spv index c013804da8ef803ac8f027a6b4c39a2f0f6353a0..b11abc292ec9f165eaeeae7e9eb5f629b0926451 100644 GIT binary patch literal 15152 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 jG&!x$kkq(t`RwrC^|>a`TC{ f32 { - 10.0.powf(2.0 * (c - 1.0)) + if c <= 0.0 { + 0.0 + } else { + 10.0.powf(2.0 * (c - 1.0)) + } } fn log316(c: f32) -> f32 { - 10.0.powf(2.5 * (c - 1.0)) + if c <= 0.0 { + 0.0 + } else { + 10.0.powf(2.5 * (c - 1.0)) + } } fn st428(c: f32) -> f32 { c.powf(2.6) * 52.37 / 48.0