v150 · WebGPU
Compute Immediates
setImmediateData() works on compute pass encoders too, not just render passes. Pass waveform parameters directly to a compute dispatch — frequency, amplitude, and shape — without allocating a uniform buffer. The compute shader writes to a storage buffer; the render pass reads it to draw the waveform.
Feature detection: checking…
Frequency
4
Amplitude
70%
Waveform
—
// ── WGSL compute shader ─────────────────────────────────────
struct Params {
frequency : f32,
amplitude : f32,
waveShape : u32, // 0=sine, 1=square, 2=sawtooth
time : f32,
}
var<immediate> p: Params; // ← immediate address space
@group(0) @binding(0) var<storage, read_write> wave: array<f32, 512>;
@compute @workgroup_size(64)
fn computeWave(@builtin(global_invocation_id) gid: vec3u) {
let i = gid.x;
let t = (f32(i) / 512.0 + p.time * 0.2) * p.frequency * 6.283185;
var v: f32;
switch p.waveShape {
case 0u { v = sin(t); } // sine
case 1u { v = sign(sin(t)); } // square
default { v = fract(t / 6.283185) * 2.0 - 1.0; } // sawtooth
}
wave[i] = v * p.amplitude;
}
// ── JS — pass params to compute dispatch via immediates ─────
const passParams = new ArrayBuffer(16);
const view = new DataView(passParams);
view.setFloat32(0, frequency, true); // frequency
view.setFloat32(4, amplitude, true); // amplitude
view.setUint32 (8, waveShape, true); // waveShape
view.setFloat32(12, t, true); // time
const computePass = encoder.beginComputePass();
computePass.setPipeline(computePipeline);
computePass.setBindGroup(0, bindGroup);
computePass.setImmediateData(0, passParams); // ← one call, no buffer write
computePass.dispatchWorkgroups(8); // 8 × 64 = 512 elements
computePass.end();
see also
- Push Constants Basics — render pass immediates
- Per-Draw Materials — immediates changing between draw calls
- Performance Comparison — immediates vs writeBuffer
implementation reference
Need the exact API surface, compatibility boundaries, errors, lifecycle, and source links? Read the matching gendn reference ↗