Neuerungen in WebGPU (Chrome 124)

François Beaufort
François Beaufort

Schreibgeschützte und nicht schreibgeschützte Speichertexturen

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

Anschließend kann der WGSL-Shader-Code den Zugriffsqualifizierer 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 Zugriffe auf Texturspeicher in einer Arbeitsgruppe zu synchronisieren.

Es empfiehlt sich, eine requires-Anweisung zu verwenden, um das Potenzial für Nichtportabilität mit requires readonly_and_readwrite_storage_textures; am Anfang des WGSL-Shader-Codes zu signalisieren. Sehen Sie sich 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.

Support für Service Worker und Shared Worker

WebGPU in Chrome bietet Support für Web Worker auf einer ganz neuen Ebene, sodass sowohl Service Worker als auch gemeinsam genutzte Worker unterstützt werden. Mit Service Workern können Sie Hintergrundaufgaben und Offlinefunktionen optimieren. Mit gemeinsam genutzten Workern lassen sich Ressourcen effizient skriptübergreifend freigeben. Siehe Problem „chromium:41494731“.

Sehen Sie sich das Beispiel für die Chrome-Erweiterung und die WebLLM-Chrome-Erweiterung an, um zu erfahren, wie Sie WebGPU in einem Erweiterungsdienst-Worker verwenden.

Screenshot der Chrome-Erweiterung „WebLLM“
WebLLM-Chrome-Erweiterung.

Neue Attribute für Adapterinformationen

Nicht standardmäßige d3dShaderModel- und vkDriverVersion-Adapterinformationsattribute sind jetzt beim Aufrufen von requestAdapterInfo() verfügbar, wenn der Nutzer die Flag „WebGPU Developer Features“ bei chrome://flags/#enable-webgpu-developer-features aktiviert hat. Bei Unterstützung:

  • 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 Problem dawn:1254.

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

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

Fehlerkorrekturen

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

Updates zum Morgengrauen

In der Dawn API wird der nicht erfasste Fehler-Callback, der mit wgpuDeviceSetUncapturedErrorCallback festgelegt ist, jetzt nicht mehr aufgerufen, nachdem das GPU-Gerät verloren gegangen ist. Durch diese Korrektur stimmt Dawn mit der JavaScript API-Spezifikation und der Blink-Implementierung überein. Weitere Informationen finden Sie unter Problem dawn:2459.

Dies sind nur einige der wichtigsten Punkte. Hier finden Sie eine vollständige Liste der Commits.

Neu bei WebGPU

Hier finden Sie eine Liste aller Inhalte, die in der Reihe What's New in WebGPU behandelt wurden.

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