Nieuw in WebGPU (Chrome 137)

François Beaufort
François Beaufort

Gepubliceerd: 26 mei 2025

Textuurweergave gebruiken voor externe textuurbinding

Een compatibele GPUTextureView (2D, één subresource) mag nu worden gebruikt in plaats van een GPUExternalTexture-binding als je een GPUBindGroup maakt.

Dit vereenvoudigt de shaderlogica in pijplijnen voor video-effecten waarin zowel GPUExternalTexture (voor bronvideo) als GPUTextureView (voor tussenverwerking) moeten worden verwerkt. Ook hoeft de shader niet meer dynamisch te worden gecompileerd, afhankelijk van waar de textuur vandaan komt. Ga naar 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 } },
  ],
});

Buffers kopiëren zonder offsets en grootte op te geven

Met een nieuwe overbelasting van de GPUCommandEncoder-methode kunnen ontwikkelaars offsets en grootteparameters weglaten als ze copyBufferToBuffer() gebruiken om het kopiëren van hele buffers te vereenvoudigen. Ga naar 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 met een pointer naar atomic

Er is een nieuwe workgroupUniformLoad(ptr)-overload in WGSL toegevoegd voor het gemak van ontwikkelaars. De functie laadt de waarde waarnaar ptr verwijst atomisch en retourneert deze naar alle aanroepen in de werkgroep, waarbij ptr een pointer-to-atomic is binnen een werkgroepvariabele. Ga naar probleem 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);
}

Kenmerk powerPreference van GPUAdapterInfo

Het niet-standaard tekenreekskenmerk powerPreference GPUAdapterInfo is nu beschikbaar als de gebruiker de vlag WebGPU Developer Features (WebGPU-ontwikkelaarsfuncties) heeft aangezet op chrome://flags/#enable-webgpu-developer-features. Als dit wordt ondersteund, kan de waarde powerPreference "low-power" of "high-performance" zijn, afhankelijk van de GPUPowerPreference-waarde die is gebruikt in GPURequestAdapterOptions. Zie 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.
  }
}

Kenmerk compatibilityMode verwijderen uit GPURequestAdapterOptions

Het experimentele kenmerk GPURequestAdapterOptions compatibilityMode is verwijderd ten gunste van het gestandaardiseerde kenmerk featureLevel dat in Chrome 133 is toegevoegd. Ga naar probleem 366151404.

Updates voor Dawn

Ontwikkelaars kunnen WebGPU-projecten maken in talen zoals C++. Ze gebruiken webgpu.h om zowel WebAssembly als specifieke platforms te targeten. De nieuwe versie van Dawn, emdawnwebgpu (Emscripten Dawn WebGPU), implementeert de nieuwste gestandaardiseerde webgpu.h via de browser-API.

Emdawnwebgpu is een (onderhouden) fork van de (nu niet meer onderhouden) ingebouwde bindingen (USE_WEBGPU) van Emscripten. Alle nieuwe ontwikkelingen worden uitgevoerd op emdawnwebgpu en de ingebouwde bindingen van Emscripten worden verwijderd als ontwikkelaars overstappen naar emdawnwebgpu. De C-header van Emdawnwebgpu lijkt erg op die van Dawn, terwijl de ingebouwde bindingen aanzienlijk verouderd zijn.

Download emdawnwebgpu van de GitHub-releasepagina van Dawn en lees de README.md van het pakket voor informatie over het gebruik ervan. Je vindt de bronbestanden in de Dawn-repository.

Ga naar de geüpdatete documentatie Een app maken met WebGPU voor een complete handleiding.

Dit zijn maar enkele van de belangrijkste punten. Neem de uitgebreide lijst met doorvoeringen door.

Wat is er nieuw in WebGPU?

Een lijst met alles wat is behandeld in de serie Nieuw in WebGPU.

Chrome 155-156

Chrome 153-154

Chrome 151-152

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