// Algorithm: sRGB-to-linear conversion pass for scene-referred processing
// Canonical explanation: docs/book/src/reference/concepts/color-spaces.md
// CPU equivalent: crates/agx/src/adjust/mod.rs (srgb_to_linear)
// Bindings: storage pixels
// Entry points: main
// sRGB gamma to linear sRGB conversion compute shader.
#import common::color
@group(0) @binding(0) var<storage, read_write> pixels: array<f32>;
@compute @workgroup_size(256)
fn main(@builtin(global_invocation_id) id: vec3u, @builtin(num_workgroups) nwg: vec3u) {
let idx = id.x + id.y * nwg.x * 256u;
let pixel_count = arrayLength(&pixels) / 3u;
if idx >= pixel_count { return; }
let base = idx * 3u;
let rgb = vec3f(pixels[base], pixels[base + 1u], pixels[base + 2u]);
let result = common::color::srgb_to_linear(rgb);
pixels[base] = result.x;
pixels[base + 1u] = result.y;
pixels[base + 2u] = result.z;
}