Novidades do WebGPU (Chrome 144)

François Beaufort
François Beaufort

Publicado em 7 de janeiro de 2026

Extensão subgroup_id da WGSL

A extensão de linguagem subgroup_id da WGSL permite usar os novos valores integrados a seguir em grupos de trabalho quando a extensão subgroups está ativada:

  • subgroup_id: fornece o ID do subgrupo de uma invocação no grupo de trabalho atual.
  • num_subgroups: informa o número de subgrupos presentes no grupo de trabalho.

Antes, para indexar a memória usando IDs de invocação de subgrupo, era necessário reconstruir um ID de subgrupo (normalmente por operações atômicas) para evitar acessos de memória sobrepostos. Agora, você pode usar subgroup_id para preencher a outra metade dessa equação. Como essa funcionalidade ainda não está disponível no back-end D3D, ela é emulada. É seguro criar uma equivalência para local_invocation_index como subgroup_invocation_id + subgroup_size * subgroup_id. Observação: há casos em que os subgrupos não estão completos.

Essa extensão de linguagem pode ser detectada por recursos usando navigator.gpu.wgslLanguageFeatures. Recomendamos usar uma diretiva requires para sinalizar a possibilidade de não portabilidade com requires subgroup_id; na parte de cima do código do sombreador WGSL. Confira o exemplo a seguir e a intenção de envio.

if (!navigator.gpu.wgslLanguageFeatures.has("subgroup_id")) {
  throw new Error(`WGSL subgroup_id and num_subgroups built-in values are not available`);
}

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
const device = await adapter.requestDevice({ requiredFeatures: ["subgroups"] });

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;
  requires subgroup_id;

  @compute @workgroup_size(64, 1, 1)
  fn main(@builtin(subgroup_id) subgroup_id : u32,
          @builtin(num_subgroups) num_subgroups : u32) {
    // TODO: Use subgroup_id and num_subgroups values.
  }`,
});

Extensão uniform_buffer_standard_layout da WGSL

A extensão de linguagem uniform_buffer_standard_layout da WGSL permite que buffers uniformes usem as mesmas restrições de layout de memória que buffers de armazenamento, o que facilita o compartilhamento de estruturas de dados nos dois tipos de buffers. Isso significa que os buffers uniformes não precisam mais ter alinhamento de 16 bytes em elementos de matriz ou preencher deslocamentos de estrutura aninhada para um múltiplo de 16 bytes.

Essa extensão de linguagem pode ser detectada por recursos usando navigator.gpu.wgslLanguageFeatures. Recomendamos usar uma diretiva requires para sinalizar a possibilidade de não portabilidade com requires uniform_buffer_standard_layout; na parte de cima do código do sombreador WGSL. Confira o exemplo a seguir e a intenção de envio.

if (!navigator.gpu.wgslLanguageFeatures.has("uniform_buffer_standard_layout")) {
  throw new Error(`WGSL uniform buffer standard layout is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires uniform_buffer_standard_layout;

  struct S {
      x: f32
  }
  struct Uniforms {
      a: S,
      b: f32
      // b is at offset 4. Without standard layout, alignment rules would
      // force b to be at offset 16 (or a multiple of 16), and you would have
      // to add extra fields or use an @align attribute.
  }

  @group(0) @binding(0) var<uniform> u: Uniforms;

  @fragment fn fs_main() -> @location(0) vec4<f32> {
      return vec4<f32>(u.a.x);
  }`,
});

WebGPU no Linux

A equipe do Chrome está lançando cuidadosamente a WebGPU para Linux, começando com suporte a GPUs Intel Gen12+, mas com um plano provisório para expandir para mais dispositivos (AMD, NVIDIA). Essa implementação usa uma arquitetura em que a WebGPU usa o Vulkan e o restante do Chromium permanece no OpenGL, exercendo caminhos de código bons e conhecidos. Consulte o problema 442791440.

writeBuffer e writeTexture mais rápidos

writeBuffer() e writeTexture() foram otimizados no Chrome, resultando em ganhos de performance até duas vezes melhores do que a versão anterior, dependendo do tamanho dos dados transferidos. Essa mudança também afeta todos os usuários da implementação do Dawn Wire. Consulte o problema 441900745.

Atualizações do Dawn

A equipe de GPU do Android publicou a primeira versão Alfa das vinculações do Kotlin para WebGPU no Android, disponível usando o Jetpack. O pacote androidx.webgpu oferece aos desenvolvedores Android acesso a uma API de GPU moderna usando o Kotlin, ignorando os problemas legados do OpenGL ou a complexidade do Vulkan. Esse é um desenvolvimento interessante para o ecossistema.

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

Novidades na WebGPU

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

Chrome 149-150

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