Neuerungen bei der WebGPU (Chrome 130)

François Beaufort
François Beaufort

Zusammenführen von Daten aus zwei Quellen

Die Kombination von zwei Fragmentshader-Ausgaben in einem einzigen Framebuffer wird als Dual-Source-Blending bezeichnet. Diese Technik ist besonders nützlich für Anwendungen, die komplexe Überblendungsvorgänge erfordern, z. B. solche, die auf Porter-Duff-Überblendungsmodi basieren. Durch das Ersetzen nachfolgender Renderingpässe durch einen einzigen Renderingpass kann die Leistung und Flexibilität durch die Dual-Source-Mischung verbessert werden.

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...

Verbesserte Shader-Kompilierungszeiten unter Metal

Das Chrome-Team verbessert Tint, den WebGPU-Shadersprachen-Compiler, durch die Einführung einer Zwischendarstellung (IR) für Geräte, die WebGPU mit dem Metal-Backend 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 zeigen, dass die neue Version von Tint bis zu zehnmal schneller ist, wenn die WGSL-Shader von Unity in MSL übersetzt werden.

Ein Flussdiagramm zeigt die Umwandlung von WGSL-Shadercode in Low-Level-GPU-Anweisungen.
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 der GPUAdapter-Methode „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 finden Sie unter Ankündigung der Einstellung.

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. Weitere Informationen finden Sie in den folgenden Namensänderungen und im 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

Hier werden nur einige der wichtigsten Vorteile behandelt. 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 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