Recursos para desenvolvedores do WebGPU

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 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:

  1. Ative a flag "Recursos para desenvolvedores do WebGPU" 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 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');
}