Nouveautés de WebGPU (Chrome 135)

François Beaufort
François Beaufort

Publié le 26 mars 2025

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

Auparavant, la création d'une mise en page de groupe de liaisons vide nécessitait d'ajouter 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 liaisons 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 forme de groupe de liaisons 0 et 2. Vous pouvez attribuer la mise en page de groupe de liaison 1 aux données de fragment et la mise en page de groupe de liaison 2 aux données de sommet, 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 vues d'affichage à s'étendre au-delà des limites des cibles de rendu

Les exigences de 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. Voir 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 active désormais 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 en mode compatibilité sur webgpureport.org.

Suppression de la limite maxInterStageShaderComponents

Comme annoncé précédemment, la limite maxInterStageShaderComponents est supprimée en raison d'une combinaison de facteurs:

  • Redundance avec maxInterStageShaderVariables: cette limite remplit déjà un objectif similaire, à savoir contrôler la quantité de données transmises entre les étapes de nuanceur.
  • Différences mineures: bien que les deux limites soient calculées de manière légèrement différente, ces différences sont mineures et peuvent être gérées efficacement dans la limite 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 des différences subtiles, ils peuvent se concentrer sur maxInterStageShaderVariables, qui est plus approprié et plus complet.

Consultez l'intention de suppression et le problème 364338810.

Informations Dawn

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 suivantes ont été rebaptisées. Voir 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. Voir la PR 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 sur le débogage de Dawn.

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 tout ce qui a été abordé dans la série Nouveautés de WebGPU.

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