Novidades da WebGPU (Chrome 135)

François Beaufort
François Beaufort

Publicado em: 26 de março de 2025

Permitir a criação de um layout de pipeline com um layout de grupo de vinculação nulo

Antes, para criar um layout de grupo de vinculação vazio, era necessário adicionar um grupo de vinculação com zero vinculações, o que era inconveniente. Isso não é mais necessário, já que layouts de grupo de vinculação nulos agora são permitidos e ignorados ao criar um layout de pipeline. Isso facilita o desenvolvimento.

Por exemplo, você pode criar um pipeline que use apenas os layouts de grupo de vinculação 0 e 2. Você pode atribuir o layout do grupo de vinculação 1 aos dados de fragmento e o layout do grupo de vinculação 2 aos dados de vértice e, em seguida, renderizar sem um shader de fragmento. Consulte o problema 377836524.

const bgl0 = myDevice.createBindGroupLayout({ entries: myGlobalEntries });
const bgl1 = myDevice.createBindGroupLayout({ entries: myFragmentEntries });
const bgl2 = myDevice.createBindGroupLayout({ entries: myVertexEntries });

// Create a pipeline layout that will be used to render without a fragment shader.
const myPipelineLayout = myDevice.createPipelineLayout({
  bindGroupLayouts: [bgl0, null, bgl2],
});

Permitir que as janelas de visualização se estendam além dos limites das renderizações de destino

Os requisitos para validação da janela de visualização foram flexibilizados para permitir que elas ultrapassem os limites do destino de renderização. Isso é especialmente útil para desenhar elementos 2D, como uma interface que pode se estender para fora da janela de visualização atual. Consulte o problema 390162929.

const passEncoder = myCommandEncoder.beginRenderPass({
  colorAttachments: [
    {
      view: myColorTexture.createView(),
      loadOp: "clear",
      storeOp: "store",
    },
  ],
});

// Set a viewport that extends past the render target's bounds by 8 pixels
// in all directions.
passEncoder.setViewport(
  /*x=*/ -8,
  /*y=*/ -8,
  /*width=*/ myColorTexture.width + 16,
  /*height=*/ myColorTexture.height + 16,
  /*minDepth=*/ 0,
  /*maxDepth=*/ 1,
);

// Draw geometry and complete the render pass as usual.

Acesso mais fácil ao modo de compatibilidade experimental no Android

A flag chrome://flags/#enable-unsafe-webgpu agora ativa todos os recursos necessários para o modo de compatibilidade experimental do WebGPU no Android. Assim, você pode solicitar um GPUAdapter no modo de compatibilidade com a opção featureLevel: "compatibility" e até mesmo acessar o back-end do OpenGL ES em dispositivos sem suporte ao Vulkan. Confira o exemplo a seguir e o problema dawn:389876644.

// Request a GPUAdapter in compatibility mode.
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });
A página de relatório do WebGPU mostra um GPUAdapter no modo de compatibilidade em um dispositivo Android.
Informações do adaptador do modo de compatibilidade em webgpureport.org.

Remover o limite maxInterStageShaderComponents

Como anunciado anteriormente, o limite maxInterStageShaderComponents foi removido devido a uma combinação de fatores:

  • Redundância com maxInterStageShaderVariables: esse limite já tem uma finalidade semelhante, controlando a quantidade de dados transmitidos entre as fases do shader.
  • Pequenas discrepâncias: embora haja pequenas diferenças na forma como os dois limites são calculados, elas são pequenas e podem ser gerenciadas de maneira eficaz dentro do limite de maxInterStageShaderVariables.
  • Simplificação: a remoção de maxInterStageShaderComponents simplifica a interface do shader e reduz a complexidade para os desenvolvedores. Em vez de gerenciar dois limites separados com diferenças sutis, eles podem se concentrar no maxInterStageShaderVariables, que tem um nome mais adequado e é mais abrangente.

Consulte intenção de remoção e problema 364338810.

Atualizações do amanhecer

Não é mais possível usar um sampler de filtragem para fazer amostragem de uma textura de profundidade. Uma textura de profundidade só pode ser usada com um sampler sem filtragem ou de comparação. Consulte o problema 379788112.

As estruturas WGPURequiredLimits e WGPUSupportedLimits foram simplificadas em WGPULimits. Consulte o problema 374263404.

As structs a seguir foram renomeadas. Consulte o problema 42240793.

  • WGPUImageCopyBuffer agora é WGPUTexelCopyBufferInfo
  • WGPUImageCopyTexture agora é WGPUTexelCopyTextureInfo
  • WGPUTextureDataLayout agora é WGPUTexelCopyBufferLayout

Os membros subgroupMinSize e subgroupMaxSize foram adicionados à estrutura WGPUAdapterInfo. Consulte o PR webgpu-headers.

Agora é possível rastrear o uso da API Dawn no Metal ao executar o programa com a variável de ambiente DAWN_TRACE_FILE_BASE, que salva um arquivo .gputrace que pode ser carregado mais tarde no depurador do Metal do Xcode. Consulte a documentação Debugging Dawn (em inglês).

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