Neuigkeiten bei WebGPU (Chrome 137)

François Beaufort
François Beaufort

Veröffentlicht: 26. Mai 2025

Texturanzeige für die Bindung von „externalTexture“ verwenden

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

Dadurch wird die Shaderlogik in Videoeffekt-Pipelines vereinfacht, in denen sowohl GPUExternalTexture (für das 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 } },
  ],
});

Zwischenspeicher werden ohne Angabe von Offset und Größe kopiert

Mit einer neuen Überladung der GPUCommandEncoder-Methode können Entwickler bei Verwendung von copyBufferToBuffer() Offset- und Größenparameter weglassen, um das Kopieren ganzer Buffers 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 Verweis auf atomisch

Für Entwickler wurde in WGSL eine neue workgroupUniformLoad(ptr)-Überladung 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 innerhalb 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 Stringattribut „powerPreference GPUAdapterInfo“ ist jetzt verfügbar, wenn der Nutzer die Option „WebGPU-Entwicklerfunktionen“ unter chrome://flags/#enable-webgpu-developer-features aktiviert hat. Wenn unterstützt, kann der Wert „powerPreference“ entweder „"low-power"“ oder „"high-performance"“ sein, je nachdem, welcher Wert für „GPUPowerPreference“ in GPURequestAdapterOptions verwendet wurde. 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“ von GPURequestAdapterOptions

Das experimentelle Attribut „GPURequestAdapterOptions“ compatibilityMode wurde zugunsten des standardisierten Attributs featureLevel entfernt, das in Chrome 133 hinzugefügt wurde. Siehe Problem 366151404.

Dawn-Updates

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

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

Lade emdawnwebgpu von der GitHub-Release-Seite von Dawn herunter und lies dir die README.md des Pakets durch, um mehr über die Verwendung zu erfahren. Die Quelldateien finden Sie im Dawn-Repository.

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

Dies sind nur einige der wichtigsten Highlights. Eine vollständige Liste der Commits finden Sie hier.

Das ist neu bei WebGPU

Eine Liste aller Themen, die in der Reihe Was ist neu in WebGPU? behandelt wurden.

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