Wat is er nieuw in WebGPU (Chrome 132)

François Beaufort
François Beaufort

Gepubliceerd: 8 januari 2025

Gebruik van textuurweergave

GPU-textuurweergaven nemen momenteel alle gebruiksvlaggen over van hun bron-GPU-textuur. Dit kan problematisch zijn, omdat sommige weergaveformaten niet compatibel zijn met bepaalde toepassingen. Om dit probleem op te lossen, kunt u door createView() aan te roepen met het optionele usage , expliciet een subset van de gebruiksvlaggen van de brontextuur opgeven die compatibel zijn met het gekozen weergaveformaat.

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

Zie het volgende fragment, de chromestatus-invoer 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 kleurbandartefacten te voorkomen. Bijvoorbeeld bij wetenschappelijke visualisatie.

De nieuwe "float32-blendable" GPU-functie maakt GPU-texturen met de formaten "r32float" , "rg32float" en "rgba32float" blendable. Het is nu mogelijk om een ​​renderpijplijn te creëren die blending gebruikt met elke float32-formaatbijlage bij het aanvragen van een GPU-apparaat met deze functie.

Zie het volgende fragment, de chromestatus-invoer 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 kenmerk

Het is belangrijk voor bibliotheken die GPUDevice -objecten van de gebruiker gebruiken om toegang te krijgen tot informatie over de fysieke GPU, omdat ze mogelijk oplossingen moeten optimaliseren of implementeren op basis van de GPU-architectuur. Hoewel het mogelijk is om toegang te krijgen tot deze informatie via het GPUAdapter -object, is er geen directe manier om deze informatie alleen van een GPUDevice te verkrijgen. Dit kan onhandig zijn, omdat gebruikers mogelijk aanvullende informatie moeten opgeven naast het GPUDevice .

Om dit probleem op te lossen, wordt GPUAdapterInfo nu weergegeven via het adapterInfo kenmerk GPUDevice . Deze zijn vergelijkbaar met het bestaande GPUAdapter info -kenmerk.

Zie het volgende fragment, de chromestatus-invoer 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 ongeldige indeling levert een JavaScript-fout op

Voorheen resulteerde het gebruik van een ongeldige textuurindeling met de configure() -methode van de GPU-canvascontext in een GPU-validatiefout. Dit is gewijzigd en genereert nu een JavaScript TypeError . Dit voorkomt scenario's waarin getCurrentTexture() een geldige GPU-textuur retourneert, ondanks dat de GPU-canvascontext onjuist is geconfigureerd. Meer informatie is te vinden in issue 372837859 .

Filteren van samplerbeperkingen op texturen

Het gebruik van texturen in de formaten "sint" , "uint" en " depth" met filterende samples was voorheen toegestaan. Het staat nu correct het gebruik van een "sint" of "uint" -textuur met een filterende sampler niet toe. Merk op dat er momenteel een waarschuwing wordt weergegeven als u een " depth" -textuur met een filterende sampler gebruikt, aangezien dit in de toekomst niet meer is toegestaan. Zie probleem 376497143 .

Deze beperkingen betekenen dat het gebruik van een dieptetextuur met een niet-filterende sampler handmatige aanmaak van bindgroeplay-outs vereist. Dit komt doordat de automatisch gegenereerde bindgroeplay-outs deze combinatie nog niet ondersteunen. Spec 4952 bevat een voorstel dat wordt overwogen om deze beperking in de toekomst aan te pakken.

Uitgebreide subgroepsexperimenten

De experimenten met de subgroepen , die aanvankelijk zouden eindigen in Chrome 131, zijn uitgebreid naar Chrome 133 en eindigen op 16 april 2025. Hoewel de eerste proef zich richtte op prestaties, ontbraken er cruciale overdraagbaarheidsmaatregelen . Deze maatregelen worden nu toegevoegd, wat mogelijk fouten in bestaande code veroorzaakt.

Verbetering van de ontwikkelaarservaring

Er is nu een waarschuwing zichtbaar in DevTools wanneer de optie powerPreference wordt gebruikt met requestAdapter() op Windows. Deze waarschuwing wordt verwijderd wanneer Chrome weet hoe twee verschillende GPU's moeten worden gebruikt en de resultaten tussen deze GPU's moeten worden samengesteld. Zie probleem 369219127 .

De grootte van de GPU-buffer wordt nu weergegeven in de foutmelding bij het aanmaken van een te grote GPU-buffer. Zie probleem 374167798 .

Experimentele ondersteuning voor 16-bits genormaliseerde textuurformaten

16-bit signed genormaliseerde en unsigned genormaliseerde textuurformaten zijn nu experimenteel beschikbaar achter respectievelijk de GPU-functies "chromium-experimental-snorm16-texture-formats" en "chromium-experimental-unorm16-texture-formats" terwijl er discussie is over standaardisatie .

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

Totdat deze experimentele functies gestandaardiseerd zijn, schakelt u de vlag 'Ondersteuning voor onveilige WebGPU' in op 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 probleem 368672123 .

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

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 140

Chroom 139

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