Publicado em 3 de junho de 2025
A implementação da API WebGPU do Chrome inclui recursos destinados apenas ao desenvolvimento e teste. Esses recursos estão fora da especificação padrão da WebGPU e não devem ser usados na produção.
Este documento detalha como ativar os recursos para desenvolvedores da WebGPU e fornece uma lista abrangente.
Pré-requisito
Para ativar os recursos do desenvolvedor da WebGPU no Chrome, siga estas etapas:
- Ative a flag "WebGPU Developer Features" em
chrome://flags/#enable-webgpu-developer-features
. - Reinicie o navegador Chrome.
Desativar a quantização de consultas de carimbo de data/hora
As consultas de carimbo de data/hora permitem que os aplicativos WebGPU meçam com precisão (até o nanossegundo) o tempo de execução dos comandos da GPU durante os passes de renderização e de cálculo. Essas consultas são essenciais para analisar o desempenho e o comportamento da carga de trabalho da GPU. Para mais detalhes, consulte Consultas de carimbo de data/hora em cálculos e renderizações.
Devido a problemas de ataque de tempo, as consultas de carimbo de data/hora são quantizadas com uma resolução de 100 microssegundos, o que oferece um bom compromisso entre precisão e segurança. Essa quantização é desativada automaticamente quando a flag "WebGPU Developer Features" está ativada.
Informações estendidas do adaptador
Para entender melhor o adaptador usado, o GPUAdapterInfo expõe os seguintes atributos:
- O atributo
device
(padronizado) é um identificador de adaptador específico do fornecedor. - O atributo
description
(padronizado) é uma string legível por humanos que fornece detalhes do adaptador. - O atributo
driver
(não padronizado) é uma string legível por humanos que descreve o driver. - O atributo
backend
(não padronizado) indica o back-end gráfico, como"WebGPU"
,"D3D11"
,"D3D12"
,"metal"
,"vulkan"
,"openGL"
,"openGLES"
ou"null"
. - O atributo
type
(não padronizado) identifica o tipo de GPU:"discrete GPU"
,"integrated GPU"
,"CPU"
ou"unknown"
. - O atributo
d3dShaderModel
(não padronizado) especifica o número máximo de modelo de sombreador D3D aceito. Por exemplo, 62 indica suporte ao HLSL SM 6.2. - O atributo
vkDriverVersion
(não padronizado) é a versão do driver do Vulkan especificada pelo fornecedor. - O atributo
powerPreference
(não padronizado) é"low-power"
ou"high-performance"
, com base na GPUPowerPreference em GPURequestAdapterOptions.
Para antecipar as limitações de memória ao alocar grandes quantidades durante o desenvolvimento do app, o GPUAdapterInfo expõe informações não padronizadas de memoryHeaps
, como o tamanho e o tipo de pilhas de memória disponíveis no adaptador.
const adapter = await navigator.gpu.requestAdapter();
for (const { size, properties } of adapter.info.memoryHeaps) {
console.log(size); // memory heap size in bytes
if (properties & GPUHeapProperty.DEVICE_LOCAL) { /* ... */ }
if (properties & GPUHeapProperty.HOST_VISIBLE) { /* ... */ }
if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
if (properties & GPUHeapProperty.HOST_CACHED) { /* ... */ }
}
Opção de compilação de módulo de sombreador com matemática rigorosa
O GPUShaderModuleDescriptor inclui uma opção booleana não padronizada strictMath
, que ativa ou desativa a precisão matemática rigorosa durante a compilação do módulo do sombreador. Essa opção tem suporte no Metal e no Direct3D. Quando strictMath
está ativado, o compilador adere a regras matemáticas precisas. Por outro lado, a desativação permite que o compilador otimize os sombreadores:
- Ignorar a possibilidade de valores NaN e infinitos.
- O -0 foi tratado como +0.
- Substituir a divisão por uma multiplicação mais rápida pelo recíproco.
- Reorganizar operações com base em propriedades associativas e distributivas.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const code = `
// Examines the bit pattern of the floating-point number to
// determine if it represents a NaN according to the IEEE 754 standard.
fn isNan(x : f32) -> bool {
bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
return ones_exp && non_zero_sig;
}
// ...
`;
// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });
Importar vídeo com zero cópia
O atributo booleano não padronizado GPUExternalTexture isZeroCopy
informa se o vídeo importado com importExternalTexture() foi acessado diretamente pela GPU sem a necessidade de uma cópia intermediária.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const video = document.querySelector('video');
const externalTexture = device.importExternalTexture({ source: video });
if (externalTexture.isZeroCopy) {
console.log('Video frame was accessed directly by the GPU');
}