Neuigkeiten bei WebGPU (Chrome 135)

François Beaufort
François Beaufort

Veröffentlicht: 26. März 2025

Erstellen von Pipeline-Layouts mit Null-Bindungsgruppen-Layout zulassen

Bisher war es umständlich, ein leeres Bindungsgruppenlayout zu erstellen, da eine Bindungsgruppe mit null Bindungen hinzugefügt werden musste. Das ist nicht mehr erforderlich, da Null-Bindungsgruppenlayouts jetzt zulässig sind und beim Erstellen eines Pipeline-Layouts ignoriert werden. Das sollte die Entwicklung erleichtern.

Sie möchten beispielsweise eine Pipeline erstellen, in der nur die Bindungsgruppenlayouts 0 und 2 verwendet werden. Sie könnten das Bindungsgruppenlayout 1 den Fragmentdaten und das Bindungsgruppenlayout 2 den Vertexdaten zuweisen und dann ohne Fragment-Shader rendern. Weitere Informationen finden Sie unter 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 Renderziele hinausgehen

Die Anforderungen für die Darstellungsbereich-Validierung wurden gelockert, sodass Darstellungsbereiche über die Grenzen des Renderziels hinausgehen können. Das ist besonders nützlich, um 2D-Elemente wie Benutzeroberflächen zu zeichnen, die sich möglicherweise über den aktuellen Viewport hinaus erstrecken. 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

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

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

Entfernen des Limits für „maxInterStageShaderComponents“

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

  • Redundanz mit maxInterStageShaderVariables: Dieses Limit erfüllt bereits einen ähnlichen Zweck und steuert die Menge der Daten, die zwischen Shader-Phasen übergeben werden.
  • Geringfügige Abweichungen: Die beiden Limits werden zwar leicht unterschiedlich berechnet, die Unterschiede sind aber gering und können effektiv innerhalb des maxInterStageShaderVariables-Limits berücksichtigt werden.
  • Vereinfachung: Durch das Entfernen von maxInterStageShaderComponents wird die Shader-Schnittstelle optimiert und die Komplexität für Entwickler verringert. Statt zwei separate Limits mit geringfügigen Unterschieden zu verwalten, können sie sich auf das umfassendere Limit maxInterStageShaderVariables konzentrieren, dessen Name besser passt.

Weitere Informationen finden Sie unter Absicht zur Entfernung und Problem 364338810.

Änderungen bei Dawn

Es ist nicht mehr möglich, eine Tiefentextur mit einem Filter-Sampler zu sampeln. Zur Erinnerung: Eine Tiefentextur kann nur mit einem Sampler ohne Filterung oder einem Vergleichssampler verwendet werden. Weitere Informationen finden Sie unter Problem 379788112.

Die Strukturen WGPURequiredLimits und WGPUSupportedLimits wurden in WGPULimits zusammengeführt. Weitere Informationen finden Sie unter Problem 374263404.

Die folgenden Strukturen wurden umbenannt. Weitere Informationen finden Sie unter 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. Weitere Informationen finden Sie im WebGPU-Headers-PR.

Die Dawn API-Nutzung in Metal kann jetzt nachvollzogen werden, wenn Sie Ihr Programm mit der Umgebungsvariablen DAWN_TRACE_FILE_BASE ausführen. Dadurch wird eine .gputrace-Datei gespeichert, die später in den Metal Debugger von Xcode geladen werden kann. Weitere Informationen finden Sie in der Dokumentation Dawn debuggen.

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

Neu bei WebGPU

Eine Liste aller Themen, die in der Reihe Neu in WebGPU behandelt wurden.

Chrome 155–156

Chrome 153–154

Chrome 151–152

Chrome 149–150

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