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 asubgroup_invocation_id
será 1 sevalue
for verdadeiro para essa invocação ativa e 0 se não for.subgroupBroadcast(value, id)
: transmite ovalue
da invocação com osubgroup_invocation_id
correspondente aoid
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
- Texturas de armazenamento somente leitura e leitura/gravação
- Suporte para service workers e workers compartilhados
- Novos atributos de informações do adaptador
- Correções de bugs
- Atualizações do amanhecer
Chrome 123
- Suporte para funções integradas do DP4a na WGSL
- Parâmetros de ponteiro irrestrito na WGSL
- Simplificação da sintaxe para desreferenciar compostos na WGSL
- Separar o estado somente leitura para aspectos de estêncil e profundidade
- Atualizações do amanhecer
Chrome 122
- Expandir o alcance com o modo de compatibilidade (recurso em desenvolvimento)
- Aumentar o limite maxVertexAttributes
- Atualizações do amanhecer
Chrome 121
- Suporte para WebGPU no Android
- Usar DXC em vez de FXC para compilação de sombreador no Windows
- Consultas de carimbo de data/hora em passagens de computação e renderização
- Pontos de entrada padrão para módulos de sombreador
- Suporte a display-p3 como espaço de cores GPUExternalTexture
- Informações sobre heaps de memória
- Atualizações do amanhecer
Google Chrome 120
- Suporte para valores de ponto flutuante de 16 bits na WGSL
- Supere os limites
- Mudanças no estado do estêncil de profundidade
- Atualizações de informações sobre os adaptadores
- Quantização de consultas de carimbo de data/hora
- Recursos para limpeza de primavera
Chrome 119
- Texturas flutuantes de 32 bits filtráveis
- Formato de vértice unorm10-10-10-2
- Formato de textura rgb10a2uint
- Atualizações do amanhecer
Chrome 118
- Suporte para HTMLImageElement e ImageData no
copyExternalImageToTexture()
- Suporte experimental para textura de leitura/gravação e armazenamento somente leitura
- Atualizações do amanhecer
Chrome 117
- Buffer de vértice não definido
- Grupo de vinculação não definido
- Silenciar erros da criação de pipeline assíncrono quando o dispositivo é perdido
- Atualizações na criação do módulo de sombreador SPIR-V
- Melhorias na experiência do desenvolvedor
- Pipelines de armazenamento em cache com layout gerado automaticamente
- Atualizações do amanhecer
Chrome 116
- Integração do WebCodecs
- Dispositivo perdido retornado pelo GPUAdapter
requestDevice()
- Manter a reprodução do vídeo suave se
importExternalTexture()
for chamado - Conformidade com especificações
- Melhorias na experiência do desenvolvedor
- Atualizações do amanhecer
Chrome 115
- Extensões de idioma da WGSL compatíveis
- Suporte experimental para Direct3D 11
- Receber GPU discreta por padrão com alimentação CA
- Melhorias na experiência do desenvolvedor
- Atualizações do amanhecer
Chrome 114
- Optimize JavaScript
- getCurrentTexture() na tela não configurada gera InvalidStateError.
- Atualizações da WGSL
- Atualizações do amanhecer