Neuerungen bei der WebGPU (Chrome 130)

François Beaufort
François Beaufort

Zusammenführen von zwei Quellen

Das Kombinieren von zwei Fragment-Shader-Ausgaben in einem einzigen 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 Rendering-Durchläufe durch einen einzelnen Rendering-Durchlauf kann die Leistung und Flexibilität durch Dual-Source-Blending verbessert werden.

Mit der neuen WebGPU-Funktion "dual-source-blending" können Sie das WGSL-Attribut @blend_src bei @location(0) verwenden, um den Index der Mischquelle und die folgenden Mischfaktoren 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...

Verbesserte Shader-Kompilierungszeit auf Metal

Das Chrome-Team verbessert Tint, den Compiler für die WebGPU-Shader-Sprache, durch die Einführung einer Zwischenrepräsentation (Intermediate Representation, IR) für Geräte, die WebGPU mit dem Metal-Backend unterstützen. Diese IR, die sich zwischen dem abstrakten Syntaxbaum (AST) von Tint und dem Metal-Backend-Writer befindet, macht den Compiler effizienter und wartungsfreundlicher, was letztendlich sowohl Entwicklern als auch Nutzern zugutekommt. Erste Tests zeigen, dass die neue Version von Tint beim Übersetzen von WGSL-Shadern von Unity in MSL bis zu zehnmal schneller ist.

Ein Flussdiagramm zeigt den Prozess der Konvertierung von WGSL-Shader-Code in GPU-Anweisungen auf niedriger Ebene.
Erstellung der 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 „requestAdapterInfo()“ von GPUAdapter ist überflüssig, da Entwickler GPUAdapterInfo bereits synchron über das GPUAdapter-Attribut „info“ abrufen können. Daher wird die nicht standardmäßige GPUAdapter-Methode „requestAdapterInfo()“ jetzt eingestellt. Weitere Informationen finden Sie unter Absicht zur Einstellung.

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

Dawn-Updates

In der C-API „webgpu.h“ sind einige Namenskonventionen für Erweiterungs-Structs definiert. Weitere Informationen finden Sie in den folgenden Namensänderungen und in 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 Attributtyp depthWriteEnabled von WGPUDepthStencilState wird von „boolean“ zu WGPUOptionalBool geändert, um die drei möglichen Status (true, false und undefined) wie in der JavaScript API besser widerzuspiegeln. Weitere Informationen finden Sie im folgenden Code-Snippet und im webgpu-headers-PR.

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

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