GPUComputePassEncoder: setBindGroup() method
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Secure context: This feature is available only in secure contexts (HTTPS), in some or all supporting browsers.
Note: This feature is available in Web Workers.
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, 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 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
>Set bind group
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()]); // … Unset bind group
// Set bind group in slot 0 passEncoder.setBindGroup(0, bindGroup); // 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