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

implementation reference

Need the exact API surface, compatibility boundaries, errors, lifecycle, and source links? Read the matching gendn reference ↗