Nowości w WebGPU (Chrome 130)

François Beaufort
François Beaufort

Mieszanie danych z 2 źródeł

Połączenie 2 wyjść fragment shadera w jeden bufor ramki nazywa się miksem podwójnego źródła. Ta technika jest szczególnie przydatna w przypadku aplikacji, które wymagają złożonych operacji mieszania, takich jak te oparte na trybach mieszania Portera-Duffa. Zastąpienie kolejnych przejść renderowania jednym przejściem renderowania może zwiększyć wydajność i elastyczność.

Nowa funkcja "dual-source-blending" WebGPU umożliwia użycie atrybutu WGSL @blend_src w elementach @location(0), aby oznaczyć indeks źródła mieszania i te czynniki mieszania: "src1", "one-minus-src1", "src1-alpha""one-minus-src1-alpha". Zobacz poniższy fragment kodu, informacje w chromestatusproblem 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...

Ulepszenia czasu kompilacji shaderów na Metalu

Zespół Chrome ulepsza Tint, czyli kompilator języka shadera WebGPU, wprowadzając reprezentację pośrednią (IR) na urządzeniach obsługujących WebGPU z backendem Metal. Ten interfejs pośredniczący, umieszczony między abstrakcyjnym drzewem składniowym (AST) Tinta a programem do zapisywania danych na zapleczu Metal, sprawi, że kompilator będzie wydajniejszy i łatwiejszy w utrzymaniu, co ostatecznie przyniesie korzyści zarówno deweloperom, jak i użytkownikom. Wstępne testy wskazują, że nowa wersja Tint jest nawet 10 razy szybsza podczas przekształcania shaderów WGSL w Unity w shadery MSL.

Schemat blokowy przedstawiający proces konwertowania kodu shadera WGSL na instrukcje na niskim poziomie dla GPU.
Tworzenie potoku renderowania w systemie macOS.

Te ulepszenia, które są już dostępne na Androidzie i ChromeOS, są stopniowo udostępniane na urządzeniach z macOS, które obsługują WebGPU z backendem Metal. Zobacz problem 42251016.

Wycofanie metody requestAdapterInfo() interfejsu GPUAdapter

Metoda asynchroniczna GPUAdapter requestAdapterInfo() jest zbędna, ponieważ deweloperzy mogą już synchronicznie uzyskiwać informacje o GPUAdapter za pomocą atrybutu GPUAdapter info. Dlatego niestandardowa metoda GPUAdapter requestAdapterInfo() została wycofana. Zobacz intencję wycofania.

Konsola Narzędzi deweloperskich wyświetla ostrzeżenie o wycofaniu metody requestAdapterInfo().
Ostrzeżenie o wycofanej funkcji requestAdapterInfo() w Narzędziach deweloperskich w Chrome

Aktualizacje świtu

Interfejs API C webgpu.h definiuje pewne konwencje nazewnictwa struktur rozszerzeń. Zapoznaj się z tymi zmianami nazw i problemem 42241174.

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

Typ atrybutu WGPUDepthStencilState depthWriteEnabled zmienia się z boolean na WGPUOptionalBool, aby lepiej odzwierciedlać 3 możliwe stany (prawda, fałsz i niezdefiniowany) w interfejsie JavaScript API. Więcej informacji znajdziesz w tym fragmencie kodu i PR webgpu-headers.

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

Obejmuje to tylko niektóre najważniejsze informacje. Zapoznaj się z pełną listą commitów.

Co nowego w WebGPU

Lista wszystkich tematów omawianych w cyklu Co nowego w WebGPU.

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