Wat is er nieuw in WebGPU (Chrome 137),Wat is er nieuw in WebGPU (Chrome 137)

François Beaufort
François Beaufort

Gepubliceerd: 26 mei 2025

Gebruik textuurweergave voor externe textuurbinding

Er kan nu een compatibele GPUTextureView (2D, één subresource) worden gebruikt in plaats van een GPUExternalTexture-binding bij het maken van een GPUBindGroup.

Dit vereenvoudigt shaderlogica in video-effectpipelines waar zowel GPUExternalTexture (voor bronvideo) als GPUTextureView (voor tussenverwerking) moeten worden verwerkt. Het vermindert ook de noodzaak om shaders dynamisch te compileren, afhankelijk van de herkomst van de textuur. Zie Intent to Ship: WebGPU: GPUTextureView voor 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

Dankzij een nieuwe GPUCommandEncoder-methodeoverload kunnen ontwikkelaars offsets en grootteparameters weglaten bij het gebruik van copyBufferToBuffer() om het kopiëren van volledige buffers te vereenvoudigen. Zie 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-werkgroepUniformLoad met behulp van een pointer naar atomaire

Voor het gemak van ontwikkelaars is een nieuwe workgroupUniformLoad(ptr) -overload in WGSL toegevoegd. Deze laadt atomisch de waarde waarnaar ptr verwijst en retourneert deze naar alle aanroepen in de werkgroep, waarbij ptr een pointer-naar-atom binnen een werkgroepvariabele is. Zie issue 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 powerPreference-kenmerk

Het niet-standaard powerPreference GPUAdapterInfo-tekenreekskenmerk is nu beschikbaar wanneer de gebruiker de vlag 'WebGPU Developer Features' heeft ingeschakeld op chrome://flags/#enable-webgpu-developer-features . Indien ondersteund, kan de powerPreference -waarde "low-power" of "high-performance" zijn, afhankelijk van de GPUPowerPreference-waarde die werd 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.
  }
}

GPURequestAdapterOptions compatibilityMode-kenmerk verwijderen

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

Dawn-updates

Ontwikkelaars kunnen WebGPU-projecten bouwen in talen zoals C++, met behulp van webgpu.h, zowel voor WebAssembly als voor specifieke platforms. Dawn's onlangs uitgebrachte "emdawnwebgpu" ("Emscripten Dawn WebGPU") implementeert de nieuwste gestandaardiseerde webgpu.h via de browser-API.

Emdawnwebgpu is een (onderhouden) fork van de (nu niet-onderhouden) ingebouwde bindingen van Emscripten ( USE_WEBGPU ). Alle nieuwe ontwikkelingen vinden plaats op emdawnwebgpu, en de ingebouwde bindingen van Emscripten zullen worden verwijderd zodra ontwikkelaars overstappen op emdawnwebgpu. De C-header van Emdawnwebgpu lijkt sterk op die van Dawn, terwijl de ingebouwde bindingen aanzienlijk verouderd zijn.

Download emdawnwebgpu van Dawn's GitHub releases-pagina en lees de README.md van het pakket voor informatie over het gebruik ervan. De bronbestanden zijn te vinden in de Dawn repository .

Voor een volledige handleiding kunt u de bijgewerkte documentatie 'Een app bouwen met WebGPU' raadplegen.

Dit behandelt slechts enkele van de belangrijkste hoogtepunten. Bekijk de volledige lijst met commits .

Wat is er nieuw in WebGPU

Een lijst met alles wat in de serie Wat is er nieuw in WebGPU is behandeld.

Chroom 138

Chroom 137

Chroom 136

Chroom 135

Chroom 134

Chroom 133

Chroom 132

Chroom 131

Chroom 130

Chroom 129

Chroom 128

Chroom 127

Chroom 126

Chroom 125

Chroom 124

Chroom 123

Chroom 122

Chroom 121

Chroom 120

Chroom 119

Chroom 118

Chroom 117

Chroom 116

Chroom 115

Chroom 114

Chroom 113