Neuigkeiten bei WebGPU (Chrome 135)

François Beaufort
François Beaufort

Veröffentlicht: 26. März 2025

Erstellen von Pipeline-Layouts mit Null-Bindungsgruppenlayout zulassen

Bisher war es erforderlich, eine Bindungsgruppe mit null Bindungen hinzuzufügen, um ein leeres Bindungsgruppenlayout zu erstellen. Das ist nicht mehr erforderlich, da Layouts für Nullbindungsgruppen jetzt zulässig sind und beim Erstellen eines Pipeline-Layouts ignoriert werden. Das sollte die Entwicklung erleichtern.

Beispielsweise möchten Sie eine Pipeline erstellen, die nur die Bindungsgruppenlayouts 0 und 2 verwendet. Sie können Bindegruppenlayout 1 den Fragmentdaten und Bindegruppenlayout 2 den Vertexdaten zuweisen und dann ohne Fragmentshader rendern. Siehe Problem 377836524.

const bgl0 = myDevice.createBindGroupLayout({ entries: myGlobalEntries });
const bgl1 = myDevice.createBindGroupLayout({ entries: myFragmentEntries });
const bgl2 = myDevice.createBindGroupLayout({ entries: myVertexEntries });

// Create a pipeline layout that will be used to render without a fragment shader.
const myPipelineLayout = myDevice.createPipelineLayout({
  bindGroupLayouts: [bgl0, null, bgl2],
});

Darstellungsbereiche dürfen über die Grenzen der Rendering-Ziele hinausragen

Die Anforderungen an die Validierung des Darstellungsbereichs wurden gelockert, damit Darstellungsbereiche über die Grenzen des Rendering-Ziels hinausgehen können. Dies ist besonders nützlich zum Zeichnen von 2D-Elementen wie der Benutzeroberfläche, die sich über den aktuellen Darstellungsbereich hinaus erstrecken können. Siehe Problem 390162929.

const passEncoder = myCommandEncoder.beginRenderPass({
  colorAttachments: [
    {
      view: myColorTexture.createView(),
      loadOp: "clear",
      storeOp: "store",
    },
  ],
});

// Set a viewport that extends past the render target's bounds by 8 pixels
// in all directions.
passEncoder.setViewport(
  /*x=*/ -8,
  /*y=*/ -8,
  /*width=*/ myColorTexture.width + 16,
  /*height=*/ myColorTexture.height + 16,
  /*minDepth=*/ 0,
  /*maxDepth=*/ 1,
);

// Draw geometry and complete the render pass as usual.

Einfacherer Zugriff auf den experimentellen Kompatibilitätsmodus unter Android

Allein das Flag chrome://flags/#enable-unsafe-webgpu aktiviert jetzt alle Funktionen, die für den experimentellen WebGPU-Kompatibilitätsmodus auf Android erforderlich sind. So können Sie mit der Option featureLevel: "compatibility" einen GPUAdapter im Kompatibilitätsmodus anfordern und sogar auf dem OpenGL ES-Backend auf Geräten zugreifen, die Vulkan nicht unterstützen. Siehe das folgende Beispiel und das Problem dawn:389876644.

// Request a GPUAdapter in compatibility mode.
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });
Auf der Berichtsseite für WebGPU wird auf einem Android-Gerät ein GPUAdapter im Kompatibilitätsmodus angezeigt.
Informationen zum Adapter im Kompatibilitätsmodus unter webgpureport.org.

Limit für „maxInterStageShaderComponents“ entfernen

Wie bereits angekündigt, wird das Limit „maxInterStageShaderComponents“ aufgrund einer Kombination verschiedener Faktoren entfernt:

  • Redundanz mit maxInterStageShaderVariables: Dieses Limit dient bereits einem ähnlichen Zweck und steuert die Menge der Daten, die zwischen den Shader-Phasen übergeben werden.
  • Geringfügige Abweichungen: Es gibt zwar geringfügige Unterschiede bei der Berechnung der beiden Limits, diese Unterschiede sind jedoch gering und können innerhalb des Limits für maxInterStageShaderVariables effektiv verwaltet werden.
  • Vereinfachung: Durch das Entfernen von maxInterStageShaderComponents wird die Shader-Oberfläche optimiert und die Komplexität für Entwickler reduziert. Anstatt zwei separate Limits mit geringfügigen Unterschieden zu verwalten, können sie sich auf die passendere und umfassendere maxInterStageShaderVariables konzentrieren.

Weitere Informationen finden Sie unter Geplante Entfernung und Problem 364338810.

Dawn-Updates

Es ist nicht mehr möglich, ein Tiefentextur-Muster mit einem Filter-Sampler zu erfassen. Zur Erinnerung: Eine Tiefentextur kann nur mit einem nicht filternden oder einem Vergleichs-Sampler verwendet werden. Siehe Problem 379788112.

Die Strukturen WGPURequiredLimits und WGPUSupportedLimits wurden in WGPULimits zusammengeführt. Siehe Problem 374263404.

Die folgenden Strukturen wurden umbenannt. Siehe Problem 42240793.

  • WGPUImageCopyBuffer ist jetzt WGPUTexelCopyBufferInfo
  • WGPUImageCopyTexture ist jetzt WGPUTexelCopyTextureInfo
  • WGPUTextureDataLayout ist jetzt WGPUTexelCopyBufferLayout

Die Mitglieder subgroupMinSize und subgroupMaxSize wurden der Struktur WGPUAdapterInfo hinzugefügt. Siehe webgpu-headers-PR.

Die Nutzung der Dawn API in Metal kann jetzt mit der Umgebungsvariablen DAWN_TRACE_FILE_BASE erfasst werden. Dabei wird eine .gputrace-Datei gespeichert, die später in den Metal-Debugger von Xcode geladen werden kann. Weitere Informationen finden Sie in der Debugging Dawn-Dokumentation.

Dies sind nur einige der wichtigsten Highlights. Eine vollständige Liste der Commits

Das ist neu bei WebGPU

Eine Liste aller Themen, die in der Reihe Was ist neu in WebGPU behandelt wurden.

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