Fonctionnalités WebGPU pour les développeurs

François Beaufort
François Beaufort

Publié le 3 juin 2025

L'implémentation de l'API WebGPU de Chrome inclut des fonctionnalités destinées uniquement au développement et aux tests. Ces fonctionnalités ne font pas partie de la spécification WebGPU standard et ne doivent pas être utilisées en production.

Ce document explique comment activer les fonctionnalités WebGPU pour les développeurs et fournit une liste complète.

Conditions préalables

Pour activer les fonctionnalités WebGPU pour les développeurs dans Chrome, procédez comme suit:

  1. Activez l'indicateur "Fonctionnalités WebGPU pour les développeurs" à l'emplacement chrome://flags/#enable-webgpu-developer-features.
  2. Redémarrez le navigateur Chrome.

Désactiver la quantification des requêtes d'horodatage

Les requêtes de code temporel permettent aux applications WebGPU de mesurer avec précision (à la nanoseconde près) le temps d'exécution des commandes GPU lors des passes de calcul et de rendu. Ces requêtes sont essentielles pour analyser les performances et le comportement des charges de travail du GPU. Pour en savoir plus, consultez la section Requêtes de code temporel dans les passes de calcul et de rendu.

En raison des attaques par cassage de chiffrement, les requêtes de code temporel sont quantifiées avec une résolution de 100 microsecondes, ce qui offre un bon compromis entre précision et sécurité. Cette quantification est automatiquement désactivée lorsque l'option "Fonctionnalités de développement WebGPU" est activée.

Informations étendues sur l'adaptateur

Pour mieux comprendre l'adaptateur utilisé, GPUAdapterInfo expose les attributs suivants:

  • L'attribut device (standardisé) est un identifiant d'adaptateur propre au fournisseur.
  • L'attribut description (standardisé) est une chaîne lisible par l'homme qui fournit des informations sur l'adaptateur.
  • L'attribut driver (non standardisé) est une chaîne lisible par l'utilisateur qui décrit le pilote.
  • L'attribut backend (non standardisé) indique le backend graphique, par exemple "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" ou "null".
  • L'attribut type (non standardisé) identifie le type de GPU: "discrete GPU", "integrated GPU", "CPU" ou "unknown".
  • L'attribut d3dShaderModel (non standardisé) spécifie le numéro de modèle de nuanceur D3D maximal accepté. Par exemple, 62 indique la prise en charge de HLSL SM 6.2.
  • L'attribut vkDriverVersion (non standardisé) correspond à la version du pilote Vulkan spécifiée par le fournisseur.
  • L'attribut powerPreference (non standardisé) est "low-power" ou "high-performance", en fonction de GPUPowerPreference dans GPURequestAdapterOptions.

Pour anticiper les limites de mémoire lors de l'allocation de grandes quantités lors du développement de votre application, GPUAdapterInfo expose des informations non standardisées memoryHeaps telles que la taille et le type de tas de mémoire disponibles sur l'adaptateur.

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

Option de compilation du module de nuanceur : mathématiques strictes

GPUShaderModuleDescriptor inclut une option booléenne non standardisée strictMath, qui active ou désactive une précision mathématique stricte lors de la compilation du module de nuanceur. Cette option est compatible avec Metal et Direct3D. Lorsque strictMath est activé, le compilateur respecte des règles mathématiques précises. À l'inverse, la désactivation permet au compilateur d'optimiser les nuanceurs en:

  • Ignorer la possibilité de valeurs NaN et Infinity.
  • Traitement de -0 comme +0.
  • Remplacement de la division par une multiplication plus rapide par le réciproque.
  • Réorganiser les opérations en fonction des propriétés associatives et distributives
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 });

Importer une vidéo avec copie zéro

L'attribut booléen non standardisé isZeroCopy de GPUExternalTexture vous indique si la vidéo importée avec importExternalTexture() a été directement accessible par le GPU sans nécessiter de copie intermédiaire.

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