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

Une GPUTextureView compatible (2D, sous-ressource unique) peut désormais être utilisée à 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 le besoin de compiler dynamiquement les nuanceurs en fonction de la provenance de la texture. Consultez la section Intent to Ship: WebGPU: GPUTextureView for externalTexture binding (Changement prévu : WebGPU : GPUTextureView pour la liaison externalTexture).

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 } },
  ],
});

Copier des tampons sans spécifier de décalages ni de taille

Une nouvelle surcharge de la méthode GPUCommandEncoder permet aux développeurs d'omettre les paramètres de décalage et de taille lorsqu'ils utilisent copyBufferToBuffer() pour simplifier la copie de tampons entiers. Consultez la section Intent to Ship: WebGPU: copyBufferToBuffer overload (Changement prévu : WebGPU : surcharge copyBufferToBuffer).

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 atomic

Une nouvelle surcharge workgroupUniformLoad(ptr) a été ajoutée à WGSL pour faciliter la tâche des développeurs. Elle 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 atomic dans une variable de groupe de travail. Consultez 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 GPUAdapterInfo non standard powerPreference est désormais disponible lorsque l'utilisateur a activé l'indicateur "WebGPU Developer Features" (Fonctionnalités pour les développeurs WebGPU) sur chrome://flags/#enable-webgpu-developer-features. Si elle est compatible, la valeur powerPreference peut être "low-power" ou "high-performance" en fonction de la valeur GPUPowerPreference utilisée dans GPURequestAdapterOptions. Consultez 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.
  }
}

Supprimer 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 Dawn

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 "emdawnwebgpu" ("Emscripten Dawn WebGPU") de Dawn 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ésormais non maintenues) d'Emscripten (USE_WEBGPU). Tous les nouveaux développements sont effectués 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 Créer une application avec WebGPU mise à jour.

Cette section ne couvre que quelques-uns des principaux points forts. 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 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

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