Nieuw in WebGPU (Chrome 133)

François Beaufort
François Beaufort

Gepubliceerd: 29 januari 2025

Aanvullende unorm8x4-bgra- en 1-component vertex-indelingen

De "unorm8x4-bgra"-knooppuntindeling en de volgende knooppuntindelingen met 1 component zijn toegevoegd: "uint8", "sint8", "unorm8", "snorm8", "uint16", "sint16", "unorm16", "snorm16" en "float16". Door de "unorm8x4-bgra"-vertexindeling is het iets handiger om BGRA-gecodeerde vertexkleuren te laden terwijl dezelfde shader behouden blijft. Met de vertexindeling met 1 component kun je ook alleen de gegevens aanvragen die nodig zijn, terwijl er eerder minstens 2 keer zoveel nodig was voor 8- en 16-bits gegevenstypen. Ga naar het chromestatus-item en issue 376924407.

Toestaan dat onbekende limieten worden aangevraagd met een niet-gedefinieerde waarde

Je kunt nu onbekende limieten aanvragen met de waarde undefined als je een GPU-apparaat aanvraagt. Zo wordt de WebGPU API minder kwetsbaar naarmate deze zich verder ontwikkelt. Dit is bijvoorbeeld handig in de volgende app-code, waarbij adapter.limits.someLimit undefined kan zijn als someLimit niet meer bestaat. Ga naar specificatie-PR 4781.

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

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

Wijzigingen in uitlijningsregels voor WGSL

Het is niet meer mogelijk om een te kleine uitlijningswaarde op te geven voor een structuurmember, omdat nu vereist is dat @align(n) RequiredAlignOf deelt voor alle structuren. Deze ingrijpende wijziging vereenvoudigt het gebruik van de WGSL-taal en maakt deze compatibeler met Firefox en Safari. Je vindt voorbeeldcode met verschillen tussen de compilers Tint, Naga en WebKit in de spec PR.

WGSL-prestatieverbeteringen met discard

Vanwege een aanzienlijke prestatiedaling die is waargenomen bij het renderen van een complex SSR-effect (screen-space reflections), gebruikt de implementatie van de discard-instructie de door het platform geleverde semantiek om te degraderen naar een helperaanroep als deze beschikbaar is. Dit verbetert de prestaties van shaders die discard gebruiken. Ga naar issue 372714384.

Gebruik VideoFrame.displaySize voor externe texturen

De dimensies displayWidth en displayHeight moeten worden gebruikt als de schijnbare grootte van de GPUExternalTexture als je een VideoFrame importeert volgens de WebGPU-specificatie. De zichtbare grootte is echter onjuist gebruikt, waardoor er problemen zijn ontstaan als je textureLoad() probeert te gebruiken voor een GPUExternalTexture. Dit is nu opgelost. Ga naar probleem 377574981.

Afbeeldingen met niet-standaard oriëntaties verwerken met copyExternalImageToTexture

De copyExternalImageToTexture() GPUQueue-methode wordt gebruikt om de inhoud van een afbeelding of canvas naar een textuur te kopiëren. De app verwerkt nu afbeeldingen met niet-standaard oriëntaties correct. Dit was eerder niet het geval als de bron een ImageBitmap was met imageOrientation "from-image" of een afbeelding met een niet-standaard oriëntatie. Ga naar probleem 384858956.

De ontwikkelaarservaring verbeteren

Het kan verrassend zijn als adapter.limits hoge waarden toont, maar je niet weet dat je expliciet een hogere limiet moet aanvragen als je een GPU-apparaat aanvraagt. Als je dit niet doet, kun je later onverwacht limieten bereiken.

De foutmeldingen zijn uitgebreid met hints die je vertellen dat je expliciet een hogere limiet moet aanvragen als er geen limiet is ingevoerd in requiredLimits bij het aanroepen van requestDevice(). Ga naar probleem 42240683.

Het volgende voorbeeld toont een verbeterde foutmelding die in de DevTools-console wordt geregistreerd als u een GPU-buffer maakt met een grootte die de standaardlimiet voor de maximale buffergrootte van het apparaat overschrijdt.

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

Compatibiliteitsmodus aanzetten met featureLevel

Je kunt nu een GPU-adapter aanvragen in de experimentele compatibiliteitsmodus door de gestandaardiseerde optie featureLevel in te stellen op "compatibility". De tekenreeksen "core" (standaard) en "compatibility" zijn de enige toegestane waarden. Raadpleeg het volgende voorbeeld en spec 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 optie featureLevel vervangt de niet-gestandaardiseerde optie compatibilityMode en het niet-gestandaardiseerde kenmerk featureLevel vervangt het kenmerk isCompatibilityMode.

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

Opschoning van experimentele subgroepfuncties

De beëindigde experimentele subgroepfuncties "chromium-experimental-subgroups" en "chromium-experimental-subgroup-uniform-control-flow" zijn verwijderd. Ga naar probleem 377868468.

De "subgroups"experimentele functie is nu alles wat u nodig heeft als u experimenteert met subgroepen. De "subgroups-f16" experimentele functie is beëindigd en wordt binnenkort verwijderd. Je kunt f16-waarden met subgroepen gebruiken als je app zowel "shader-f16"- als "subgroups"-functies aanvraagt. Ga naar probleem 380244620.

De limiet maxInterStageShaderComponents beëindigen

De limiet van maxInterStageShaderComponents is beëindigd vanwege een combinatie van factoren:

  • Redundantie met maxInterStageShaderVariables: Deze limiet dient al een vergelijkbaar doel, namelijk de hoeveelheid gegevens beheren die tussen shaderfasen wordt doorgegeven.
  • Kleine verschillen: Er zijn kleine verschillen in de manier waarop de 2 limieten worden berekend, maar deze verschillen zijn klein en kunnen effectief worden beheerd binnen de limiet van maxInterStageShaderVariables.
  • Vereenvoudiging: Door maxInterStageShaderComponents te verwijderen, wordt de shaderinterface gestroomlijnd en wordt de complexiteit voor ontwikkelaars verminderd. In plaats van 2 afzonderlijke limieten met subtiele verschillen te beheren, kunnen ze zich richten op de beter benoemde en uitgebreidere maxInterStageShaderVariables.

Het is de bedoeling om de functie volledig te verwijderen in Chrome 135. Ga naar Intentie om te beëindigen en probleem 364338810.

Updates voor Dawn

Met de wgpu::Device::GetAdapterInfo(adapterInfo) kun je adapterinformatie rechtstreeks van een wgpu::Device krijgen. Ga naar probleem 376600838.

De structuur WGPUProgrammableStageDescriptor is hernoemd naar WGPUComputeState om de berekeningsstatus consistent te maken met de hoekpunt- en fragmentstatussen. Ga naar probleem 379059434.

De enum-waarde wgpu::VertexStepMode::VertexBufferNotUsed is verwijderd. Een indeling van een hoekpuntbuffer die niet wordt gebruikt, kan nu worden aangegeven met {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0}. Ga naar probleem 383147017.

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