Novidades da WebGPU (Chrome 125)

François Beaufort
François Beaufort

O número de recursos da WebGPU pode parecer um pouco escasso, mas alguns avanços importantes estão a caminho. As próximas versões vão incluir recursos como melhorias na velocidade de compilação de sombreadores e mudanças no modelo assíncrono da implementação usando o WGPUFuture.

Subgrupos (recurso em desenvolvimento)

O recurso de subgrupos ativa o paralelismo no nível do chip, permitindo que linhas de execução em um grupo se comuniquem e realizem operações matemáticas coletivas (por exemplo, calcular a soma de 16 números). Isso oferece uma forma altamente eficiente de compartilhamento de dados entre linhas de execução.

As operações de subgrupo são compatíveis com as APIs de GPU modernas, mas os detalhes de nomenclatura e implementação variam. A equipe do Chrome identificou semelhanças e agora está trabalhando para padronizar esse recurso. Confira a proposta e comente se tiver dúvidas.

Há uma implementação mínima e não padronizada de subgrupos por trás da flag "Recursos experimentais da plataforma Web experimental" em chrome://flags/#enable-experimental-web-platform-features para que os desenvolvedores possam testar e compartilhar feedback, porque os benefícios reais ainda não foram comprovados no contexto da WebGPU.

Quando o recurso "chromium-experimental-subgroups" estiver disponível em uma GPUAdapter, solicite um GPUDevice com ele para receber suporte a subgrupos experimentais na WGSL e verificar os limites minSubgroupSize e maxSubgroupSize.

Também é necessário ativar explicitamente essa extensão no código WGSL com enable chromium_experimental_subgroups. Quando esse recurso estiver ativado, você terá acesso às seguintes adições:

  • subgroup_invocation_id: um valor integrado para o índice da linha de execução dentro do subgrupo.
  • subgroup_size: um valor integrado para acesso ao tamanho do subgrupo.
  • subgroupBallot(value): Retorna um conjunto de campos de bits em que o bit correspondente a subgroup_invocation_id será 1 se value for verdadeiro para essa invocação ativa e 0 se não for.
  • subgroupBroadcast(value, id): transmite o value da invocação com o subgroup_invocation_id correspondente ao id para todas as invocações no subgrupo. Observação: id precisa ser uma constante de tempo de compilação.

O snippet de código abaixo fornece uma base para testar e descobrir o potencial dos subgrupos.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-subgroups")) {
  throw new Error("Experimental subgroups support is not available");
}
// Explicitly request experimental subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable chromium_experimental_subgroups;

  @compute @workgroup_size(64) fn main(
      @builtin(global_invocation_id) global_id : vec3u,
      @builtin(subgroup_size) sg_size : u32,
      @builtin(subgroup_invocation_id) sg_id : u32) {
    // TODO: Use subgroupBallot() and subgroupBroadcast().
  }`,
});

Renderizar para uma fatia de textura 3D

Agora é possível renderizar diretamente em fatias de texturas 3D nas passagens de renderização, ampliando os recursos para além da renderização comum de textura 2D, com o novo membro depthSlice em uma GPURenderPassColorAttachment. Essa adição permite, por exemplo, criar cenas e efeitos baseados em vóxel, renderizando diretamente em volumes de textura 3D. Consulte issue dawn:1020.

Atualizações ao amanhecer

Confira a lista completa de confirmações (link em inglês).

Novidades da WebGPU

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

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Google Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Google Chrome 113