GPUComputePassEncoder: setBindGroup() method
Experimental: This is an experimental technology
Check the Browser compatibility table carefully before using this in production.
The setBindGroup()
method of the
GPUComputePassEncoder
interface sets the GPUBindGroup
to use for subsequent compute commands, for a given index.
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
n
index value of the corresponding@group(n)
attribute in the shader code (GPUShaderModule
) used in the related pipeline. bindGroup
-
The
GPUBindGroup
to use for subsequent compute commands. dynamicOffsets
Optional-
A value specifying the offset, in bytes, for each entry in
bindGroup
withhasDynamicOffset: true
set (i.e. in the descriptor of theGPUDevice.createBindGroupLayout()
call that created theGPUBindGroupLayout
object that thebindGroup
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 thandynamicOffsets.length
.
Validation
The following criteria must be met when calling dispatchWorkgroups()
, otherwise a GPUValidationError
is generated and the GPUComputePassEncoder
becomes invalid:
index
is less than or equal to theGPUDevice
'smaxBindGroups
limit.dynamicOffsets.length
is the same as the number of entries inbindGroup
withhasDynamicOffset: true
set.- For
bindGroup
entries where the boundbuffer
'stype
is"uniform"
(seeGPUDevice.createBindGroupLayout()
), each number indynamicOffsets
is a multiple of theGPUDevice
'sminUniformBufferOffsetAlignment
limit. - For
bindGroup
entries where the boundbuffer
'stype
is"storage"
or"read-only-storage"
(seeGPUDevice.createBindGroupLayout()
), each number indynamicOffsets
is a multiple of theGPUDevice
'sminStorageBufferOffsetAlignment
limit. - For each
bindGroup
entry, 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.
js
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