Recursos da WebGPU para desenvolvedores

François Beaufort
François Beaufort

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:

  1. Ative a flag "WebGPU Developer Features" em chrome://flags/#enable-webgpu-developer-features.
  2. 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');
}