Novidades da WebGPU (Chrome 135)

François Beaufort
François Beaufort

Publicado em 26 de março de 2025

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

Antes, a criação de um layout de grupo de vinculação vazio exigia a adição de um grupo de vinculação sem vinculações, o que era inconveniente. Isso não é mais necessário, porque agora os layouts de grupo de vinculação nulo são permitidos e ignorados ao criar um layout de pipeline. Isso deve facilitar o desenvolvimento.

Por exemplo, você pode criar um pipeline que usa apenas os layouts 0 e 2 do grupo de vinculação. Você pode atribuir o layout de vinculação de grupo 1 aos dados de fragmento e o layout de vinculação de grupo 2 aos dados de vértice e renderizar sem um sombreador 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 áreas de renderização

Os requisitos para a validação da viewport foram relaxados para permitir que as viewports ultrapassem os limites do destino de renderização. Isso é especialmente útil para desenhar elementos 2D, como a interface que pode se estender para fora da viewport 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 facilitado ao modo de compatibilidade experimental no Android

A flag chrome://flags/#enable-unsafe-webgpu sozinha agora ativa todos os recursos necessários para o modo de compatibilidade da WebGPU experimental no Android. Com isso, é possível solicitar um GPUAdapter no modo de compatibilidade com a opção featureLevel: "compatibility" e até mesmo ter acesso ao back-end do OpenGL ES em dispositivos sem suporte ao Vulkan. Confira o exemplo 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 da WebGPU mostra um GPUAdapter no modo de compatibilidade em um dispositivo Android.
Informações do adaptador do modo de compatibilidade em webgpureport.org.

O limite de maxInterStageShaderComponents foi removido

Como anunciado anteriormente, o limite de 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 os estágios do sombreador.
  • Discrepâncias menores: embora haja pequenas diferenças na forma como os dois limites são calculados, essas diferenças são pequenas e podem ser gerenciadas de forma eficaz dentro do limite de maxInterStageShaderVariables.
  • Simplificação: a remoção de maxInterStageShaderComponents simplifica a interface do sombreador e reduz a complexidade para os desenvolvedores. Em vez de gerenciar dois limites separados com diferenças sutis, eles podem se concentrar no maxInterStageShaderVariables mais abrangente e com nome mais apropriado.

Consulte intent to remove e problema 364338810.

Atualizações do Dawn

Não é mais possível usar um sampler de filtragem para amostrar uma textura de profundidade. Vale lembrar que uma textura de profundidade só pode ser usada com um amostrador de comparação ou sem filtragem. Consulte o problema 379788112.

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

Os seguintes structs foram renomeados. Consulte o problema 42240793.

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

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

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 Metal do XCode. Consulte a documentação Debugging Dawn.

Isso abrange apenas alguns dos principais destaques. Confira a lista completa de confirmações.

Novidades na WebGPU

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

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