Neuigkeiten bei WebGPU (Chrome 137)

François Beaufort
François Beaufort

Veröffentlicht am 26. Mai 2025

Texturansicht für externalTexture-Bindung verwenden

Beim Erstellen einer GPUBindGroup darf jetzt eine kompatible GPUTextureView (2D, einzelne Unterressource) anstelle einer GPUExternalTexture-Bindung verwendet werden.

Dadurch wird die Shader-Logik in Videoeffekt-Pipelines vereinfacht, in denen sowohl GPUExternalTexture (für Quellvideo) als auch GPUTextureView (für die Zwischenverarbeitung) verarbeitet werden müssen. Außerdem müssen Shader nicht mehr dynamisch kompiliert werden, je nachdem, woher die Textur stammt. Weitere Informationen finden Sie unter 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 } },
  ],
});

Puffer werden ohne Angabe von Offsets und Größe kopiert

Mit einer neuen Überladung der GPUCommandEncoder-Methode können Entwickler beim Verwenden von copyBufferToBuffer() die Parameter für Offset und Größe weglassen, um das Kopieren ganzer Puffer zu vereinfachen. Weitere Informationen finden Sie unter 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 mit Zeiger auf Atomic

Für Entwickler wurde eine neue workgroupUniformLoad(ptr)-Überladung in WGSL hinzugefügt. Der Wert, auf den ptr verweist, wird atomar geladen und an alle Aufrufe in der Arbeitsgruppe zurückgegeben. Dabei ist ptr ein Pointer-to-Atomic in einer Arbeitsgruppenvariablen. Siehe Problem 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);
}

GPUAdapterInfo-Attribut „powerPreference“

Das nicht standardmäßige GPUAdapterInfo-Stringattribut powerPreference ist jetzt verfügbar, wenn der Nutzer das Flag „WebGPU Developer Features“ unter chrome://flags/#enable-webgpu-developer-features aktiviert hat. Falls unterstützt, kann der Wert von powerPreference je nach dem in GPURequestAdapterOptions verwendeten Wert von GPUPowerPreference entweder "low-power" oder "high-performance" sein. Siehe 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.
  }
}

Entfernen des Attributs „compatibilityMode“ für GPURequestAdapterOptions

Das experimentelle GPURequestAdapterOptions-Attribut „compatibilityMode“ wurde zugunsten des standardisierten Attributs „featureLevel“ entfernt, das in Chrome 133 hinzugefügt wurde. Weitere Informationen finden Sie unter Problem 366151404.

Dawn-Updates

Entwickler können WebGPU-Projekte in Sprachen wie C++ erstellen und mit webgpu.h sowohl WebAssembly als auch bestimmte Plattformen anvisieren. Die neu veröffentlichte Version von Dawn, „emdawnwebgpu“ („Emscripten Dawn WebGPU“), implementiert die neueste standardisierte webgpu.h über die Browser-API.

Emdawnwebgpu ist ein (gewarteter) Fork der (inzwischen nicht mehr gewarteten) integrierten Bindungen von Emscripten (USE_WEBGPU). Alle neuen Entwicklungen werden in emdawnwebgpu vorgenommen und die integrierten Bindungen von Emscripten werden entfernt, wenn Entwickler zu emdawnwebgpu wechseln. Der C-Header von Emdawnwebgpu ähnelt dem von Dawn sehr, während die integrierten Bindungen deutlich veraltet sind.

Laden Sie emdawnwebgpu von der GitHub-Seite mit Dawn-Releases herunter und lesen Sie die README.md-Datei des Pakets, um Informationen zur Verwendung zu erhalten. Die Quelldateien finden Sie im Dawn-Repository.

Eine vollständige Anleitung finden Sie in der aktualisierten Dokumentation App mit WebGPU erstellen.

Dies sind nur einige der wichtigsten Neuerungen. Vollständige Liste der Commits

Neues zu WebGPU

Eine Liste mit allen Themen, die in der Reihe Neu in WebGPU behandelt wurden.

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