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

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

Cela simplifie la logique de nuanceur 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 des nuanceurs en fonction de la source de la texture. Consultez 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 } },
  ],
});

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

Une nouvelle surcharge de méthode GPUCommandEncoder permet aux développeurs d'omettre les décalages et les paramètres de taille lorsqu'ils utilisent copyBufferToBuffer() pour simplifier la copie de tampons entiers. Consultez Intent to Ship: WebGPU: copyBufferToBuffer overload (Changement prévu : WebGPU : surcharge de 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);

WorkgroupUniformLoad WGSL à l'aide d'un pointeur vers un atomique

Une nouvelle surcharge workgroupUniformLoad(ptr) a été ajoutée dans WGSL pour plus de commodité pour les 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 atomique dans 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 GPUAdapterInfo powerPreference non standard est désormais disponible lorsque l'utilisateur a activé l'indicateur "Fonctionnalités de développement WebGPU" à chrome://flags/#enable-webgpu-developer-features. Si elle est prise en charge, 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.
  }
}

Suppression de l'attribut compatibilityMode de GPURequestAdapterOptions

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

Informations Dawn

Les développeurs peuvent créer des projets WebGPU dans des langages tels que C++, à l'aide de 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 via l'API du navigateur.

Emdawnwebgpu est un fork (maintenu) des liaisons intégrées (USE_WEBGPU) d'Emscripten (maintenant non gérées). 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 GitHub de Dawn et consultez 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 sur la création d'une application avec WebGPU.

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