From f88d0d0a8ddc9ae0feea24af8082381b6423a8fd Mon Sep 17 00:00:00 2001 From: arnav-hiwarkar Date: Thu, 12 Nov 2026 16:37:09 +0530 Subject: [PATCH] #3487, #3488, #3489, #3490, #3491: Levels (Individual Controls): skip the overflowing pow with a branch WGSL's select evaluates both of its arguments, so the previous commit still ran the overflowing pow and only discarded it. An explicit branch now skips the power for a curve past the bound. --- crates/gpu/src/shaders/fx_tone.wgsl | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/gpu/src/shaders/fx_tone.wgsl b/crates/gpu/src/shaders/fx_tone.wgsl index a47d5df59..9472d63f0 100644 --- a/crates/gpu/src/shaders/fx_tone.wgsl +++ b/crates/gpu/src/shaders/fx_tone.wgsl @@ -43,9 +43,12 @@ fn fxt_lv(i: u32, v: f32, clip_b: bool, clip_w: bool) -> f32 { // color2::LEVELS_IC_CURVE_LIMIT keeps the curve finite. WGSL leaves an overflowing pow // indeterminate, so a curve past the bound saturates before pow: |t|^(1/g) > 1e30 once // log2|t| / g > 99.66; between 1e30 and 2^99.7 the clamp gives the same 1e30. + // A branch, not select: select evaluates both sides, so pow would still run. let g = max(data[o + 2u], 0.01); - let saturate = abs(t) > 1.0 && log2(abs(t)) / g > 99.7; - let curve = select(clamp(fxt_gamma(t, g), -1e30, 1e30), sign(t) * 1e30, saturate); + var curve = sign(t) * 1e30; + if (!(abs(t) > 1.0 && log2(abs(t)) / g > 99.7)) { + curve = clamp(fxt_gamma(t, g), -1e30, 1e30); + } return data[o + 3u] + (data[o + 4u] - data[o + 3u]) * curve; }