Novidades da WebGPU (Chrome 130)

François Beaufort
François Beaufort

Combinação de duas origens

A combinação de duas saídas de shader de fragmento em um único framebuffer é chamada de fusão de origem dupla. Essa técnica é especialmente útil para aplicativos que exigem operações de mesclagem complexas, como aquelas baseadas em modos de mesclagem Porter-Duff. Ao substituir renderizações subsequentes por uma única renderização, a fusão de duas origens pode melhorar o desempenho e a flexibilidade.

O novo recurso "dual-source-blending" da WebGPU permite usar o atributo @blend_src da WGSL em @location(0) para indicar o índice de origem de combinação e os seguintes fatores de combinação: "src1", "one-minus-src1", "src1-alpha" e "one-minus-src1-alpha". Consulte o snippet a seguir, a entrada do chromestatus e o problema 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...

Melhorias no tempo de compilação de sombreadores no Metal

A equipe do Chrome está aprimorando o Tint, o compilador de linguagem de shader WebGPU, ao introduzir uma representação intermediária (IR, na sigla em inglês) para dispositivos que oferecem suporte ao WebGPU com o back-end Metal. Essa IR, posicionada entre a árvore de sintaxe abstrata (AST) do Tint e o gravador de back-end do Metal, vai tornar o compilador mais eficiente e fácil de manter, beneficiando desenvolvedores e usuários. Os testes iniciais mostram que a nova versão do Tint é até 10 vezes mais rápida ao traduzir os shaders WGSL do Unity para MSL.

Um fluxograma mostra o processo de conversão do código de shader WGSL em instruções de GPU de baixo nível.
Criação de pipeline de renderização no macOS.

Essas melhorias, já acessíveis no Android e no ChromeOS, estão sendo expandidas progressivamente para dispositivos macOS que oferecem suporte ao WebGPU com o back-end Metal. Consulte o problema 42251016.

Descontinuação do requestAdapterInfo() do GPUAdapter

O método assíncrono requestAdapterInfo() do GPUAdapter é redundante, já que os desenvolvedores podem receber o GPUAdapterInfo de maneira síncrona usando o atributo info do GPUAdapter. Por isso, o método requestAdapterInfo() não padrão do GPUAdapter foi descontinuado. Consulte intenção de descontinuar.

O console do DevTools mostra um aviso de descontinuação para requestAdapterInfo().
Aviso de recurso descontinuado para requestAdapterInfo() no Chrome DevTools.

Atualizações do amanhecer

A API C webgpu.h definiu algumas convenções de nomenclatura para structs de extensão. Confira as seguintes mudanças de nome e o problema 42241174.

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

O tipo de atributo depthWriteEnabled de WGPUDepthStencilState muda de booleano para WGPUOptionalBool para refletir melhor os três estados possíveis (verdadeiro, falso e indefinido), como na API JavaScript. Para saber mais, consulte o snippet de código a seguir e o PR webgpu-headers.

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

Isso abrange apenas alguns dos principais destaques. Confira a lista completa de commits.

Novidades no WebGPU

Uma lista de tudo o que foi abordado na série O que há de novo no WebGPU.

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