Funzionalità per sviluppatori WebGPU

François Beaufort
François Beaufort

Data di pubblicazione: 3 giugno 2025

L'implementazione dell'API WebGPU di Chrome include funzionalità destinate esclusivamente allo sviluppo e ai test. Queste funzionalità non rientrano nella specifica WebGPU standard e non devono essere utilizzate in produzione.

Questo documento illustra come attivare le funzionalità per gli sviluppatori di WebGPU e fornisce un elenco completo.

Prerequisito

Per attivare le funzionalità per sviluppatori WebGPU in Chrome:

  1. Attiva il flag "Funzionalità per sviluppatori WebGPU" in chrome://flags/#enable-webgpu-developer-features.
  2. Riavvia il browser Chrome.

Disattiva la quantizzazione delle query sui timestamp

Le query timestamp consentono alle applicazioni WebGPU di misurare con precisione (al nanosecondo) il tempo di esecuzione dei comandi GPU durante i passaggi di calcolo e rendering. Queste query sono essenziali per analizzare il comportamento e le prestazioni del workload della GPU. Per ulteriori dettagli, consulta la sezione Query timestamp nei passaggi di calcolo e rendering.

A causa di problemi di attacchi di temporizzazione, le query sui timestamp vengono quantizzate con una risoluzione di 100 microsecondi, il che offre un buon compromesso tra precisione e sicurezza. Questa quantizzazione viene disattivata automaticamente quando è attivato il flag "Funzionalità per sviluppatori WebGPU".

Informazioni sull'adattatore esteso

Per comprendere meglio l'adattatore in uso, GPUAdapterInfo espone i seguenti attributi:

  • L'attributo device (standardizzato) è un identificatore dell'adattatore specifico del fornitore.
  • L'attributo description (standardizzato) è una stringa leggibile che fornisce i dettagli dell'adattatore.
  • L'attributo driver (non standardizzato) è una stringa leggibile che descrive il driver.
  • L'attributo backend (non standardizzato) indica il backend grafico, ad esempio "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" o "null".
  • L'attributo type (non standardizzato) identifica il tipo di GPU: "discrete GPU", "integrated GPU", "CPU" o "unknown".
  • L'attributo d3dShaderModel (non standardizzato) specifica il numero massimo di modelli di shader D3D supportati, ad esempio 62 indica il supporto di HLSL SM 6.2.
  • L'attributo vkDriverVersion (non standardizzato) è la versione del driver Vulkan specificata dal fornitore.
  • L'attributo powerPreference (non standardizzato) è "low-power" o "high-performance", in base a GPUPowerPreference in GPURequestAdapterOptions.

Per anticipare le limitazioni di memoria durante l'allocazione di grandi quantità durante lo sviluppo dell'app, GPUAdapterInfo espone memoryHeaps informazioni non standardizzate come le dimensioni e il tipo di heap di memoria disponibili sull'adattatore.

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)   { /* ... */ }
}

Opzione di compilazione del modulo shader matematica rigorosa

GPUShaderModuleDescriptor include un'opzione booleana non standardizzata strictMath, che attiva o disattiva la precisione matematica rigorosa durante la compilazione del modulo shader. Questa opzione è supportata su Metal e Direct3D. Quando strictMath è attivato, il compilatore rispetta regole matematiche precise. Al contrario, la disattivazione consente al compilatore di ottimizzare gli shader:

  • Ignorando la possibilità di valori NaN e Infinity.
  • Trattare -0 come +0.
  • Sostituzione della divisione con la moltiplicazione più rapida per il reciproco.
  • Riordinare le operazioni in base alle proprietà associative e distributive.
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 });

Importare video con la tecnologia zero-copy

L'attributo booleano non standardizzato GPUExternalTexture isZeroCopy ti consente di sapere se la GPU ha avuto accesso direttamente al video importato con importExternalTexture() senza la necessità di 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');
}