Novidades da WebGPU (Chrome 126)

François Beaufort
François Beaufort

Aumento do limite de maxTextureArrayLayers

O valor máximo permitido para a profundidade ou contagem de camadas de uma textura 2D é 256 por padrão. Agora é possível solicitar até 2048 usando o limite maxTextureArrayLayers quando compatível. Consulte o exemplo a seguir e o problema 42241514.

const adapter = await navigator.gpu.requestAdapter();
if (adapter.limits.maxTextureArrayLayers < 30) {
  // When the desired limit isn't supported, take action to either fall back to
  // a code path that does not require the higher limit or notify the user that
  // their device does not meet minimum requirements.
}

// Request highest limit of max texture array layers attributes.
const device = await adapter.requestDevice({
  requiredLimits: { maxTextureArrayLayers: 2048 }
});

Otimização do upload de buffer para o back-end do Vulkan

Um caminho rápido agora está disponível ao chamar o método writeBuffer() da GPUQueue para o back-end do Vulkan. Os dados agora podem ser gravados diretamente no buffer de destino, eliminando a necessidade de uma cópia e sincronização extras. Essa otimização reduz o tráfego de memória necessário para fazer upload de dados para a GPU.

A otimização de caminho rápido exige que a memória do buffer seja visível para o host e sem operações de GPU pendentes. Consulte o problema 42242084.

Melhorias no tempo de compilação do sombreador

A equipe do Chrome está aprimorando a eficiência do Tint, o compilador da linguagem de sombreador da WebGPU. Atualmente, o Tint modifica a árvore de sintaxe abstrata (AST, na sigla em inglês) do código do sombreador várias vezes antes de gerar o código de máquina, um processo que consome muitos recursos em algumas plataformas. Para otimizar isso, uma nova representação intermediária (IR, na sigla em inglês) está sendo introduzida, juntamente com back-ends reformulados que a usam. O objetivo dessa mudança é acelerar a compilação do sombreador.

A criação do pipeline de renderização envolve a conversão de WGSL para SPIR-V com o compilador Tint e, em seguida, para ISA com o compilador Driver.
Criação de pipeline de renderização no ChromeOS.

Essas melhorias, já acessíveis no Android, estão sendo expandidas progressivamente para dispositivos ChromeOS que oferecem suporte à WebGPU com o back-end do Vulkan. Consulte o problema 42250751.

Os buffers de comando enviados precisam ser exclusivos

Cada GPUCommandBuffer enviado à GPUQueue com o método submit() precisa ser exclusivo. Caso contrário, um erro de validação será gerado. Esse era um bug de especificação. Consulte o problema 42241492.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const commandEncoder = device.createCommandEncoder();
const commandBuffer = commandEncoder.finish();

device.queue.submit([commandBuffer, commandBuffer]);
// ⚠️ Validation fails because command buffers are not unique.

Atualizações do Dawn

O wrapper C++ webgpu_cpp.h agora é apenas de cabeçalho, simplificando o uso e permitindo uma integração mais fácil com wrappers C++ alternativos. Consulte o problema 40195122.

A API C webgpu.h não expõe mais a noção de objetos Swapchain. Essa mudança tem como objetivo se alinhar à API JavaScript. A configuração interna agora é feita pelo método Configure() do novo objeto wgpu::Surface, que está sujeito a modificações futuras. Confira um exemplo na documentação Criar um app com a WebGPU. Consulte o problema 42241264.

Confira a lista exaustiva de commits.

Novidades na WebGPU

Uma lista de tudo o que foi abordado na série Novidades na WebGPU.

Chrome 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

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