GPUComputePassEncoder: setBindGroup() method
Experimental: This is an experimental technology
Check the Browser compatibility table carefully before using this in production.
Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.
The setBindGroup() method of the
GPUComputePassEncoder interface sets the GPUBindGroup to use for subsequent compute commands, for a given index.
Syntax
setBindGroup(index, bindGroup)
setBindGroup(index, bindGroup, dynamicOffsets)
setBindGroup(index, bindGroup, dynamicOffsets, dynamicOffsetsStart,
dynamicOffsetsLength)
Parameters
index-
The index to set the bind group at. This matches the
nindex value of the corresponding@group(n)attribute in the shader code (GPUShaderModule) used in the related pipeline. bindGroup-
The
GPUBindGroupto use for subsequent compute commands. dynamicOffsetsOptional-
A value specifying the offset, in bytes, for each entry in
bindGroupwithhasDynamicOffset: trueset (i.e. in the descriptor of theGPUDevice.createBindGroupLayout()call that created theGPUBindGroupLayoutobject that thebindGroupis based on). This value can be:- An array of numbers specifying the different offsets.
- A
Uint32Arraycontaining numbers specifying the offsets.
If a Uint32Array value is specified for dynamicOffsets, both of the following parameters are also required:
dynamicOffsetsStart-
A number specifying the offset, in array elements, into
dynamicOffsetsData, where the dynamic offset data begins. dynamicOffsetsLength-
A number specifying the number of dynamic offset values to be read from in
dynamicOffsetsData.
Return value
None (Undefined).
Exceptions
For setBindGroup() calls that use a Uint32Array value for dynamicOffsets, the call will throw with a RangeError DOMException if:
dynamicOffsetsStartis less than 0.dynamicOffsetsStart+dynamicOffsetsLengthis greater thandynamicOffsets.length.
Validation
The following criteria must be met when calling dispatchWorkgroups(), otherwise a GPUValidationError is generated and the GPUComputePassEncoder becomes invalid:
indexis less than or equal to theGPUDevice'smaxBindGroupslimit.dynamicOffsets.lengthis the same as the number of entries inbindGroupwithhasDynamicOffset: trueset.- For
bindGroupentries where the boundbuffer'stypeis"uniform"(seeGPUDevice.createBindGroupLayout()), each number indynamicOffsetsis a multiple of theGPUDevice'sminUniformBufferOffsetAlignmentlimit. - For
bindGroupentries where the boundbuffer'stypeis"storage"or"read-only-storage"(seeGPUDevice.createBindGroupLayout()), each number indynamicOffsetsis a multiple of theGPUDevice'sminStorageBufferOffsetAlignmentlimit. - For each
bindGroupentry, the boundbuffer'soffset, plus the corresponding layout entry'sminBindingSize, plus the corresponding dynamic offset specified indynamicOffsets, is less than or equal to the boundbuffer'ssize.
Examples
In our basic compute demo, several commands are recorded via a GPUCommandEncoder. Most of these commands originate from the GPUComputePassEncoder created via beginComputePass(). The setBindGroup() call used here is the simplest form, just specifying index and bind group.
const BUFFER_SIZE = 1000;
// ...
// Create GPUCommandEncoder to encode commands to issue to the GPU
const commandEncoder = device.createCommandEncoder();
// Initiate render pass
const passEncoder = commandEncoder.beginComputePass();
// Issue commands
passEncoder.setPipeline(computePipeline);
passEncoder.setBindGroup(0, bindGroup);
passEncoder.dispatchWorkgroups(Math.ceil(BUFFER_SIZE / 64));
// End the render pass
passEncoder.end();
// Copy output buffer to staging buffer
commandEncoder.copyBufferToBuffer(
output,
0, // Source offset
stagingBuffer,
0, // Destination offset
BUFFER_SIZE,
);
// End frame by passing array of command buffers to command queue for execution
device.queue.submit([commandEncoder.finish()]);
// ...
Specifications
| Specification |
|---|
| WebGPU # programmable-passes-bind-groups |
Browser compatibility
BCD tables only load in the browser
See also
- The WebGPU API