Nowości w WebGPU (Chrome 130)

François Beaufort
François Beaufort

Połączenie z dwoma źródłami

Łączenie danych wyjściowych z mechanizmu cieniowania fragmentów w jednym buforze klatek jest nazywane łączeniem dwóch źródeł. Ta metoda jest szczególnie przydatna w aplikacjach wymagających złożonych operacji mieszania, takich jak oparte na trybach mieszania Porter-Duff. Zastąpienie kolejnych przejść renderowania jednym przejściem renderowania może zwiększyć wydajność i elastyczność.

Nowa funkcja WebGPU "dual-source-blending" umożliwia użycie atrybutu WGSL @blend_src w obiekcie @location(0) w celu wskazania indeksu źródła mieszania oraz tych współczynników mieszania: "src1", "one-minus-src1", "src1-alpha" i "one-minus-src1-alpha". Zobacz ten fragment kodu, wpis chromestatus i 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...

Skrócony czas kompilacji cieniowania w przypadku metalu

Zespół Chrome ulepsza Tint, czyli kompilator języka WebGPU, przez wprowadzenie reprezentacji pośredniej (IR) dla urządzeń, które obsługują WebGPU z backendem Metal. Dzięki temu podczerwień, który znajduje się między abstrakcyjnym drzewem składni Tint (AST) a backendem systemu Metal, sprawi, że kompilator będzie bardziej wydajny i łatwy w utrzymaniu, co w końcu zwiększy wydajność zarówno dla programistów, jak i użytkowników. 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, dostępne już na Androidzie i ChromeOS, są stopniowo rozszerzane na urządzenia z macOS, które obsługują WebGPU z backendem Metal. Zobacz problem 42251016.

Wycofanie funkcji GPUAdapter requestAdapterInfo()

Metoda asynchroniczna GPUAdapter requestAdapterInfo() jest nadmiarowa, ponieważ programiści mogą już synchronicznie pobierać dane GPUAdapterInfo za pomocą atrybutu GPUAdapter info. Z tego powodu niestandardowa metoda GPUAdapter requestAdapterInfo() została wycofana. Zobacz wycofane produkty.

W konsoli Narzędzi deweloperskich wyświetlane jest 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 informacjami o zmianach nazwy i problemie o numerze 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 depthWriteEnabled w WGPUDepthStencilState zmienia się z wartości logicznej na WGPUOptionalBool, aby lepiej odzwierciedlić 3 możliwe stany (prawda, fałsz i niezdefiniowany) tak jak w interfejsie JavaScript API. Aby dowiedzieć się więcej, zapoznaj się z tym fragmentem kodu i tabelą webgpu-headers PR.

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

To tylko niektóre z najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.

Co nowego w WebGPU

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

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