This entire demo — device setup, a uniform buffer, a render pipeline with a named binding, and the per-frame draw call — is the code on the right. No manual bind group layouts.
Same per-instance math, same instance count, and — above 150,000 —
a per-fragment shader loop heavy enough to genuinely exceed vsync rather than idle inside
it (below that, both sides just idle at 60fps and "no difference" would mean nothing). Once
actually GPU-bound, both land at essentially the same fps here: a single steady-state
instanced draw call is already near-optimal on a mature WebGL2 driver, so this workload
isn't where WebGPU's real advantages (many draw calls / state changes, compute, lower driver
overhead) show up. "ms submit" is CPU time to encode + submit one frame's draw call — at low
instance counts it's small enough to brush against the browser's clamped timer resolution;
treat tiny values as "negligible," not exact. Illustrative, not a rigorous benchmark.
WebGPU via oria-webgpu
—
WebGL2 raw
—