Neuerungen in WebGPU (Chrome 124)

François Beaufort
François Beaufort

Schreibgeschützte Speichertexturen

Der Speichertexturbindungstyp ermöglicht es Shadern, aus Speichertexturen zu lesen, ohne die TEXTURE_BINDING-Nutzung hinzuzufügen, und gemischte Lese- und Schreibvorgänge für bestimmte Formate auszuführen. Wenn die Spracherweiterung "readonly_and_readwrite_storage_textures" WGSL in navigator.gpu.wgslLanguageFeatures vorhanden ist, können Sie beim Erstellen eines Layouts für eine Bindungsgruppe jetzt den GPUStorageTexture-Zugriff auf "read-write" oder "read-only" festlegen. Bisher war dies auf "write-only" beschränkt.

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

Es wird empfohlen, eine requires-Anweisung zu verwenden, um die potenzielle Nicht-Portabilität mit requires readonly_and_readwrite_storage_textures; am Anfang deines WGSL-Shader-Codes zu signalisieren. Sieh dir das folgende Beispiel und issue dawn:1972 an.

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

Mit WebGPU in Chrome wird die Unterstützung für Web-Worker jetzt noch weiterentwickelt. Jetzt werden sowohl Service-Worker als auch gemeinsam genutzte Worker unterstützt. Mit Service Workern können Sie Hintergrundaufgaben und Offlinefunktionen verbessern sowie freigegebene Worker für eine effiziente Ressourcenfreigabe über mehrere Skripts hinweg verwenden. Siehe issue chromium:41494731.

Sehen Sie sich das Beispiel mit der Chrome-Erweiterung und die Chrome-Erweiterung WebLLM an, um zu erfahren, wie Sie WebGPU in einem Erweiterungs-Service-Worker verwenden.

<ph type="x-smartling-placeholder">
</ph> Screenshot der Chrome-Erweiterung WebLLM
WebLLM Chrome-Erweiterung

Neue Attribute für Adapterinformationen

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

  • d3dShaderModel ist die maximal unterstützte D3D-Shader-Modellnummer. Der Wert 62 gibt beispielsweise an, dass der aktuelle Treiber HLSL SM 6.2 unterstützt. Weitere Informationen finden Sie in der Dokumentation und unter issue dawn:1254.

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

Screenshot von https://webgpureport.org mit „vkDriverVersion“ in den Adapterinformationen.
Informationen zum Adapter vkDriverVersion unter https://webgpureport.org

Fehlerkorrekturen

Wenn Sie mit layout: "auto" zwei Pipelines mit übereinstimmenden Bindungsgruppen erstellen, dann mit der ersten Pipeline eine Bindgroup erstellen und diese in der zweiten Pipeline verwenden, wird jetzt der Fehler GPUValidationError ausgelöst. Dies war ein Implementierungsfehler, der jetzt mit korrekten Tests behoben wurde. Siehe issue dawn:2402.

Updates zur Morgendämmerung

In der Dawn API wird der mit wgpuDeviceSetUncapturedErrorCallback festgelegte nicht erfasste Fehler-Callback jetzt nach dem Verlust des GPU-Geräts nicht aufgerufen. Dadurch wird Dawn an die JavaScript API-Spezifikation und die Blink-Implementierung angeglichen. Siehe issue dawn:2459.

Hier werden nur einige der wichtigsten Vorteile behandelt. Vollständige Liste der Commits

Das ist neu bei WebGPU

Eine Liste aller behandelten Themen der Reihe What's New in WebGPU.

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