Funciones para desarrolladores de WebGPU

François Beaufort
François Beaufort

Publicado el 3 de junio de 2025

La implementación de la API de WebGPU de Chrome incluye funciones destinadas exclusivamente al desarrollo y las pruebas. Estas funciones no se incluyen en la especificación estándar de WebGPU. No uses estas funciones en producción.

En este documento, se detalla cómo habilitar las funciones para desarrolladores de WebGPU y se proporciona una lista completa.

Requisitos

Para habilitar las funciones para desarrolladores de WebGPU en Chrome, sigue estos pasos:

  1. Habilita la marca "WebGPU Developer Features" en chrome://flags/#enable-webgpu-developer-features.
  2. Reinicia el navegador Chrome.

Inhabilita la cuantificación de las consultas de marcas de tiempo

Las consultas de marcas de tiempo permiten que las aplicaciones de WebGPU midan con precisión (hasta el nanosegundo) el tiempo de ejecución de los comandos de la GPU durante los pases de procesamiento y de procesamiento. Estas consultas son esenciales para analizar el rendimiento y el comportamiento de la carga de trabajo de la GPU. Para obtener más detalles, consulta Consultas de marcas de tiempo en pases de procesamiento y procesamiento.

Debido a las preocupaciones sobre los ataques de sincronización, las consultas de marcas de tiempo se cuantifican con una resolución de 100 microsegundos, lo que proporciona un buen equilibrio entre precisión y seguridad. Esta cuantificación se inhabilita automáticamente cuando se habilita la marca "WebGPU Developer Features".

Información extendida del adaptador

Para comprender mejor el adaptador que se usa, GPUAdapterInfo expone los siguientes atributos:

  • El atributo device (estandarizado) es un identificador de adaptador específico del proveedor.
  • El atributo description (estandarizado) es una cadena legible que proporciona detalles del adaptador.
  • El atributo driver (no estandarizado) es una cadena legible que describe al conductor.
  • El atributo backend (no estandarizado) indica el backend de gráficos, como "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" o "null".
  • El atributo type (no estandarizado) identifica el tipo de GPU: "discrete GPU", "integrated GPU", "CPU" o "unknown".
  • El atributo d3dShaderModel (no estandarizado) especifica el número máximo de modelo de sombreador D3D admitido. Por ejemplo, 62 indica compatibilidad con HLSL SM 6.2.
  • El atributo vkDriverVersion (no estandarizado) es la versión del controlador de Vulkan especificada por el proveedor.
  • El atributo powerPreference (no estandarizado) es "low-power" o "high-performance", según el GPUPowerPreference en GPURequestAdapterOptions.

Para anticipar las limitaciones de memoria cuando se asignan grandes cantidades durante el desarrollo de tu app, GPUAdapterInfo expone información memoryHeaps no estandarizada, como el tamaño y el tipo de montones de memoria disponibles en el 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)   { /* ... */ }
}

Opción de compilación del módulo de sombreador con operaciones matemáticas estrictas

El GPUShaderModuleDescriptor incluye una opción booleana no estandarizada strictMath, que habilita o inhabilita la precisión matemática estricta durante la compilación del módulo de sombreador. Esta opción es compatible con Metal y Direct3D. Cuando strictMath está habilitado, el compilador se ajusta a reglas matemáticas precisas. Por el contrario, inhabilitarlo permite que el compilador optimice los sombreadores de la siguiente manera:

  • Ignora la posibilidad de valores NaN e Infinity.
  • Trata -0 como +0.
  • Reemplaza la división por una multiplicación más rápida por el recíproco.
  • Reorganizar las operaciones según las propiedades asociativas y 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 });

Importa videos con cero copias

El atributo booleano no estandarizado GPUExternalTexture isZeroCopy te permite saber si la GPU accedió directamente al video importado con importExternalTexture() sin necesidad de una copia intermedia.

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');
}