Extensão fragment_depth do WGSL
Em passagens de renderização com uso intensivo de geometria, as otimizações de early-Z são as melhores amigas dos desenvolvedores. Eles oferecem um grande aumento de desempenho, permitindo que a GPU descarte pixels ocultos antes de executar sombreadores de fragmentos caros. Se uma profundidade rasterizada falhar no teste de profundidade, a GPU vai pular o shader de fragmento por completo, desde que o shader não tenha outros efeitos colaterais.
Se você quiser saber como o hardware lida com isso, o MJP tem um excelente artigo sobre When Does Early-Z Have to be Disabled? (em inglês).
Embora a manipulação de profundidade personalizada seja útil, fazer isso no sombreador de fragmentos tem um custo oculto. A gravação em @builtin(frag_depth) dentro de um sombreador de fragmento normalmente força os drivers a desativar essas otimizações de Z antecipado para toda a chamada de desenho. Isso acontece porque as heurísticas do driver não podem garantir que a profundidade de saída calculada do sombreador corresponda à profundidade interpolada pelo rasterizador.
Para resolver essa penalidade de desempenho, a extensão WGSL fragment_depth permite especificar um nome de modo de profundidade less ou greater em @builtin(frag_depth) para indicar explicitamente como a profundidade escrita se compara à profundidade interpolada, permitindo que a GPU aplique otimizações de Z antecipadas com segurança.
Essa extensão de linguagem pode ser detectada no JavaScript usando navigator.gpu.wgslLanguageFeatures. É recomendável usar uma diretiva de requisitos para sinalizar o potencial de não portabilidade com requires fragment_depth; 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("fragment_depth")) {
throw new Error(`WGSL fragment depth is not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires fragment_depth;
@fragment
fn main() -> @builtin(frag_depth, less) f32 {
// Explicitly states that the output fragment depth is less than early-Z depth,
// allowing the GPU to safely preserve early-Z optimizations.
return 0.0f;
}`,
});
Compactação de textura não alinhada
O recurso de GPU "texture-compression-unaligned" permite a criação de texturas compactadas com dimensões que não são múltiplos inteiros do tamanho do bloco (como 4x4 para os formatos BC, ETC2 e ASTC). Antes, a WebGPU exigia que os tamanhos de textura se alinhassem a esses limites de bloco. Ao remover a necessidade de preencher ou dimensionar texturas para se ajustarem aos alinhamentos de blocos, esse recurso preserva a fidelidade de compactação original sem introduzir distorção de dimensionamento. Consulte a intent to ship (em inglês).
O snippet de código a seguir verifica se o adaptador é compatível com a compactação de textura não alinhada e, se disponível, solicita um dispositivo com ela.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
requiredFeatures: ["texture-compression-unaligned"],
});
Agradecemos ao colaborador externo Ignacio Castaño do spark.js por impulsionar esse recurso, a especificação e o trabalho do CTS.
Espaços de cores srgb-linear e display-p3-linear
Com a adição dos espaços de cores predefinidos "srgb-linear" e "display-p3-linear", o contexto de tela da WebGPU agora pode renderizar diretamente em espaços de cores lineares de alcance estendido para oferecer suporte a telas de ampla gama. Esses espaços de cores mantêm uma relação linear entre os valores de pixel e a luminância física. Isso as torna ideais para renderização de luz física em jogos, bem como tarefas de processamento espacial, como suavização, interpolação e decimação. Consulte a intenção de envio e o exemplo de partículas (HDR) PR #574.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");
context.configure({
device,
format: "rgba16float",
colorSpace: "display-p3-linear",
});
Formato de vértice snorm10-10-10-2 adicional
O formato de vértice "snorm10-10-10-2" é um formato de 32 bits compactado que contém quatro valores normalizados com sinal: três componentes de 10 bits (r, g, b) e um componente de 2 bits (a). Com esse formato, é possível armazenar atributos de maneira eficiente, como vetores normais 3D com um escalar extra de 2 bits ou uma flag de alinhamento, economizando largura de banda de memória. Consulte a especificação PR 6491.
Suporte a f16 no Linux para NVIDIA
O recurso opcional "shader-f16", que oferece suporte a valores de ponto flutuante de 16 bits em WGSL, agora é compatível com o Linux para drivers de GPU NVIDIA recentes. Consulte o problema chromium:42251215.
Atualizações do Dawn
Agora é possível consultar o LUID do DXGIAdapter de um determinado adaptador de GPU usando a struct WGPUAdapterPropertiesD3D. Consulte o problema chromium:562849566.
Este item abrange alguns dos principais destaques. Confira a lista completa de commits.
Novidades na WebGPU
Uma lista de tudo o que foi abordado na série Novidades na WebGPU.
Chrome 155-156
- Extensão fragment_depth da WGSL
- Compactação de textura não alinhada
- Espaços de cores srgb-linear e display-p3-linear
- Formato de vértice snorm10-10-10-2 adicional
- Suporte a f16 no Linux para NVIDIA
- Atualizações do Dawn
Chrome 153-154
- Extensão buffer_view da WGSL
- Extensão swizzle_assignment da WGSL
- Atualizações da extensão WGSL
- Atualizações do Dawn
Chrome 151-152
- Controle de tamanho do subgrupo
- OperationError para falhas de validação de setImmediates
- Atualizações do Dawn
Chrome 149-150
Chrome 147-148
Chrome 146
- Suporte ao modo de compatibilidade da WebGPU no OpenGL ES 3.1
- Anexos temporários
- Extensão texture_and_sampler_let da WGSL
- Atualizações do Dawn
Chrome 145
- Extensão subgroup_uniformity da WGSL
- Mapeamento de buffer síncrono experimental em workers
- Atualizações do Dawn
Chrome 144
- Extensão subgroup_id da WGSL
- Extensão uniform_buffer_standard_layout da WGSL
- WebGPU no Linux
- writeBuffer e writeTexture mais rápidos
- Atualizações do Dawn
Chrome 143
- Swizzle de componente de textura
- Remover o uso da textura de armazenamento somente leitura bgra8unorm
- Atualizações do Dawn
Chrome 142
Chrome 141
- Tint IR concluído
- Análise de intervalo de números inteiros no compilador WGSL
- Atualização do SPIR-V 1.4 para o back-end do Vulkan
- Atualizações do Dawn
Chrome 140
- O dispositivo solicita o adaptador de consumo
- Atalho para usar a textura onde a visualização de textura é usada
- O textureSampleLevel da WGSL é compatível com texturas 1D
- Descontinuar o uso da textura de armazenamento somente leitura bgra8unorm
- Remover o atributo isFallbackAdapter do GPUAdapter
- Atualizações do Dawn
Chrome 139
- Suporte a texturas 3D para formatos compactados BC e ASTC
- Novo recurso "core-features-and-limits"
- Teste de origem para o modo de compatibilidade da WebGPU
- Atualizações do Dawn
Chrome 138
- Atalho para usar o buffer como um recurso de vinculação
- Mudanças nos requisitos de tamanho para buffers mapeados na criação
- Relatório de arquitetura para GPUs recentes
- Descontinuação do atributo isFallbackAdapter do GPUAdapter
- Atualizações do Dawn
Chrome 137
- Usar a visualização de textura para vinculação de externalTexture
- Cópia de buffers sem especificar deslocamentos e tamanho
- workgroupUniformLoad da WGSL usando ponteiro para atômico
- Atributo powerPreference do GPUAdapterInfo
- Remover o atributo compatibilityMode de GPURequestAdapterOptions
- Atualizações do Dawn
Chrome 136
- Atributo isFallbackAdapter do GPUAdapterInfo
- Melhorias no tempo de compilação de sombreadores no D3D12
- Salvar e copiar imagens do Canvas
- Restrições do modo de compatibilidade do Lift
- Atualizações do Dawn
Chrome 135
- Permitir a criação de layout de pipeline com layout de grupo de vinculação nulo
- Permitir que as janelas de visualização se estendam além dos limites dos destinos de renderização
- Acesso mais fácil ao modo de compatibilidade experimental no Android
- Remoção do limite maxInterStageShaderComponents
- Atualizações do Dawn
Chrome 134
- Melhorar as cargas de trabalho de machine learning com subgrupos
- Remoção da compatibilidade com tipos de textura filtráveis flutuantes como combináveis
- Atualizações do Dawn
Chrome 133
- Outros formatos de vértice unorm8x4-bgra e de 1 componente
- Permitir que limites desconhecidos sejam solicitados com valor indefinido
- Mudanças nas regras de alinhamento da WGSL
- Ganhos de desempenho da WGSL com descarte
- Usar o displaySize do VideoFrame para texturas externas
- Processar imagens com orientações não padrão usando copyExternalImageToTexture
- Melhorar a experiência do desenvolvedor
- Ativar o modo de compatibilidade com featureLevel
- Limpeza de recursos experimentais de subgrupo
- Descontinuação do limite maxInterStageShaderComponents
- Atualizações do Dawn
Chrome 132
- Uso da visualização de textura
- Combinação de texturas flutuantes de 32 bits
- Atributo adapterInfo do GPUDevice
- Configurar o contexto da tela com um formato inválido gera um erro de JavaScript
- Restrições de amostragem de filtragem em texturas
- Experimentos estendidos de subgrupos
- Melhorar a experiência do desenvolvedor
- Suporte experimental para formatos de textura normalizados de 16 bits
- Atualizações do Dawn
Chrome 131
- Distâncias de corte na WGSL
- GPUCanvasContext getConfiguration()
- As primitivas de ponto e linha não podem ter viés de profundidade
- Funções integradas de verificação inclusiva para subgrupos
- Suporte experimental para multi-draw indirect
- Opção de compilação do módulo de sombreador de matemática estrita
- Remover requestAdapterInfo() do GPUAdapter
- Atualizações do Dawn
Chrome 130
- Combinação de duas fontes
- Melhorias no tempo de compilação de sombreadores no Metal
- Descontinuação de requestAdapterInfo() do GPUAdapter
- Atualizações do Dawn
Chrome 129
- Suporte a HDR com o modo de mapeamento de tons do canvas
- Suporte expandido para subgrupos
- Atualizações do Dawn
Chrome 128
- Como testar subgrupos
- Descontinuar a configuração de viés de profundidade para linhas e pontos
- Ocultar o aviso do DevTools de erro não capturado se preventDefault
- Amostragem de interpolação do WGSL primeiro e qualquer uma das duas
- Atualizações do Dawn
Chrome 127
- Suporte experimental para OpenGL ES no Android
- Atributo de informações do GPUAdapter
- Melhorias na interoperabilidade do WebAssembly
- Erros de codificador de comando aprimorados
- Atualizações do Dawn
Chrome 126
- Aumentar o limite de maxTextureArrayLayers
- Otimização do upload de buffer para o back-end do Vulkan
- Melhorias no tempo de compilação de sombreadores
- Os buffers de comando enviados precisam ser exclusivos
- Atualizações do Dawn
Chrome 125
Chrome 124
- Texturas de armazenamento somente leitura e de leitura/gravação
- Suporte a service workers e workers compartilhados
- Novos atributos de informações do adaptador
- Correções de bugs
- Atualizações do Dawn
Chrome 123
- Suporte a funções integradas DP4a na WGSL
- Parâmetros de ponteiro irrestritos na WGSL
- Açúcar sintático para desreferenciar compostos em WGSL
- Estado somente leitura separado para aspectos de estêncil e profundidade
- Atualizações do Dawn
Chrome 122
- Ampliar o alcance com o modo de compatibilidade (recurso em desenvolvimento)
- Aumentar o limite de maxVertexAttributes
- Atualizações do Dawn
Chrome 121
- Suporte à WebGPU no Android
- Usar o DXC em vez do FXC para compilação de sombreadores 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 de heaps de memória
- Atualizações do Dawn
Chrome 120
- Suporte para valores de ponto flutuante de 16 bits em WGSL
- Vá além dos limites
- Mudanças no estado de profundidade/estêncil
- Atualizações de informações do adaptador
- Quantização de consultas de carimbo de data/hora
- Recursos de limpeza
Chrome 119
- Texturas flutuantes de 32 bits filtráveis
- Formato de vértice unorm10-10-10-2
- Formato de textura rgb10a2uint
- Atualizações do Dawn
Chrome 118
- Suporte a HTMLImageElement e ImageData em
copyExternalImageToTexture() - Suporte experimental para textura de armazenamento de leitura e gravação e somente leitura
- Atualizações do Dawn
Chrome 117
- Remover a definição do buffer de vértice
- Remover o grupo de vinculação
- Silenciar erros da criação de pipeline assíncrono quando o dispositivo é perdido
- Atualizações na criação de módulos de sombreador SPIR-V
- Melhorar a experiência do desenvolvedor
- Como armazenar em cache pipelines com layout gerado automaticamente
- Atualizações do Dawn
Chrome 116
- Integração com WebCodecs
- Dispositivo perdido retornado pelo GPUAdapter
requestDevice() - Manter a reprodução de vídeo sem interrupções se
importExternalTexture()for chamado - Conformidade com as especificações
- Melhorar a experiência do desenvolvedor
- Atualizações do Dawn
Chrome 115
- Extensões de linguagem WGSL compatíveis
- Suporte experimental para Direct3D 11
- Usar GPU dedicada por padrão na alimentação CA
- Melhorar a experiência do desenvolvedor
- Atualizações do Dawn
Chrome 114
- Otimizar JavaScript
- getCurrentTexture() em uma tela não configurada gera InvalidStateError
- Atualizações da WGSL
- Atualizações do Dawn