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 bepaald gebruik. Om dit probleem op te lossen, kunt u createView() aanroepen met het optionele usage , zodat u expliciet een subset van de gebruiksvlaggen van de brontextuur kunt opgeven die compatibel zijn met het gekozen weergaveformaat.

Deze wijziging maakt voorafgaande validatie en een nauwkeurigere controle mogelijk over hoe de weergave wordt gebruikt. Het sluit ook aan bij andere grafische API's waarbij gebruiksvlaggen algemene parameters zijn bij het maken van weergaven, wat optimalisatiemogelijkheden biedt.

Zie het volgende fragment, de chromestatus-invoer en uitgave 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 zwevende texturen mengen

32-bits drijvende-kommatexturen zijn essentieel voor HDR-weergave om een ​​breed scala aan kleurwaarden te behouden en kleurbandartefacten te voorkomen. Bijvoorbeeld in wetenschappelijke visualisatie.

De nieuwe "float32-blendable" GPU-functie maakt GPU-texturen met de formaten "r32float" , "rg32float" en "rgba32float" mengbaar. Het maken van een renderpijplijn die gebruikmaakt van blending met elke bijlage in float32-formaat is nu mogelijk 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 dat bibliotheken die door de gebruiker geleverde GPUDevice objecten gebruiken, toegang 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 alleen van een GPUDevice te verkrijgen. Dit kan lastig zijn, omdat gebruikers mogelijk naast GPUDevice aanvullende informatie moeten opgeven.

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

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 canvascontext met een ongeldig formaat levert een JavaScript-fout op

Voorheen resulteerde het gebruik van een ongeldig textuurformaat met de configure() -methode van de GPU-canvascontext in een GPU-validatiefout. Dit is gewijzigd om een ​​JavaScript TypeError te genereren. Dit voorkomt scenario's waarin getCurrentTexture() een geldige GPU-textuur retourneert, ondanks dat de GPU-canvascontext onjuist is geconfigureerd. Meer informatie vindt u in nummer 372837859 .

Filteren van samplerbeperkingen op texturen

Het gebruik van texturen in de formaten "sint" , "uint" en " depth" met filtermonsters was eerder toegestaan. Het staat nu correct het gebruik van een "sint" of "uint" formaattextuur met een filterende sampler toe. Houd er rekening mee dat er momenteel een waarschuwing wordt weergegeven als u een " depth" -textuur gebruikt met een filterende sampler, aangezien dit in de toekomst niet meer zal worden toegestaan. Zie uitgave 376497143 .

Deze beperkingen betekenen dat het gebruik van een dieptetextuur met een niet-filterende sampler het handmatig maken van bindingsgroeplay-outs vereist. Dit komt omdat de automatisch gegenereerde bindingsgroeplay-outs deze combinatie nog niet ondersteunen. Specificatienummer 4952 bevat een voorstel dat wordt overwogen om deze beperking in de toekomst aan te pakken.

Uitgebreide experimenten met subgroepen

Het experiment met subgroepen , dat aanvankelijk zou eindigen in Chrome 131, is uitgebreid naar Chrome 133 en eindigt op 16 april 2025. Hoewel de eerste origin-proef zich richtte op prestaties, ontbrak het aan cruciale waarborgen voor draagbaarheid . Deze beveiligingen worden nu toegevoegd, waardoor mogelijk fouten in de bestaande code kunnen ontstaan.

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 hij twee verschillende GPU's moet gebruiken en de resultaten daartussen moet samenstellen. Zie uitgave 369219127 .

De grootte van de GPU-buffer is nu aanwezig in de foutmelding bij het maken van een te grote GPU-buffer. Zie uitgave 374167798 .

Experimentele ondersteuning voor 16-bits genormaliseerde textuurformaten

16-bit ondertekende genormaliseerde en niet-ondertekende genormaliseerde textuurformaten zijn nu experimenteel beschikbaar achter de GPU-functies "chromium-experimental-snorm16-texture-formats" en "chromium-experimental-unorm16-texture-formats" terwijl ze worden besproken voor standaardisatie .

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

Totdat deze experimentele functies zijn gestandaardiseerd, schakelt u de vlag 'Onveilige WebGPU-ondersteuning' 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 ten gunste van het gebruik van GetFeatures(SupportedFeatures * features) . Zie uitgave 368672123 .

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

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

Wat is er nieuw in WebGPU

Een lijst met alles wat aan bod komt in de What's New in WebGPU -serie.

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