GPUComputePassEncoder: Methode setBindGroup()
Eingeschränkt verfügbar
Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.
Want more browser support for this feature? Tell us why.
Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.
Hinweis: Diese Funktion ist in Web Workers verfügbar.
Die Methode setBindGroup() der Schnittstelle GPUComputePassEncoder legt für einen bestimmten Index die GPUBindGroup fest, die für nachfolgende Compute-Befehle verwendet wird.
Syntax
setBindGroup(index, bindGroup)
setBindGroup(index, bindGroup, dynamicOffsets)
setBindGroup(index, bindGroup, dynamicOffsets, dynamicOffsetsStart,
dynamicOffsetsLength)
Parameter
index-
Der Index, an dem die Bind Group festgelegt wird. Er entspricht dem Indexwert
ndes zugehörigen Attributs@group(n)im Shader-Code (GPUShaderModule), der in der betreffenden Pipeline verwendet wird. bindGroup-
Die
GPUBindGroup, die für nachfolgende Compute-Befehle verwendet wird, odernull. Beinullwird eine zuvor im angegebenen Slot festgelegte Bind Group entfernt. dynamicOffsetsOptional-
Ein Wert, der für jeden Eintrag in
bindGroup, für denhasDynamicOffset: truegesetzt ist, den Offset in Bytes angibt (d.h. im Deskriptor des Aufrufs vonGPUDevice.createBindGroupLayout(), mit dem dasGPUBindGroupLayout-Objekt erstellt wurde, auf dembindGroupbasiert). Dieser Wert kann Folgendes sein:- Ein Array von Zahlen, die die einzelnen Offsets angeben.
- Ein
Uint32Arraymit Zahlen, die die Offsets angeben.
Wenn für dynamicOffsets ein Uint32Array angegeben wird, sind auch die beiden folgenden Parameter erforderlich:
dynamicOffsetsStart-
Eine Zahl, die den Offset in Array-Elementen innerhalb von
dynamicOffsetsDataangibt, an dem die Daten für die dynamischen Offsets beginnen. dynamicOffsetsLength-
Eine Zahl, die angibt, wie viele Werte für dynamische Offsets aus
dynamicOffsetsDatagelesen werden.
Rückgabewert
Keiner (undefined).
Ausnahmen
Bei Aufrufen von setBindGroup(), die für dynamicOffsets ein Uint32Array verwenden, wird ein RangeError ausgelöst, wenn:
dynamicOffsetsStartkleiner als 0 ist.dynamicOffsetsStart+dynamicOffsetsLengthgrößer alsdynamicOffsets.lengthist.
Validierung
Beim Aufruf von dispatchWorkgroups() müssen die folgenden Kriterien erfüllt sein. Andernfalls wird ein GPUValidationError erzeugt und der GPUComputePassEncoder wird ungültig:
indexist kleiner oder gleich dem LimitmaxBindGroupsdesGPUDevice.dynamicOffsets.lengthentspricht der Anzahl der Einträge inbindGroup, für diehasDynamicOffset: truegesetzt ist.- Bei
bindGroup-Einträgen, für dietypedes gebundenenbufferden Wert"uniform"hat (sieheGPUDevice.createBindGroupLayout()), ist jede Zahl indynamicOffsetsein Vielfaches des LimitsminUniformBufferOffsetAlignmentdesGPUDevice. - Bei
bindGroup-Einträgen, für dietypedes gebundenenbufferden Wert"storage"oder"read-only-storage"hat (sieheGPUDevice.createBindGroupLayout()), ist jede Zahl indynamicOffsetsein Vielfaches des LimitsminStorageBufferOffsetAlignmentdesGPUDevice. - Für jeden
bindGroup-Eintrag ist die Summe ausoffsetdes gebundenenbuffer,minBindingSizedes zugehörigen Layout-Eintrags und dem zugehörigen indynamicOffsetsangegebenen dynamischen Offset kleiner oder gleichsizedes gebundenenbuffer.
Beispiele
>Bind Group festlegen
In unserer einfachen Compute-Demo werden mehrere Befehle über einen GPUCommandEncoder aufgezeichnet. Die meisten dieser Befehle stammen vom GPUComputePassEncoder, der über beginComputePass() erstellt wurde. Der hier verwendete Aufruf von setBindGroup() ist die einfachste Form: Er gibt nur den Index und die Bind Group an.
const BUFFER_SIZE = 1000;
// …
// Create GPUCommandEncoder to encode commands to issue to the GPU
const commandEncoder = device.createCommandEncoder();
// Initiate compute 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()]);
// …
Bind Group entfernen
// Set bind group in slot 0
passEncoder.setBindGroup(0, bindGroup);
// Later, unset bind group in slot 0
passEncoder.setBindGroup(0, null);
Spezifikationen
| Spezifikation |
|---|
| WebGPU> # programmable-passes-bind-groups> |
Browser-Kompatibilität
Siehe auch
- Die WebGPU API