Nouveautés de WebGPU (Chrome 132)

François Beaufort
François Beaufort

Publié le 8 janvier 2025

Utilisation de la vue de 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 sont incompatibles avec certaines utilisations. Pour résoudre ce problème, l'appel de createView() avec le membre facultatif usage vous permet de spécifier explicitement un sous-ensemble des indicateurs d'utilisation de la texture source qui sont compatibles avec le format de vue choisi.

Cette modification permet une validation anticipée et un contrôle plus précis de l'utilisation de la vue. Il 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 suivant, l'entrée chromestatus et le 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 float 32 bits

Les textures à virgule flottante 32 bits sont essentielles pour le rendu HDR, car elles permettent de préserver une large gamme 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 blending avec n'importe quel attachement au format float32 lorsque vous demandez un appareil GPU avec cette fonctionnalité.

Consultez l'extrait suivant, l'entrée chromestatus et le 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 GPUDevice adapterInfo

Il est important que les bibliothèques qui acceptent les objets GPUDevice fournis par l'utilisateur puissent accéder 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 GPUDevice.

Pour résoudre ce problème, GPUAdapterInfo est désormais exposé via l'attribut adapterInfo de GPUDevice. Elles sont semblables à l'attribut info GPUAdapter 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 méthode a été modifiée pour générer une TypeError JavaScript. Cela évite les scénarios dans lesquels getCurrentTexture() renvoie une texture GPU valide alors que le contexte du canevas GPU est mal configuré. Pour en savoir plus, consultez le problème 372837859.

Restrictions de l'échantillonneur de filtrage sur les textures

Auparavant, il était possible d'utiliser des textures au format "sint", "uint" et depth" avec des exemples de filtrage. Il interdit désormais correctement l'utilisation d'une texture au format "sint" ou "uint" avec un échantillonneur de filtrage. Notez qu'il émet actuellement un avertissement si vous utilisez une texture depth" avec un échantillonneur de filtrage, car cela ne sera plus autorisé à 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 groupe 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 spécification 4952 contient une proposition à l'étude pour résoudre cette limitation à l'avenir.

Tests de sous-groupes étendus

L'expérimentation sur les sous-groupes, initialement prévue pour se terminer dans Chrome 131, a été prolongée jusqu'à Chrome 133, soit jusqu'au 16 avril 2025. Bien que la première version d'évaluation de l'origine se soit concentrée sur les performances, elle manquait de garanties de portabilité essentielles. Ces mesures de protection vont maintenant être 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 les outils de développement lorsque l'option powerPreference est utilisée avec requestAdapter() sous Windows. Cet avertissement sera supprimé lorsque Chrome saura comment utiliser deux GPU différents et combiner les résultats. Consultez 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 de 16 bits sont désormais disponibles à titre expérimental, respectivement derrière les fonctionnalités GPU "chromium-experimental-snorm16-texture-formats" et "chromium-experimental-unorm16-texture-formats", en attendant d'être discutés pour la normalisation.

Ces fonctionnalités ajoutent la prise en charge des formats de texture normalisés 16 bits avec les utilisations COPY_SRC, COPY_DST, TEXTURE_BINDING et RENDER_ATTACHMENT, ainsi que des capacités de multisampling et de résolution. Les formats supplémentaires sont "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm" et "rgba16snorm".

En attendant que ces fonctionnalités expérimentales soient normalisées, activez l'indicateur "Unsafe WebGPU Support" (Prise en charge non sécurisée de WebGPU) sur chrome://flags/#enable-unsafe-webgpu pour les rendre disponibles dans Chrome.

Consultez l'extrait 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...

Mises à jour de l'Aube

Les méthodes EnumerateFeatures(FeatureName * features) de wgpu::Adapter et wgpu::Device sont obsolètes. Il est recommandé d'utiliser 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. Cela vous permet de travailler avec des parties d'une chaîne sans avoir à la copier. Consultez le problème 42241188.

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

Nouveautés de WebGPU

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

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

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