Neuigkeiten bei WebGPU (Chrome 137)

François Beaufort
François Beaufort

Veröffentlicht: 26. Mai 2025

Texturansicht für die Bindung von „externalTexture“ verwenden

Eine kompatible GPUTextureView (2D, einzelne Unterressource) kann jetzt anstelle einer GPUExternalTexture-Bindung verwendet werden, wenn eine GPUBindGroup erstellt wird.

Dadurch wird die Shader-Logik in Videobearbeitungspipelines vereinfacht, in denen sowohl GPUExternalTexture (für Quellvideo) als auch GPUTextureView (für die Zwischenverarbeitung) verarbeitet werden müssen. Außerdem ist es nicht mehr erforderlich, Shader dynamisch zu kompilieren, 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 ohne Angabe von Offsets und Größe kopieren

Mit einer neuen Überladung der GPUCommandEncoder-Methode können Entwickler Offsets und Größenparameter weglassen, wenn sie copyBufferToBuffer() verwenden, 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. Sie lädt den Wert, auf den ptr verweist, atomar und gibt ihn an alle Aufrufe in der Arbeitsgruppe zurück. Dabei ist ptr ein Zeiger auf „atomic“ innerhalb einer Arbeitsgruppenvariablen. Weitere Informationen finden Sie unter 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);
}

Attribut „powerPreference“ von GPUAdapterInfo

Das nicht standardmäßige String-Attribut powerPreference von GPUAdapterInfo ist jetzt verfügbar, wenn der Nutzer das Flag „WebGPU Developer Features“ unter chrome://flags/#enable-webgpu-developer-features aktiviert hat. Wenn es unterstützt wird, kann der powerPreference Wert entweder "low-power" oder "high-performance" sein, je nachdem, welcher GPUPowerPreference-Wert in GPURequestAdapterOptions verwendet wurde. Weitere Informationen finden Sie unter 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.
  }
}

Attribut „compatibilityMode“ von GPURequestAdapterOptions entfernen

Das experimentelle Attribut GPURequestAdapterOptions 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 ansprechen. Die neu veröffentlichte Version „emdawnwebgpu“ („Emscripten Dawn WebGPU“) von Dawn implementiert die neueste standardisierte Version von webgpu.h über die Browser-API.

Emdawnwebgpu ist ein (gewarteter) Fork der (nicht mehr gewarteten) integrierten Bindungen von Emscripten (USE_WEBGPU). Alle neuen Entwicklungen werden in emdawnwebgpu vorgenommen. 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-Releases-Seite von Dawn 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.

Hier werden nur einige der wichtigsten Neuerungen behandelt. Eine vollständige Liste der Commits finden Sie hier.

Neuerungen in WebGPU

Eine Liste aller Themen, die in der Reihe „Neuerungen in WebGPU“ behandelt wurden.

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