Neuigkeiten bei WebGPU (Chrome 137)

François Beaufort
François Beaufort

Veröffentlicht am 26. Mai 2025

Texturansicht für die Bindung von „externalTexture“ 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 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

In WGSL wurde eine neue workgroupUniformLoad(ptr)-Überladung hinzugefügt, um Entwicklern die Arbeit zu erleichtern. Sie lädt atomar den Wert, auf den ptr verweist, und gibt ihn an alle Aufrufe in der Arbeitsgruppe zurück. Dabei ist ptr ein Pointer-to-Atomic in 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);
}

GPUAdapterInfo-Attribut „powerPreference“

Das nicht standardmäßige powerPreference-Stringattribut „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 je nach dem in GPURequestAdapterOptions verwendeten GPUPowerPreference-Wert entweder "low-power" oder "high-performance" sein. 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.
  }
}

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 Dawn-Implementierung „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 den 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 Highlights. Vollständige Liste der Commits

Neuigkeiten zu WebGPU

Eine Liste aller Themen, die in der Reihe What's New in WebGPU behandelt wurden.

Chrome 149–150

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