Wat is er nieuw in WebGPU (Chrome 133)

François Beaufort
François Beaufort

Gepubliceerd: 29 januari 2025

Extra unorm8x4-bgra en 1-component hoekpuntformaten

Het hoekpuntformaat "unorm8x4-bgra" en de volgende 1-component hoekpuntformaten zijn toegevoegd: "uint8" , "sint8" , "unorm8" " , "snorm8" , "uint16" , "sint16" , "unorm16" , "snorm16" en "float16" . Het "unorm8x4-bgra" hoekpuntformaat maakt het iets handiger om BGRA-gecodeerde hoekpuntkleuren te laden met behoud van dezelfde arcering. Bovendien kunt u met het 1-component hoekpuntformaat alleen de gegevens opvragen die nodig zijn, terwijl voorheen minstens twee keer zoveel nodig was voor 8- en 16-bits gegevenstypen. Zie de chromestatus-invoer en uitgave 376924407 .

Sta toe dat onbekende limieten worden aangevraagd met een ongedefinieerde waarde

Om de WebGPU API tijdens de ontwikkeling minder broos te maken, kunt u nu onbekende limieten met undefined waarde aanvragen bij het aanvragen van een GPU-apparaat. Dit is bijvoorbeeld handig in de volgende toepassingscode waarbij adapter.limits.someLimit undefined kan zijn als someLimit niet meer bestaat. Zie specificatie PR 4781 .

const adapter = await navigator.gpu.requestAdapter();

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

WGSL-uitlijningsregels veranderen

Het is niet langer mogelijk om een ​​te kleine uitlijningswaarde voor een struct-lid op te geven, omdat het nu vereist is dat @align(n) RequiredAlignOf voor alle structs verdeelt. Deze baanbrekende wijziging vereenvoudigt het gebruik van de WGSL-taal en maakt deze beter compatibel met Firefox en Safari. U kunt voorbeeldcode vinden die de verschillen laat zien tussen Tint-, Naga- en WebKit-compilers in de specificatie PR .

WGSL-prestaties verbeteren met weggooien

Vanwege een aanzienlijke prestatiedaling die is waargenomen bij het weergeven van een complex SSR-effect (Screen Space Reflections), gebruikt de implementatie van de verwijderinstructie de door het platform geleverde semantiek voor het degraderen naar een helperaanroep, indien beschikbaar. Dit verbetert de prestaties van shaders die gebruik maken van weggooien. Zie uitgave 372714384 .

Gebruik VideoFrame displaySize voor externe texturen

De afmetingen displayWidth en displayHeight moeten worden gebruikt als de schijnbare grootte van de GPUExternalTexture bij het importeren van een VideoFrame volgens de WebGPU-specificatie. De zichtbare grootte werd echter onjuist gebruikt, wat problemen veroorzaakte bij het gebruik van textureLoad() op een GPUExternalTexture. Dit is nu opgelost. Zie uitgave 377574981 .

Verwerk afbeeldingen met een niet-standaardoriëntatie met behulp van copyExternalImageToTexture

De copyExternalImageToTexture() GPUQueue-methode wordt gebruikt om de inhoud van een afbeelding of canvas naar een textuur te kopiëren. Het verwerkt nu afbeeldingen met een niet-standaardoriëntatie op de juiste manier. Dit was voorheen niet het geval wanneer de bron een ImageBitmap was met imageOrientation "from-image" of een afbeelding met een niet-standaardoriëntatie. Zie uitgave 384858956 .

Verbetering van de ontwikkelaarservaring

Het kan verrassend zijn als adapter.limits hoge waarden weergeeft, maar u realiseert zich niet dat u expliciet een hogere limiet moet aanvragen bij het aanvragen van een GPU-apparaat. Als u dit niet doet, kan dit ertoe leiden dat u later onverwacht tegen de limieten aanloopt.

Om u te helpen zijn de foutmeldingen uitgebreid met hints die u vertellen dat u expliciet een hogere limiet moet aanvragen als er geen limiet is opgegeven in requiredLimits bij het aanroepen van requestDevice() . Zie uitgave 42240683 .

In het volgende voorbeeld ziet u een verbeterd foutbericht geregistreerd in de DevTools-console bij het maken van een GPU-buffer met een grootte die groter is dan de standaard maximale apparaatlimiet voor de buffergrootte.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

Schakel de compatibiliteitsmodus in met featureLevel

Het aanvragen van een GPU-adapter in de experimentele compatibiliteitsmodus is nu mogelijk door de gestandaardiseerde featureLevel optie in te stellen op "compatibility" . De tekenreeksen "core" (standaard) en "compatibility" zijn de enige toegestane waarden. Zie het volgende voorbeeld en specificatie PR 4897 .

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

De featureLevel optie vervangt de niet-gestandaardiseerde compatibilityMode optie, terwijl het niet-gestandaardiseerde featureLevel attribuut het isCompatibilityMode attribuut vervangt.

Omdat het nog experimenteel is, moet je Chrome voorlopig uitvoeren met de vlag "Unsafe WebGPU Support" op chrome://flags/#enable-unsafe-webgpu . Ga naar webgpureport.org om ermee te spelen.

Experimentele subgroep biedt opschoning

De verouderde experimentele "chromium-experimental-subgroups" en "chromium-experimental-subgroup-uniform-control-flow" zijn verwijderd. Zie uitgave 377868468 .

De experimentele functie "subgroups" is alles wat u nu nodig hebt als u met subgroepen experimenteert . De experimentele functie "subgroups-f16" is verouderd en zal binnenkort worden verwijderd. U kunt f16-waarden gebruiken met subgroepen wanneer uw toepassing zowel "shader-f16" als "subgroups" -functie aanvraagt. Zie uitgave 380244620 .

Beëindig de maxInterStageShaderComponents-limiet

De maxInterStageShaderComponents -limiet is verouderd vanwege een combinatie van factoren:

  • Redundantie met maxInterStageShaderVariables : deze limiet dient al een soortgelijk doel, namelijk het regelen van de hoeveelheid gegevens die tussen shader-fasen wordt doorgegeven.
  • Kleine verschillen: Hoewel er kleine verschillen zijn in de manier waarop de twee limieten worden berekend, zijn deze verschillen klein en kunnen ze effectief worden beheerd binnen de maxInterStageShaderVariables limiet.
  • Vereenvoudiging: het verwijderen van maxInterStageShaderComponents stroomlijnt de shader-interface en vermindert de complexiteit voor ontwikkelaars. In plaats van twee afzonderlijke limieten met subtiele verschillen te beheren, kunnen ze zich concentreren op de beter benoemde en uitgebreidere maxInterStageShaderVariables .

Het doel is om het volledig te verwijderen in Chrome 135. Zie het voornemen om het programma te beëindigen en 364338810 uit te geven .

Dawn-updates

Met wgpu::Device::GetAdapterInfo(adapterInfo) kunt u adapterinformatie rechtstreeks ophalen van een wgpu::Device . Zie uitgave 376600838 .

De WGPUProgrammableStageDescriptor -structuur is hernoemd naar WGPUComputeState om de rekenstatus consistent te maken met hoekpunt- en fragmentstatussen. Zie uitgave 379059434 .

De wgpu::VertexStepMode::VertexBufferNotUsed enum-waarde is verwijderd. Een hoekpuntbufferindeling die niet wordt gebruikt, kan nu worden uitgedrukt met {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} . Zie uitgave 383147017 .

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