WebGL user functions on the GPU: the common shader shapes are complete
The last shape almost every real shader has now runs on the device: a user-defined helper function. The GLSL->WGSL translator emits each helper as a real WGSL function - typed parameters, a typed return, return statements - and rewrites the calls, so the 'compute a value in a helper and use it in main' idiom draws on the GPU instead of falling back. Fixing this also corrected a broader builtin bug: GLSL lets a scalar bound broadcast across a vector (clamp(color, 0.0, 1.0)), but WGSL requires every argument the same type, so the scalar is now splatted to the vector width (clamp/min/max/step/mix). With this the translator covers the common shapes of real intro and medium WebGL - attributes, varyings, matrix and vector uniforms, textures, control flow, and now helper functions - all on the real GPU and all readback-proven against the software rasteriser (the user-function triangle matches within a single level per channel). It stays an accelerator: a helper that reads a varying or attribute (stage IO, not module scope in WGSL), an unknown type, or any other shape the translator cannot express declines to the proven software path. The GPU aspect moves 49 to 50. The overall holds at 57.