Neuerungen in WebGPU (Chrome 124)

François Beaufort
François Beaufort

Schreibgeschützte und Lese-/Schreib-Speichertexturen

Mit dem Bindungstyp für Speichertexturen können Shader aus Speichertexturen lesen, ohne die Verwendung TEXTURE_BINDING hinzuzufügen, und gemischte Lese- und Schreibvorgänge für bestimmte Formate ausführen. Wenn die "readonly_and_readwrite_storage_textures" WGSL Spracherweiterung in navigator.gpu.wgslLanguageFeatures vorhanden ist, können Sie den Zugriff auf GPUStorageTexture jetzt beim Erstellen eines Bindungsgruppenlayouts auf "read-write" oder "read-only" festlegen. Bisher war dies auf "write-only" beschränkt.

Anschließend kann Ihr WGSL-Shadercode die Zugriffsqualifizierer read_write und read für Speichertexturen verwenden. Die integrierten Funktionen textureLoad() und textureStore() verhalten sich entsprechend. Außerdem ist eine neue integrierte Funktion textureBarrier() verfügbar, um den Zugriff auf den Texturspeicher in einer Arbeitsgruppe zu synchronisieren.

Es wird empfohlen, eine „requires“-Anweisung zu verwenden, um auf die potenzielle Nicht-Portabilität hinzuweisen. Fügen Sie dazu oben in Ihrem WGSL-Shadercode requires readonly_and_readwrite_storage_textures; ein. Weitere Informationen finden Sie im folgenden Beispiel und im Problem dawn:1972.

if (!navigator.gpu.wgslLanguageFeatures.has("readonly_and_readwrite_storage_textures")) {
  throw new Error("Read-only and read-write storage textures are not available");
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const bindGroupLayout = device.createBindGroupLayout({
  entries: [{
    binding: 0,
    visibility: GPUShaderStage.COMPUTE,
    storageTexture: {
      access: "read-write", // <-- New!
      format: "r32uint",
    },
  }],
});

const shaderModule = device.createShaderModule({ code: `
  requires readonly_and_readwrite_storage_textures;

  @group(0) @binding(0) var tex : texture_storage_2d<r32uint, read_write>;

  @compute @workgroup_size(1, 1)
  fn main(@builtin(local_invocation_id) local_id: vec3u) {
    var data = textureLoad(tex, vec2i(local_id.xy));
    data.x *= 2;
    textureStore(tex, vec2i(local_id.xy), data);
  }`
});

// You can now create a compute pipeline with this shader module and
// send the appropriate commands to the GPU.

Unterstützung für Service-Worker und Shared Worker

WebGPU in Chrome bietet eine neue Stufe der Unterstützung für Web-Worker. Jetzt werden sowohl Service-Worker als auch Shared Worker unterstützt. Sie können Service-Worker verwenden, um Hintergrundaufgaben und Offline-Funktionen zu verbessern, und Shared Worker für die effiziente gemeinsame Nutzung von Ressourcen in verschiedenen Skripts. Weitere Informationen finden Sie im Problem chromium:41494731.

Im Chrome-Erweiterungsbeispiel und in der WebLLM-Chrome-Er3}weiterung erfahren Sie, wie Sie WebGPU in einem Erweiterungs-Service-Worker verwenden.

Screenshot der WebLLM-Chrome-Erweiterung.
WebLLM-Chrome-Erweiterung

Neue Attribute für Adapterinformationen

Die nicht standardmäßigen d3dShaderModel und vkDriverVersion Attribute für Adapterinformationen sind jetzt beim Aufrufen von requestAdapterInfo() verfügbar, wenn der Nutzer das "WebGPU-Entwicklerfunktionen" Flag unter chrome://flags/#enable-webgpu-developer-features aktiviert hat. Wenn unterstützt:

  • d3dShaderModel ist die maximale unterstützte D3D-Shadermodellnummer. Der Wert 62 gibt beispielsweise an, dass der aktuelle Treiber HLSL SM 6.2 unterstützt. Weitere Informationen finden Sie in der Dokumentation und im Problem dawn:1254.

  • vkDriverVersion ist die vom Anbieter angegebene Versionsnummer des Vulkan-Treibers. Weitere Informationen finden Sie in der Dokumentation und im Problem chromium:327457605.

Screenshot von https://webgpureport.org mit vkDriverVersion in den Adapterinformationen.
Adapterinformationen vkDriverVersion auf https://webgpureport.org.

Diverse Fehlerkorrekturen

Wenn Sie zwei Pipelines mit übereinstimmenden Bindungsgruppen mit layout: "auto" erstellen, dann eine Bindungsgruppe mit der ersten Pipeline erstellen und sie in der zweiten Pipeline verwenden, wird jetzt ein GPUValidationError ausgelöst. Das Zulassen war ein Implementierungsfehler, der jetzt mit entsprechenden Tests behoben wurde. Weitere Informationen finden Sie im Problem dawn:2402.

Dawn-Updates

In der Dawn API wird der nicht erfasste Fehler-Callback, der mit wgpuDeviceSetUncapturedErrorCallback festgelegt wurde, jetzt nicht mehr aufgerufen, nachdem das GPU-Gerät verloren gegangen ist. Mit dieser Korrektur wird Dawn an die JavaScript API-Spezifikation und die Implementierung von Blink angepasst. Weitere Informationen finden Sie im Problem dawn:2459.

Dies sind nur einige der wichtigsten Neuerungen. Eine vollständige Liste der Commits finden Sie hier.

Neuerungen in WebGPU

Eine Liste aller Themen, die in der Reihe „Neuerungen in WebGPU“ behandelt wurden.

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113