Nieuw in WebGPU (Chrome 132)

François Beaufort
François Beaufort

Gepubliceerd: 8 januari 2025

Gebruik van textuurweergave

GPU-textuurweergaven nemen op dit moment alle gebruiksmarkeringen over van hun bron-GPU-textuur. Dit kan problematisch zijn, omdat sommige weergave-indelingen niet compatibel zijn met bepaald gebruik. Je kunt dit probleem oplossen door createView() aan te roepen met het optionele lid usage. Hiermee kun je expliciet een subset van de gebruiksflags van de brontextuur specificeren die compatibel zijn met de gekozen weergave-indeling.

Deze wijziging maakt validatie vooraf en gedetailleerdere controle over het gebruik van de weergave mogelijk. Het komt ook overeen met andere grafische API's waarbij gebruiksmarkeringen veelvoorkomende parameters zijn bij het maken van weergaven, wat mogelijkheden voor optimalisatie biedt.

Raadpleeg het volgende fragment, het chromestatus-item en issue 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.
});

Overvloeien van 32-bits float-texturen

32-bits zwevende-komma-texturen zijn essentieel voor HDR-rendering om een breed scala aan kleurwaarden te behouden en kleurbandingartefacten te voorkomen. Bijvoorbeeld in wetenschappelijke visualisatie.

Met de nieuwe GPU-functie "float32-blendable" kunnen GPU-texturen met de indelingen "r32float", "rg32float" en "rgba32float" worden gemengd. Je kunt nu een weergavepijplijn maken die mengen gebruikt met een bijlage in de indeling float32 als je een GPU-apparaat met deze functie aanvraagt.

Raadpleeg het volgende fragment, het chromestatus-item en issue 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-kenmerk adapterInfo

Het is belangrijk dat bibliotheken die door gebruikers geleverde GPUDevice-objecten gebruiken, toegang hebben tot informatie over de fysieke GPU, omdat ze misschien moeten optimaliseren of tijdelijke oplossingen moeten implementeren op basis van de GPU-architectuur. Je kunt deze informatie wel openen via het GPUAdapter-object, maar er is geen rechtstreekse manier om deze alleen via een GPUDevice te krijgen. Dit kan onhandig zijn, omdat gebruikers misschien aanvullende informatie moeten verstrekken naast de GPUDevice.

GPUAdapterInfo is nu beschikbaar via het kenmerk GPUDevice adapterInfo om dit probleem op te lossen. Deze zijn vergelijkbaar met het bestaande kenmerk GPUAdapter info.

Raadpleeg het volgende fragment, het chromestatus-item en issue 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.
  }
}

Als u het canvascontext configureert met een ongeldige indeling, wordt er een JavaScript-fout gegenereerd

Eerder leidde het gebruik van een ongeldige textuurindeling met de methode configure() van de GPU-canvascontext tot een GPU-validatiefout. Dit is gewijzigd om een JavaScript-TypeError te genereren. Dit voorkomt scenario's waarin getCurrentTexture() een geldige GPU-textuur retourneert, ook al is de GPU-canvascontext onjuist ingesteld. Meer informatie vind je in issue 372837859.

Beperkingen voor het filteren van samplers op texturen

Eerder was het toegestaan om texturen met filtervoorbeelden te gebruiken in de indelingen "sint", "uint" en depth". Het is nu niet meer toegestaan om een textuur in de indeling "sint" of "uint" te gebruiken met een filterende sampler. Op dit moment wordt er een waarschuwing getoond als je een depth"-textuur met een filterende sampler gebruikt, omdat dit in de toekomst niet meer is toegestaan. Ga naar probleem 376497143.

Door deze beperkingen moet je bindgroepindelingen handmatig maken als je een dieptetextuur met een niet-filterende sampler gebruikt. Dit komt omdat de automatisch gemaakte indelingen van bindingsgroepen deze combinatie nog niet ondersteunen. Specificatieprobleem 4952 bevat een voorstel dat wordt overwogen om deze beperking in de toekomst op te lossen.

Uitgebreide experimenten met subgroepen

Het experiment met subgroepen, dat oorspronkelijk zou eindigen in Chrome 131, is verlengd tot Chrome 133 en eindigt op 16 april 2025. De eerste oorsprongsproefperiode was gericht op prestaties, maar er ontbraken cruciale overdraagbaarheidsbeveiligingen. Deze beveiligingsmaatregelen worden nu toegevoegd, wat mogelijk fouten in bestaande code veroorzaakt.

De ontwikkelaarservaring verbeteren

Er is nu een waarschuwing zichtbaar in DevTools als de optie powerPreference wordt gebruikt met requestAdapter() in Windows. Deze waarschuwing wordt verwijderd als Chrome weet hoe 2 verschillende GPU's moeten worden gebruikt en hoe de resultaten moeten worden samengevoegd. Ga naar probleem 369219127.

De grootte van de GPU-buffer staat nu in de foutmelding als je een te grote GPU-buffer maakt. Ga naar probleem 374167798.

Experimentele ondersteuning voor genormaliseerde 16-bits textuurindelingen

16-bits ondertekende genormaliseerde en niet-ondertekende genormaliseerde textuurindelingen 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 genormaliseerde 16-bits textuurindelingen met COPY_SRC-, COPY_DST-, TEXTURE_BINDING- en RENDER_ATTACHMENT-gebruik, multisampling en oplossingsmogelijkheden. De aanvullende indelingen zijn "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm" en "rgba16snorm".

Totdat deze experimentele functies zijn gestandaardiseerd, zet je de vlag 'Unsafe WebGPU Support' aan op chrome://flags/#enable-unsafe-webgpu om ze beschikbaar te maken in Chrome.

Neem het volgende fragment en issue 374790898 door.

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...

Updates voor Dawn

De methoden EnumerateFeatures(FeatureName * features) van wgpu::Adapter en wgpu::Device zijn beëindigd ten gunste van het gebruik van GetFeatures(SupportedFeatures * features). Ga naar probleem 368672123.

In de C API webgpu.h zijn alle char const * gewijzigd in een WGPUStringView-structuur die een weergave van een UTF-8-gecodeerde tekenreeks definieert. Het gedraagt zich als een aanwijzer naar de gegevens van de tekenreeks, gekoppeld aan een lengte. Zo kun je met delen van een tekenreeks werken zonder deze te hoeven kopiëren. Ga naar probleem 42241188.

Dit zijn maar enkele van de belangrijkste punten. Neem de uitgebreide lijst met doorvoeringen door.

Wat is er nieuw in WebGPU?

Een lijst met alles wat is behandeld in de serie Nieuw in WebGPU.

Chrome 155-156

Chrome 153-154

Chrome 151-152

Chrome 149-150

Chrome 147-148

Chrome 146

Chrome 145

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