Neuerungen bei der WebGPU (Chrome 130)

François Beaufort
François Beaufort

Dual-Source-Mischung

Die Kombination von zwei Fragment-Shader-Ausgaben in einem einzelnen Framebuffer wird als Dual Source Blending bezeichnet. Diese Technik ist besonders nützlich für Anwendungen, die komplexe Mischvorgänge erfordern, z. B. solche, die auf Porter-Duff-Mischmodi basieren. Durch das Ersetzen nachfolgender Renderingdurchläufe durch einen einzigen Renderingdurchgang kann das Zusammenführen mit zwei Quellen die Leistung und Flexibilität verbessern.

Mit der neuen "dual-source-blending"-WebGPU-Funktion können Sie das WGSL-Attribut @blend_src an @location(0) verwenden, um den Index der Mischquelle und die folgenden Mischungsfaktoren anzugeben: "src1", "one-minus-src1", "src1-alpha" und "one-minus-src1-alpha". Weitere Informationen finden Sie im folgenden Snippet, im chromestatus-Eintrag und in Problem 341973423.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("dual-source-blending")) {
  throw new Error("Dual source blending support is not available");
}
// Explicitly request dual source blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["dual-source-blending"],
});

const code = `
  enable dual_source_blending;

  struct FragOut {
    @location(0) @blend_src(0) color : vec4f,
    @location(0) @blend_src(1) blend : vec4f,
  }

  @fragment fn main() -> FragOut {
    var output : FragOut;
    output.color = vec4f(1.0, 1.0, 1.0, 1.0);
    output.blend = vec4f(0.5, 0.5, 0.5, 0.5);
    return output;
  }
`;

const shaderModule = device.createShaderModule({ code });
// Create a render pipeline with this shader module
// and run the shader on the GPU...

Metal-Optimierung bei der Zusammenstellung von Shader-Inhalten

Das Chrome-Team verbessert den WebGPU-Shader-Compiler Tint und führt eine Zwischendarstellung (Intermediate Repräsentation) für Geräte ein, die WebGPU mit Metal-Back-End unterstützen. Diese IR, die zwischen dem abstrakten Syntaxbaum (AST) von Tint und dem Metal-Backend-Writer positioniert ist, macht den Compiler effizienter und wartbarer. Das kommt letztendlich sowohl Entwicklern als auch Nutzern zugute. Erste Tests haben gezeigt, dass die neue Version von Tint bis zu zehnmal schneller ist, wenn die WGSL-Shader von Unity in MSL übersetzt werden.

Ein Flussdiagramm zeigt, wie WGSL-Shader-Code in GPU-Anweisungen auf niedriger Ebene konvertiert wird.
Erstellen einer Renderpipeline unter macOS

Diese Verbesserungen, die bereits auf Android- und ChromeOS-Geräten verfügbar sind, werden nach und nach auf macOS-Geräte ausgeweitet, die WebGPU mit dem Metal-Backend unterstützen. Siehe Problem 42251016.

Einstellung von GPUAdapter requestAdapterInfo()

Die asynchrone Methode „GPUAdapter requestAdapterInfo()“ ist redundant, da Entwickler GPUAdapterInfo bereits synchron über das Attribut „GPUAdapter info“ abrufen können. Daher wird die nicht standardmäßige GPUAdapter-Methode requestAdapterInfo() jetzt eingestellt. Weitere Informationen

In der Entwicklertools-Konsole wird eine Warnung zur Einstellung von requestAdapterInfo() angezeigt.
Warnung zu eingestellten Funktionen für requestAdapterInfo() in den Chrome-Entwicklertools

Dawn-Updates

Die C-API webgpu.h definiert einige Namenskonventionen für Erweiterungsstrukturen. Beachten Sie die folgenden Namensänderungen und Problem 42241174.

WGPURenderPassDescriptor Erweiterungen
WGPURenderPassDescriptorMaxDrawCount -> WGPURenderPassMaxDrawCount
WGPUShaderModuleDescriptor Erweiterungen
WGPUShaderModuleSPIRVDescriptor -> WGPUShaderSourceSPIRV
WGPUShaderModuleWGSLDescriptor -> WGPUShaderSourceWGSL
WGPUSurfaceDescriptor Erweiterungen
WGPUSurfaceDescriptorFromMetalLayer -> WGPUSurfaceSourceMetalLayer
WGPUSurfaceDescriptorFromWindowsHWND -> WGPUSurfaceSourceWindowsHWND
WGPUSurfaceDescriptorFromXlibWindow -> WGPUSurfaceSourceXlibWindow
WGPUSurfaceDescriptorFromWaylandSurface -> WGPUSurfaceSourceWaylandSurface
WGPUSurfaceDescriptorFromAndroidNativeWindow -> WGPUSurfaceSourceAndroidNativeWindow
WGPUSurfaceDescriptorFromXcbWindow -> WGPUSurfaceSourceXCBWindow
WGPUSurfaceDescriptorFromCanvasHTMLSelector -> WGPUSurfaceSourceCanvasHTMLSelector_Emscripten

Der depthWriteEnabled-Attributtyp von WGPUDepthStencilState wird von „boolean“ zu „WGPUOptionalBool“ geändert, um die drei möglichen Status (wahr, falsch und undefiniert) wie in der JavaScript API besser widerzuspiegeln. Weitere Informationen finden Sie im folgenden Code-Snippet und im PR-Artikel zu webgpu-headers.

wgpu::DepthStencilState depthStencilState = {};
depthStencilState.depthWriteEnabled = wgpu::OptionalBool::True; // Undefined by default

Dies sind nur einige der wichtigsten Highlights. 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 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