GPUComputePassEncoder: setBindGroup()-Methode

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

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 Berechnungskommandos bei einem gegebenen Index verwendet wird.

Syntax

js
setBindGroup(index, bindGroup)
setBindGroup(index, bindGroup, dynamicOffsets)
setBindGroup(index, bindGroup, dynamicOffsets, dynamicOffsetsStart,
             dynamicOffsetsLength)

Parameter

index

Der Index, bei dem die Bind-Gruppe gesetzt wird. Dies entspricht dem n-Indexwert des entsprechenden @group(n)-Attributs im Shader-Code (GPUShaderModule), das in der zugehörigen Pipeline verwendet wird.

bindGroup

Die GPUBindGroup, die für die nachfolgenden Berechnungskommandos verwendet wird, oder null, in diesem Fall wird jede zuvor gesetzte Bind-Gruppe im gegebenen Slot aufgehoben.

dynamicOffsets Optional

Ein Wert, der den Offset in Bytes für jeden Eintrag in bindGroup spezifiziert, für den hasDynamicOffset: true gesetzt ist (d.h. im Deskriptor des Aufrufs von GPUDevice.createBindGroupLayout(), der das GPUBindGroupLayout-Objekt erstellt hat, auf dem bindGroup basiert). Dieser Wert kann sein:

  • Ein Array von Zahlen, das die verschiedenen Offsets spezifiziert.
  • Ein Uint32Array, das Zahlen enthält, welche die Offsets spezifizieren.

Wenn ein Uint32Array-Wert für dynamicOffsets spezifiziert ist, sind auch die folgenden Parameter erforderlich:

dynamicOffsetsStart

Eine Zahl, die den Offset in Array-Elementen in dynamicOffsetsData angibt, wo die dynamischen Offset-Daten beginnen.

dynamicOffsetsLength

Eine Zahl, die die Anzahl der dynamischen Offset-Werte angibt, die aus dynamicOffsetsData gelesen werden sollen.

Rückgabewert

Keiner (Undefined).

Ausnahmen

Für setBindGroup()-Aufrufe, die einen Uint32Array-Wert für dynamicOffsets verwenden, wird ein Aufruf mit RangeError DOMException abgelehnt, wenn:

  • dynamicOffsetsStart kleiner als 0 ist.
  • dynamicOffsetsStart + dynamicOffsetsLength größer als dynamicOffsets.length ist.

Validierung

Die folgenden Kriterien müssen erfüllt sein, wenn dispatchWorkgroups() aufgerufen wird, andernfalls wird ein GPUValidationError erzeugt und der GPUComputePassEncoder wird ungültig:

  • index ist kleiner oder gleich dem maxBindGroups- Limit des GPUDevice.
  • dynamicOffsets.length entspricht der Anzahl der Einträge in bindGroup, für die hasDynamicOffset: true gesetzt ist.
  • Für bindGroup-Einträge, bei denen der gebundene buffer-Typ "uniform" ist (siehe GPUDevice.createBindGroupLayout()), ist jede Zahl in dynamicOffsets ein Vielfaches des minUniformBufferOffsetAlignment- Limits des GPUDevice.
  • Für bindGroup-Einträge, bei denen der gebundene buffer-Typ "storage" oder "read-only-storage" ist (siehe GPUDevice.createBindGroupLayout()), ist jede Zahl in dynamicOffsets ein Vielfaches des minStorageBufferOffsetAlignment- Limits des GPUDevice.
  • Für jeden bindGroup-Eintrag ist der gebundene buffer-offset, plus die entsprechende minBindingSize des Layout-Eintrags, plus der entsprechende dynamische Offset, der in dynamicOffsets spezifiziert ist, kleiner oder gleich der Größe des gebundenen buffer.

Beispiele

Bind-Gruppe setzen

In unserem grundlegenden Compute-Demo werden mehrere Kommandos über einen GPUCommandEncoder aufgezeichnet. Die meisten dieser Kommandos stammen vom GPUComputePassEncoder, der über beginComputePass() erstellt wurde. Der hier verwendete setBindGroup()-Aufruf ist die einfachste Form und spezifiziert lediglich Index und Bind-Gruppe.

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()]);

// …

Bind-Gruppe aufheben

js
// Set bind group in slot 0
passEncoder.setBindGroup(0, bindGroup);

// Later, unset bind group in slot 0
passEncoder.setBindGroup(0, null);

Spezifikationen

Specification
WebGPU
# programmable-passes-bind-groups

Browser-Kompatibilität

Siehe auch