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 de textuurweergave voor het binden van externe texturen.

Het is nu toegestaan ​​om een ​​compatibele GPUTextureView (2D, enkele subresource) te gebruiken in plaats van een GPUExternalTexture-binding bij het maken van een GPUBindGroup.

Dit vereenvoudigt de shaderlogica in video-effectpipelines waar zowel GPUExternalTexture (voor de bronvideo) als GPUTextureView (voor de tussenliggende verwerking) moeten worden verwerkt. Het vermindert ook de noodzaak om shaders dynamisch te compileren, afhankelijk van waar de textuur vandaan komt. 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 specificatie van offsets en grootte.

Een nieuwe overbelasting van de GPUCommandEncoder-methode stelt ontwikkelaars in staat om offsets en grootteparameters weg te laten bij het gebruik copyBufferToBuffer() , waardoor het kopiëren van volledige buffers wordt vereenvoudigd. 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 workgroupUniformLoad gebruikt een pointer naar een atomisch object.

Een nieuwe workgroupUniformLoad(ptr) -overload is toegevoegd aan WGSL voor het gemak van ontwikkelaars. Deze laadt atomisch de waarde waarnaar ptr verwijst en retourneert deze aan alle aanroepen in de werkgroep, waarbij ptr een pointer-to-atomic is binnen een variabele van de werkgroep. 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-attribuut

Het niet-standaard stringkenmerk GPUAdapterInfo powerPreference is nu beschikbaar wanneer de gebruiker de vlag "WebGPU Developer Features" heeft ingeschakeld via chrome://flags/#enable-webgpu-developer-features . Indien ondersteund, kan de powerPreference waarde "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.
  }
}

Verwijder het compatibilityMode-attribuut van GPURequestAdapterOptions

Het experimentele attribuut compatibilityMode van `GPURequestAdapterOptions` is verwijderd en vervangen door het gestandaardiseerde attribuut featureLevel dat is toegevoegd in Chrome 133. Zie probleem 366151404 .

Dawn-updates

Ontwikkelaars kunnen WebGPU-projecten bouwen in talen zoals C++, waarbij ze webgpu.h gebruiken om zowel WebAssembly als specifieke platforms te targeten. Dawn's recent uitgebrachte "emdawnwebgpu" ("Emscripten Dawn WebGPU") implementeert de nieuwste gestandaardiseerde webgpu.h bovenop de browser-API.

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

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

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

Dit is slechts een greep uit de belangrijkste hoogtepunten. Bekijk de volledige lijst met commits .

Wat is er nieuw in WebGPU?

Een lijst van alles wat in de serie ' Wat is nieuw in WebGPU' aan bod is gekomen.

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