Neuigkeiten bei WebGPU (Chrome 135)

François Beaufort
François Beaufort

Veröffentlicht am 26. März 2025

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

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

Sie möchten beispielsweise eine Pipeline erstellen, die nur die Bindungsgruppenlayouts 0 und 2 verwendet. Sie könnten Bindungsgruppenlayout 1 Fragmentdaten und Bindungsgruppenlayout 2 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 über die Grenzen der Renderziele hinaus erweitern

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

Das Flag chrome://flags/#enable-unsafe-webgpu allein aktiviert jetzt alle Funktionen, die für den experimentellen WebGPU-Kompatibilitätsmodus unter Android erforderlich sind. So können Sie mit der Option featureLevel: "compatibility" einen GPUAdapter im Kompatibilitätsmodus 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 „maxInterStageShaderComponents“

Wie bereits angekündigt, wird das Limit „maxInterStageShaderComponents“ aus folgenden Gründen entfernt:

  • Redundanz mit maxInterStageShaderVariables: Dieses Limit erfüllt bereits einen ähnlichen Zweck und steuert die Datenmenge, die zwischen Shader-Phasen übergeben wird.
  • Geringfügige Abweichungen: Die beiden Limits werden zwar unterschiedlich berechnet, die Unterschiede sind aber gering und können effektiv innerhalb des maxInterStageShaderVariables-Limits verwaltet werden.
  • Vereinfachung: Durch das Entfernen von maxInterStageShaderComponents wird die Shader-Schnittstelle optimiert und die Komplexität für Entwickler reduziert. 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 intent to remove und Problem 364338810.

Dawn-Updates

Es ist nicht mehr möglich, eine Tiefentextur mit einem Filtering-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. Siehe Problem 374263404.

Die folgenden Strukturen wurden umbenannt. Siehe Problem 42240793.

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

Die Elemente subgroupMinSize und subgroupMaxSize wurden der Struktur WGPUAdapterInfo hinzugefügt. Weitere Informationen finden Sie im WebGPU-Headers-PR.

Die Verwendung der Dawn API in Metal kann jetzt nachverfolgt werden, wenn Sie Ihr Programm mit der Umgebungsvariable 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 zum Debuggen von Dawn.

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

Neues zu WebGPU

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

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