Nouveautés de WebGPU (Chrome 135)

François Beaufort
François Beaufort

Publié le : 26 mars 2025

Autoriser la création de la mise en page du pipeline avec une mise en page de groupe de liaison nulle

Auparavant, la création d'une mise en page de groupe de liaisons vide nécessitait l'ajout d'un groupe de liaisons sans liaisons, ce qui était peu pratique. Ce n'est plus nécessaire, car les mises en page de groupe de liaison nulles sont désormais autorisées et ignorées lors de la création d'une mise en page de pipeline. Cela devrait faciliter le développement.

Par exemple, vous pouvez créer un pipeline qui n'utilise que les mises en page des groupes de liaisons 0 et 2. Vous pouvez attribuer la mise en page du groupe de liaison 1 aux données de fragment et la mise en page du groupe de liaison 2 aux données de vertex, puis effectuer le rendu sans nuanceur de fragment. Consultez le problème 377836524.

const bgl0 = myDevice.createBindGroupLayout({ entries: myGlobalEntries });
const bgl1 = myDevice.createBindGroupLayout({ entries: myFragmentEntries });
const bgl2 = myDevice.createBindGroupLayout({ entries: myVertexEntries });

// Create a pipeline layout that will be used to render without a fragment shader.
const myPipelineLayout = myDevice.createPipelineLayout({
  bindGroupLayouts: [bgl0, null, bgl2],
});

Autoriser les fenêtres d'affichage à s'étendre au-delà des limites des cibles de rendu

Les exigences concernant la validation de la fenêtre d'affichage ont été assouplies pour permettre aux fenêtres d'affichage de dépasser les limites de la cible de rendu. Cela est particulièrement utile pour dessiner des éléments 2D tels que l'UI, qui peuvent s'étendre au-delà de la fenêtre d'affichage actuelle. Consultez le problème 390162929.

const passEncoder = myCommandEncoder.beginRenderPass({
  colorAttachments: [
    {
      view: myColorTexture.createView(),
      loadOp: "clear",
      storeOp: "store",
    },
  ],
});

// Set a viewport that extends past the render target's bounds by 8 pixels
// in all directions.
passEncoder.setViewport(
  /*x=*/ -8,
  /*y=*/ -8,
  /*width=*/ myColorTexture.width + 16,
  /*height=*/ myColorTexture.height + 16,
  /*minDepth=*/ 0,
  /*maxDepth=*/ 1,
);

// Draw geometry and complete the render pass as usual.

Accès plus facile au mode de compatibilité expérimental sur Android

L'indicateur chrome://flags/#enable-unsafe-webgpu seul permet désormais d'activer toutes les fonctionnalités requises pour le mode de compatibilité WebGPU expérimental sur Android. Vous pouvez ainsi demander un GPUAdapter en mode compatibilité avec l'option featureLevel: "compatibility" et même accéder au backend OpenGL ES sur les appareils qui ne sont pas compatibles avec Vulkan. Consultez l'exemple suivant et le problème dawn:389876644.

// Request a GPUAdapter in compatibility mode.
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });
La page du rapport WebGPU affiche un GPUAdapter en mode compatibilité sur un appareil Android.
Informations sur l'adaptateur du mode Compatibilité sur webgpureport.org.

Supprimer la limite maxInterStageShaderComponents

Comme nous l'avions annoncé précédemment, la limite maxInterStageShaderComponents est supprimée en raison de plusieurs facteurs :

  • Redondance avec maxInterStageShaderVariables : cette limite a déjà un objectif similaire, à savoir contrôler la quantité de données transmises entre les étapes du nuanceur.
  • Écarts mineurs : bien que les deux limites soient calculées légèrement différemment, ces différences sont mineures et peuvent être gérées efficacement dans la limite de maxInterStageShaderVariables.
  • Simplification : la suppression de maxInterStageShaderComponents simplifie l'interface du nuanceur et réduit la complexité pour les développeurs. Au lieu de gérer deux limites distinctes avec de subtiles différences, ils peuvent se concentrer sur la limite maxInterStageShaderVariables, dont le nom est plus approprié et qui est plus complète.

Consultez Projet de suppression et le problème 364338810.

Mises à jour de l'Aube

Il n'est plus possible d'utiliser un échantillonneur de filtrage pour échantillonner une texture de profondeur. Pour rappel, une texture de profondeur ne peut être utilisée qu'avec un échantillonneur sans filtrage ou de comparaison. Consultez le problème 379788112.

Les structures WGPURequiredLimits et WGPUSupportedLimits ont été aplaties dans WGPULimits. Consultez le problème 374263404.

Les structs suivants ont été renommés. Consultez le problème 42240793.

  • WGPUImageCopyBuffer est désormais WGPUTexelCopyBufferInfo.
  • WGPUImageCopyTexture est désormais WGPUTexelCopyTextureInfo.
  • WGPUTextureDataLayout est désormais WGPUTexelCopyBufferLayout.

Les membres subgroupMinSize et subgroupMaxSize ont été ajoutés à la structure WGPUAdapterInfo. Consultez la demande d'extraction webgpu-headers.

Il est désormais possible de suivre l'utilisation de l'API Dawn dans Metal lorsque vous exécutez votre programme avec la variable d'environnement DAWN_TRACE_FILE_BASE, qui enregistre un fichier .gputrace pouvant être chargé ultérieurement dans le débogueur Metal d'Xcode. Consultez la documentation Déboguer Dawn.

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