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 do WebGPU. Não use esses recursos em produção.
Este documento detalha como ativar os recursos para desenvolvedores do WebGPU e fornece uma lista abrangente.
Pré-requisito
Para ativar os recursos de desenvolvedor do WebGPU no Chrome, siga estas etapas:
- Ative a flag "Recursos para desenvolvedores do WebGPU" 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 as transmissões de computação e renderização. 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 transmissões de computação e renderização.
Devido a preocupações com ataques 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 "Recursos para desenvolvedores do WebGPU" está ativada.
Informações estendidas do adaptador
Para entender melhor o adaptador usado, 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 que fornece detalhes do adaptador. - O atributo
driver(não padronizado) é uma string legível que descreve o driver. - O atributo
backend(não padronizado) indica o back-end de gráficos, 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 do modelo de shader D3D compatível. Por exemplo, 62 indica compatibilidade com HLSL SM 6.2. - O atributo
vkDriverVersion(não padronizado) é a versão do driver Vulkan especificada pelo fornecedor. - O atributo
powerPreference(não padronizado) é"low-power"ou"high-performance", com base no GPUPowerPreference em GPURequestAdapterOptions.
Para antecipar limitações de memória ao alocar grandes quantidades durante o desenvolvimento do app, GPUAdapterInfo expõe memoryHeaps informações não padronizadas, como o tamanho e o tipo de heaps 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 do módulo de sombreador: matemática estrita
O GPUShaderModuleDescriptor inclui uma opção booleana strictMath não padronizada, que ativa ou desativa a precisão matemática estrita durante a compilação do módulo de shader. Essa opção é compatível com Metal e Direct3D. Quando strictMath está ativado, o compilador segue regras matemáticas precisas. Por outro lado, desativar essa opção permite que o compilador otimize os shaders das seguintes maneiras:
- Ignorando a possibilidade de valores NaN e Infinity.
- Tratando -0 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 cópia zero
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');
}