GPUComputePassEncoder: Methode setBindGroup()
Eingeschränkt verfügbar
Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.
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 setBindGroup()-Methode der GPUComputePassEncoder-Schnittstelle setzt die GPUBindGroup, die für nachfolgende Compute-Befehle bei einem bestimmten Index verwendet wird.
Syntax
setBindGroup(index, bindGroup)
setBindGroup(index, bindGroup, dynamicOffsets)
setBindGroup(index, bindGroup, dynamicOffsets, dynamicOffsetsStart,
dynamicOffsetsLength)
Parameter
index-
Der Index, an dem die Bind-Gruppe festgelegt werden soll. Dies entspricht dem
n-Indexwert des entsprechenden@group(n)-Attributs im Shader-Code (GPUShaderModule), der in der zugehörigen Pipeline verwendet wird. bindGroup-
Die
GPUBindGroup, die für nachfolgende Compute-Befehle verwendet werden soll, odernull, in diesem Fall wird eine zuvor eingestellte Bind-Gruppe in dem angegebenen Slot entfernt. dynamicOffsetsOptional-
Ein Wert, der den Offset in Bytes für jeden Eintrag in
bindGroupangibt, bei demhasDynamicOffset: truefestgelegt ist (d.h. im Deskriptor des AufrufsGPUDevice.createBindGroupLayout(), der dasGPUBindGroupLayout-Objekt erstellt hat, auf dem diebindGroupbasiert). Dieser Wert kann sein:- Ein Array von Zahlen, das die verschiedenen Offsets angibt.
- Ein
Uint32Array, das Zahlen enthält, die die Offsets angeben.
Wenn ein Uint32Array-Wert für dynamicOffsets angegeben ist, sind beide der folgenden Parameter ebenfalls erforderlich:
dynamicOffsetsStart-
Eine Zahl, die den Offset in Array-Elementen in
dynamicOffsetsDataangibt, bei dem die dynamische Offset-Daten beginnen. dynamicOffsetsLength-
Eine Zahl, die die Anzahl der dynamischen Offset-Werte angibt, die aus
dynamicOffsetsDatagelesen werden sollen.
Rückgabewert
Keiner (undefined).
Ausnahmen
Für setBindGroup()-Aufrufe, die einen Uint32Array-Wert für dynamicOffsets verwenden, wird der Aufruf mit einem RangeError DOMException ausgelöst, wenn:
dynamicOffsetsStartkleiner als 0 ist.dynamicOffsetsStart+dynamicOffsetsLengthgrößer alsdynamicOffsets.lengthist.
Validierung
Die folgenden Kriterien müssen erfüllt sein, wenn dispatchWorkgroups() aufgerufen wird, andernfalls wird ein GPUValidationError generiert und der GPUComputePassEncoder wird ungültig:
indexist kleiner oder gleich demmaxBindGroups-Limit desGPUDevice.dynamicOffsets.lengthentspricht der Anzahl der Einträge inbindGroupmithasDynamicOffset: true.- Für
bindGroup-Einträge, bei denen der gebundenebuffer-Typ"uniform"ist (sieheGPUDevice.createBindGroupLayout()), muss jede Zahl indynamicOffsetsein Vielfaches desminUniformBufferOffsetAlignment-Limits desGPUDevicesein. - Für
bindGroup-Einträge, bei denen der gebundenebuffer-Typ"storage"oder"read-only-storage"ist (sieheGPUDevice.createBindGroupLayout()), muss jede Zahl indynamicOffsetsein Vielfaches desminStorageBufferOffsetAlignment-Limits desGPUDevicesein. - Für jeden
bindGroup-Eintrag darf deroffsetdes gebundenenbuffer, plus derminBindingSizedes entsprechenden Layout-Eintrags, plus der entsprechende dynamische Offset, der indynamicOffsetsangegeben ist, nicht größer als diesizedes gebundenenbuffersein.
Beispiele
>Bind-Gruppe festlegen
In unserem 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 setBindGroup() ist die einfachste Form, bei der nur Index und Bind-Gruppe angegeben werden.
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-Gruppe 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