Wat is er nieuw in WebGPU (Chrome 132)

François Beaufort
François Beaufort

Gepubliceerd: 8 januari 2025

Gebruik van textuurweergave

GPU texture views currently inherit all usage flags from their source GPU texture. This can be problematic as some view formats are incompatible with certain usages. To address this issue, calling createView() with the optional usage member lets you explicitly specify a subset of the source texture's usage flags that are compatible with the chosen view format.

Deze wijziging maakt voorafgaande validatie en meer gedetailleerde controle over het gebruik van de weergave mogelijk. Het sluit ook aan bij andere grafische API's waar gebruiksvlaggen veelgebruikte parameters zijn bij het maken van weergaven, wat optimalisatiemogelijkheden biedt.

Zie het volgende fragment, de chromestatus-vermelding en probleem 363903526 .

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

32-bits float-texturen mengen

32-bits floating-point texturen zijn essentieel voor HDR-rendering om een ​​breed scala aan kleurwaarden te behouden en kleurafwijkingen te voorkomen. Bijvoorbeeld in wetenschappelijke visualisaties.

De nieuwe GPU-functie "float32-blendable" maakt het mogelijk om GPU-texturen met de formaten "r32float" , "rg32float" en "rgba32float" te mengen. Het is nu mogelijk om een ​​renderpipeline te creëren die gebruikmaakt van blending met elk type float32-texturen wanneer een GPU-apparaat met deze functie wordt aangevraagd.

Zie het volgende fragment, de chromestatus-vermelding en probleem 369649348 .

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

GPUDevice adapterInfo attribuut

It's important for libraries that take user-provided GPUDevice objects to access information about the physical GPU, as they may need to optimize or implement workarounds based on the GPU architecture. While it is possible to access to this information through the GPUAdapter object, there is no direct way to get it from a GPUDevice alone. This can be inconvenient, as it may require users to provide additional information alongside the GPUDevice .

Om dit probleem op te lossen, wordt GPUAdapterInfo nu beschikbaar gesteld via het GPUDevice adapterInfo attribuut. Deze zijn vergelijkbaar met het bestaande GPUAdapter info attribuut.

Zie het volgende fragment, de chromestatus-vermelding en probleem 376600838 .

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

Het configureren van de canvascontext met een ongeldig formaat veroorzaakt een JavaScript-fout.

Previously, using an invalid texture format with the configure() method of the GPU canvas context resulted in a GPU validation error. This has been changed to throw a JavaScript TypeError . This prevents scenarios where getCurrentTexture() returns a valid GPU texture despite the GPU canvas context being configured incorrectly. More information can be found in issue 372837859 .

Beperkingen van de sampler op texturen filteren

Using "sint" , "uint" , and " depth" format textures with filtering samples was allowed previously. It now correctly disallows using an "sint" or "uint" format texture with a filtering sampler. Note that it currently emits a warning if you use a " depth" texture with a filtering sampler as it will be disallowed in the future. See issue 376497143 .

Those restrictions means using a depth texture with a non-filtering sampler requires manual creation of bind group layouts. This is because the "auto" generated bind group layouts don't support this combination yet. Spec issue 4952 contains a proposal under consideration to address this limitation in the future.

Uitgebreide subgroepsexperimenten

De experimenten met subgroepen , die aanvankelijk zouden eindigen in Chrome 131, zijn verlengd tot Chrome 133 en eindigen op 16 april 2025. Hoewel de eerste test met origin zich richtte op prestaties, ontbraken cruciale waarborgen voor portabiliteit . Deze waarborgen zullen nu worden toegevoegd, wat mogelijk fouten in bestaande code kan veroorzaken.

Verbetering van de ontwikkelaarservaring

Er verschijnt nu een waarschuwing in DevTools wanneer de optie powerPreference wordt gebruikt met requestAdapter() op Windows. Deze waarschuwing verdwijnt zodra Chrome weet hoe twee verschillende GPU's te gebruiken en de resultaten daarvan te combineren. Zie probleem 369219127 .

De grootte van de GPU-buffer wordt nu weergegeven in het foutbericht wanneer een te grote GPU-buffer wordt aangemaakt. Zie probleem 374167798 .

Experimentele ondersteuning voor 16-bits genormaliseerde textuurformaten

16-bit signed normalized and unsigned normalized texture formats are now available experimentally respectively behind the "chromium-experimental-snorm16-texture-formats" and "chromium-experimental-unorm16-texture-formats" GPU features while they're being discussed for standardization .

Deze functies voegen ondersteuning toe voor 16-bits genormaliseerde textuurformaten met COPY_SRC , COPY_DST , TEXTURE_BINDING , RENDER_ATTACHMENT gebruik, multisampling en resolutiemogelijkheden. De extra formaten zijn "r16unorm" , "rg16unorm" , "rgba16unorm" , "r16snorm" , "rg16snorm" en "rgba16snorm" .

Totdat deze experimentele functies gestandaardiseerd zijn, kunt u de vlag "Unsafe WebGPU Support" inschakelen via chrome://flags/#enable-unsafe-webgpu om ze beschikbaar te maken in Chrome.

Zie het volgende fragment en probleem 374790898 .

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

// Send the appropriate commands to the GPU...

Dawn-updates

De methoden EnumerateFeatures(FeatureName * features) van wgpu::Adapter en wgpu::Device zijn verouderd en vervangen door GetFeatures(SupportedFeatures * features) . Zie issue 368672123 .

De C API van webgpu.h heeft alle char const * vervangen door een WGPUStringView -structuur die een weergave definieert van een UTF-8-gecodeerde tekenreeks. Deze structuur fungeert als een pointer naar de gegevens van de tekenreeks, in combinatie met een lengte. Hierdoor kunt u met delen van een tekenreeks werken zonder deze te hoeven kopiëren. Zie issue 42241188 .

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