GPURenderBundleEncoder: setBindGroup() method

Experimental: This is an experimental technology
Check the Browser compatibility table carefully before using this in production.

The setBindGroup() method of the GPURenderBundleEncoder interface sets the GPUBindGroup to use for subsequent render bundle commands, for a given index.

Note: This method is functionally identical to its equivalent on GPURenderPassEncodersetBindGroup().

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 corresponds to the binding value of the relevant entry object in the descriptor of the originating GPUDevice.createBindGroup() call that created the bindGroup.

bindGroup

The GPUBindGroup to use for subsequent render bundle commands.

dynamicOffsets Optional

A value specifying the offset, in bytes, for each entry in bindGroup with hasDynamicOffset: true set (i.e. in the descriptor of the GPUDevice.createBindGroupLayout() call that created the GPUBindGroupLayout object that the bindGroup is based on). This value can be:

  • An array of numbers specifying the different offsets.
  • A Uint32Array containing 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:

  • dynamicOffsetsStart is less than 0.
  • dynamicOffsetsStart + dynamicOffsetsLength is greater than dynamicOffsets.length.

Validation

The following criteria must be met when calling setBindGroup(), otherwise a GPUValidationError is generated and the GPURenderBundleEncoder becomes invalid:

  • index is less than or equal to the GPUDevice's maxBindGroups limit.
  • dynamicOffsets.length is the same as the number of entries in bindGroup with hasDynamicOffset: true set.
  • For bindGroup entries where the bound buffer's type is "uniform" (see GPUDevice.createBindGroupLayout()), each number in dynamicOffsets is a multiple of the GPUDevice's minUniformBufferOffsetAlignment limit.
  • For bindGroup entries where the bound buffer's type is "storage" or "read-only-storage" (see GPUDevice.createBindGroupLayout()), each number in dynamicOffsets is a multiple of the GPUDevice's minStorageBufferOffsetAlignment limit.
  • For each bindGroup entry, the bound buffer's offset, plus the corresponding layout entry's minBindingSize, plus the corresponding dynamic offset specified in dynamicOffsets, is less than or equal to the bound buffer's size.

Examples

function recordRenderPass(
  passEncoder: GPURenderBundleEncoder | GPURenderPassEncoder // TypeScript
) {
  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.

Specifications

Specification
WebGPU
# programmable-passes-bind-groups

Browser compatibility

BCD tables only load in the browser

See also