GPURenderBundleEncoder: setBindGroup() method - Web APIs | MDN
Syntax
js
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 render bundle commands, ornull, in which case any previously-set bind group in the given slot is unset. 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 setBindGroup(), otherwise a GPUValidationError is generated and the GPURenderBundleEncoder 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
Set bind group
js
function recordRenderPass(passEncoder) {
if (settings.dynamicOffsets) {
passEncoder.setPipeline(dynamicPipeline);
} else {
passEncoder.setPipeline(pipeline);
}
passEncoder.setVertexBuffer(0, vertexBuffer);
passEncoder.setBindGroup(0, timeBindGroup);
const dynamicOffsets = [0];
for (let i = 0; i < numTriangles; ++i) {
if (settings.dynamicOffsets) {
dynamicOffsets[0] = i * alignedUniformBytes;
passEncoder.setBindGroup(1, dynamicBindGroup, dynamicOffsets);
} else {
passEncoder.setBindGroup(1, bindGroups[i]);
}
passEncoder.draw(3, 1, 0, 0);
}
}
The above snippet is taken from the WebGPU Samples Animometer example.
Unset bind group
js
// Set bind group in slot 0
passEncoder.setBindGroup(0, timeBindGroup);
// Later, unset bind group in slot 0
passEncoder.setBindGroup(0, null);
Specifications
| Specification |
|---|
| WebGPU # programmable-passes-bind-groups |
Browser compatibility
See also
- The WebGPU API