Nouveautés de WebGPU (Chrome 137)

François Beaufort
François Beaufort

Publié le : 26 mai 2025

Utiliser la vue de texture pour la liaison externalTexture

Il est désormais possible d'utiliser une GPUTextureView compatible (2D, sous-ressource unique) à la place d'une liaison GPUExternalTexture lors de la création d'un GPUBindGroup.

Cela simplifie la logique des nuanceurs dans les pipelines d'effets vidéo où GPUExternalTexture (pour la vidéo source) et GPUTextureView (pour le traitement intermédiaire) doivent être gérés. Cela réduit également la nécessité de compiler dynamiquement les nuanceurs en fonction de la provenance de la texture. Consultez Intent to Ship: WebGPU: GPUTextureView for externalTexture binding.

const texture = myDevice.createTexture({
  size: [42, 42],
  format: navigator.gpu.getPreferredCanvasFormat(),
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

const code = `
@group(0) @binding(0) var texture : texture_external;
@group(0) @binding(1) var<storage, read_write> buffer: vec2u;
    
@compute @workgroup_size(1) fn main() {
  buffer = textureDimensions(texture);
}`;

const pipeline = myDevice.createComputePipeline({
  layout: "auto",
  compute: { module: myDevice.createShaderModule({ code }) },
});

const bindGroup = myDevice.createBindGroup({
  layout: pipeline.getBindGroupLayout(0),
  entries: [
    { binding: 0, resource: texture.createView() }, // Use texture view for an externalTexture binding
    { binding: 1, resource: { buffer: myBuffer } },
  ],
});

Copie des tampons sans spécifier les décalages ni la taille

Une nouvelle surcharge de méthode GPUCommandEncoder permet aux développeurs d'omettre les paramètres de décalage et de taille lors de l'utilisation de copyBufferToBuffer() pour simplifier la copie de tampons entiers. Consultez Intent to Ship: WebGPU: copyBufferToBuffer overload.

const size = 42;
const srcBuffer = myDevice.createBuffer({
  size,
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
});
const dstBuffer = myDevice.createBuffer({
  size,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
});

// Copy entire buffer.
myCommandEncoder.copyBufferToBuffer(srcBuffer, dstBuffer);

// This is the same as the following.
// myCommandEncoder.copyBufferToBuffer(srcBuffer, 0, dstBuffer, 0, size);

WGSL workgroupUniformLoad utilisant un pointeur vers un atome

Une nouvelle surcharge workgroupUniformLoad(ptr) a été ajoutée à WGSL pour faciliter la tâche des développeurs. Il charge de manière atomique la valeur pointée par ptr et la renvoie à toutes les invocations du groupe de travail, où ptr est un pointeur vers un atome à l'intérieur d'une variable de groupe de travail. Voir le problème 408241039.

@group(0) @binding(0) var<storage, read_write> buffer : array<u32, 1>;

var<workgroup> wgvar : atomic<u32>;

@compute @workgroup_size(1, 1)
fn main(@builtin(local_invocation_index) lid: u32) {
  if (lid == 0) {
    atomicStore(&(wgvar), 42u);
  }
  buffer[lid] = workgroupUniformLoad(&wgvar);
}

Attribut powerPreference de GPUAdapterInfo

L'attribut de chaîne powerPreference non standard de GPUAdapterInfo est désormais disponible lorsque l'utilisateur a activé le flag "WebGPU Developer Features" (Fonctionnalités pour les développeurs WebGPU) sur chrome://flags/#enable-webgpu-developer-features. Si elle est acceptée, la valeur powerPreference peut être "low-power" ou "high-performance" selon la valeur GPUPowerPreference utilisée dans GPURequestAdapterOptions. Voir CL 6438860.

function checkPowerPreferenceForGpuDevice(device) {
  const powerPreference = device.adapterInfo.powerPreference;
  if (powerPreference === "high-performance") {
    // High-performance GPU detected. Enabling enhanced graphics settings.
  } else if (powerPreference === "low-power") {
    // Low-power GPU detected. Optimizing for battery life.
  }
}

Suppression de l'attribut compatibilityMode de GPURequestAdapterOptions

L'attribut expérimental GPURequestAdapterOptions compatibilityMode a été supprimé au profit de l'attribut standardisé featureLevel ajouté dans Chrome 133. Consultez le problème 366151404.

Mises à jour de l'Aube

Les développeurs peuvent créer des projets WebGPU dans des langages tels que C++, en utilisant webgpu.h pour cibler à la fois WebAssembly et des plates-formes spécifiques. La nouvelle version de Dawn, "emdawnwebgpu " ("Emscripten Dawn WebGPU"), implémente la dernière version standardisée de webgpu.h sur l'API du navigateur.

Emdawnwebgpu est un fork (maintenu) des liaisons intégrées d'Emscripten (désormais non maintenues) (USE_WEBGPU). Tout nouveau développement est effectué sur emdawnwebgpu, et les liaisons intégrées d'Emscripten seront supprimées à mesure que les développeurs passeront à emdawnwebgpu. L'en-tête C d'Emdawnwebgpu est très proche de celui de Dawn, tandis que les liaisons intégrées sont considérablement obsolètes.

Téléchargez emdawnwebgpu depuis la page des versions de Dawn sur GitHub et lisez le fichier README.md du package pour savoir comment l'utiliser. Les fichiers sources se trouvent dans le dépôt Dawn.

Pour obtenir un guide complet, consultez la documentation mise à jour Créer une application avec WebGPU.

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