Nouveautés de WebGPU (Chrome 132)

François Beaufort
François Beaufort

Publié le 8 janvier 2025

Utilisation de la vue Texture

Les vues de texture GPU héritent actuellement de tous les indicateurs d'utilisation de leur texture GPU source. Cela peut poser problème, car certains formats de vue ne sont pas compatibles avec certains usages. Pour résoudre ce problème, appeler createView() avec le membre facultatif usage vous permet de spécifier explicitement un sous-ensemble des indicateurs d'utilisation de la texture source compatibles avec le format de vue choisi.

Cette modification permet une validation préalable et un contrôle plus précis de l'utilisation de la vue. Elle s'aligne également sur d'autres API graphiques, où les indicateurs d'utilisation sont des paramètres courants dans la création de vues, ce qui offre des possibilités d'optimisation.

Consultez l'extrait de code suivant, l'entrée chromestatus et l'problème 363903526.

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

Mélange de textures à virgule flottante 32 bits

Les textures à virgule flottante 32 bits sont essentielles pour le rendu HDR afin de préserver une large plage de valeurs de couleur et d'éviter les artefacts de bandes de couleur. Par exemple, dans la visualisation scientifique.

La nouvelle fonctionnalité GPU "float32-blendable" permet de mélanger les textures GPU avec les formats "r32float", "rg32float" et "rgba32float". Il est désormais possible de créer un pipeline de rendu qui utilise le mélange avec n'importe quel élément joint au format float32 lorsque vous demandez un appareil GPU avec cette fonctionnalité.

Consultez l'extrait suivant, l'entrée chromestatus et l'problème 369649348.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

Attribut adapterInfo de GPUDevice

Il est important que les bibliothèques qui utilisent des objets GPUDevice fournis par l'utilisateur accèdent aux informations sur le GPU physique, car elles peuvent avoir besoin d'optimiser ou d'implémenter des solutions de contournement en fonction de l'architecture du GPU. Bien qu'il soit possible d'accéder à ces informations via l'objet GPUAdapter, il n'existe aucun moyen direct de les obtenir à partir d'un GPUDevice seul. Cela peut être gênant, car les utilisateurs peuvent être amenés à fournir des informations supplémentaires en plus de l'GPUDevice.

Pour résoudre ce problème, GPUAdapterInfo est désormais exposé via l'attribut GPUDevice adapterInfo. Ils sont semblables à l'attribut GPUAdapter info existant.

Consultez l'extrait de code suivant, l'entrée chromestatus et le problème 376600838.

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

La configuration du contexte du canevas avec un format non valide génère une erreur JavaScript

Auparavant, l'utilisation d'un format de texture non valide avec la méthode configure() du contexte de canevas GPU entraînait une erreur de validation du GPU. Cette valeur a été modifiée pour générer une exception JavaScript TypeError. Cela évite les scénarios où getCurrentTexture() renvoie une texture GPU valide malgré une configuration incorrecte du contexte de canevas GPU. Pour en savoir plus, consultez le problème 372837859.

Filtrage des restrictions d'échantillonneur sur les textures

L'utilisation de textures au format "sint", "uint" et depth" avec des échantillons de filtrage était auparavant autorisée. Il interdit désormais correctement l'utilisation d'une texture au format "sint" ou "uint" avec un échantillonneur de filtrage. Notez qu'un avertissement s'affiche actuellement si vous utilisez une texture depth" avec un échantillonneur de filtrage, car cette pratique ne sera plus autorisée à l'avenir. Consultez le problème 376497143.

Ces restrictions signifient que l'utilisation d'une texture de profondeur avec un échantillonneur sans filtrage nécessite la création manuelle de mises en page de groupes de liaison. En effet, les mises en page de groupe de liaison générées automatiquement ne sont pas encore compatibles avec cette combinaison. La problématique de spécification 4952 contient une proposition en cours d'examen pour résoudre cette limitation à l'avenir.

Test étendu des sous-groupes

L'expérimentation des sous-groupes, qui devait initialement se terminer dans Chrome 131, a été étendue jusqu'à Chrome 133 et se terminera le 16 avril 2025. Bien que le premier test d'origine se soit concentré sur les performances, il manquait de garanties de portabilité essentielles. Ces mesures de protection seront désormais ajoutées, ce qui peut entraîner des erreurs dans le code existant.

Améliorer l'expérience des développeurs

Un avertissement s'affiche désormais dans DevTools lorsque l'option powerPreference est utilisée avec requestAdapter() sous Windows. Cet avertissement sera supprimé lorsque Chrome saura utiliser deux GPU différents et composer les résultats entre eux. Voir le problème 369219127.

La taille du tampon GPU est désormais indiquée dans le message d'erreur lorsque vous créez un tampon GPU trop volumineux. Consultez le problème 374167798.

Compatibilité expérimentale avec les formats de texture normalisés 16 bits

Les formats de texture normalisés signés et non signés 16 bits sont désormais disponibles à titre expérimental respectivement derrière les fonctionnalités de GPU "chromium-experimental-snorm16-texture-formats" et "chromium-experimental-unorm16-texture-formats", tandis qu'ils sont en cours de discussion pour leur normalisation.

Ces fonctionnalités permettent de prendre en charge les formats de texture normalisés 16 bits avec les utilisations COPY_SRC, COPY_DST, TEXTURE_BINDING et RENDER_ATTACHMENT, le multiéchantillonnage et les fonctionnalités de résolution. Les formats supplémentaires sont "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm" et "rgba16snorm".

Tant que ces fonctionnalités expérimentales ne sont pas standardisées, activez l'indicateur "Unsafe WebGPU Support" (Compatibilité avec WebGPU non sécurisé) à chrome://flags/#enable-unsafe-webgpu pour les rendre disponibles dans Chrome.

Consultez l'extrait de code suivant et le problème 374790898.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

// Send the appropriate commands to the GPU...

Informations Dawn

Les méthodes EnumerateFeatures(FeatureName * features) de wgpu::Adapter et wgpu::Device sont obsolètes et remplacées par GetFeatures(SupportedFeatures * features). Consultez le problème 368672123.

L'API C webgpu.h a remplacé tous les char const * par une structure WGPUStringView qui définit une vue dans une chaîne encodée en UTF-8. Il agit comme un pointeur vers les données de la chaîne, associé à une longueur. Vous pouvez ainsi travailler avec des parties d'une chaîne sans avoir à la copier. Consultez le problème 42241188.

Il ne s'agit là que de quelques-uns des points clés. Consultez la liste exhaustive des commits.

Nouveautés de WebGPU

Liste de tous les éléments abordés dans la série Nouveautés de WebGPU.

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113