What happens: Any scene using ClusteredLightContainer renders fine on Chrome/Edge WebGPU but fails shader validation on Firefox WebGPU (tested Firefox stable, Windows, 2026-08). Every clustered-consuming material’s fragment pipeline is invalid (~35 failures in our scene), and one invalid pipeline clear-colors every frame it touches — Firefox users get a blank viewport while Chromium users see nothing wrong.
Root cause: The clustered lighting WGSL passes a storage-buffer pointer as a user-function parameter (e.g. tileMaskBuffer: ptr<storage, array<u32>>). That’s only legal under the optional WGSL language extension unrestricted_pointer_parameters — Chrome’s Tint implements it, but Firefox’s naga does not yet (it’s absent from navigator.gpu.wgslLanguageFeatures on Firefox). So the same source is valid on one browser’s compiler and a hard validation error on the other. Babylon’s CI/testing on Chromium won’t catch it.
Versions: reproduced on Babylon 9.17–9.19.
Live A/B repro: naga clustered A/B — a minimal ClusteredLightContainer scene; unpatched it reproduces the validation failure on Firefox WebGPU (dom.webgpu.enabled), with our workaround applied it renders lit.
Suggested fix: rewrite the clustered chunks so the storage access happens from module scope (core WGSL) instead of flowing through pointer parameters — per-call-site specialization works since declaration order is irrelevant. We ship exactly that as a client-side final-source transform at createShaderModule (feature-gated: it never installs where unrestricted_pointer_parameters exists, so Chromium output stays byte-identical), and it restores Firefox rendering with no measurable runtime cost. Happy to share the transform / open a PR against the chunk source if useful.