Mozilla har besluttet at aktivere understøttelse af WebGPU API og WGSL (WebGPU Shading Language) i Firefox. Til platformen Windows WebGPU-understøttelse vil som standard være aktiveret i Firefox 141, planlagt til den 22. juli. WebGPU-understøttelse er derefter planlagt til at være aktiveret i builds i de følgende måneder: Linux и macOS, og efter et stykke tid i versionen til platformen AndroidFor manuelt at aktivere WebGPU kan du bruge parametrene "dom.webgpu.enabled" og "gfx.webrender.all" på about:config-siden.
I Chrome blev WebGPU-understøttelse tilbudt som standard i version 113, der blev udgivet i maj 2023. I Safari er det planlagt, at WebGPU-understøttelse aktiveres som standard i efteråret (eksperimentel understøttelse har været tilgængelig siden november 2021). I Firefox har eksperimentel WebGPU-understøttelse været til stede siden 2020, men den var kun aktiveret som standard i natlige builds af Firefox. Firefox' WebGPU-implementering er baseret på WGPU-projektkoden, skrevet i Rust og i stand til at køre oven på Direct3D 12, Vulkan, OpenGL og Metal graphics API'er.
WebGPU leverer en lignende API som Vulkan, Metal og Direct3D 12 til udførelse af operationer på GPU-siden. Ud over 3D-grafik dækker WebGPU også funktioner relateret til at overføre beregninger til GPU-siden og udføre shaders. Konceptuelt adskiller WebGPU sig fra den gamle WebGL-specifikation på stort set samme måde, som Vulkans grafik-API adskiller sig fra OpenGL. Samtidig er WebGPU ikke baseret på en specifik grafik-API, men er et universelt lag, der bruger de samme lavniveau-primitiver, der er tilgængelige i Vulkan, Metal og Direct3D.
WebGPU gør det muligt for JavaScript-applikationer at kontrollere organisering, behandling og transmission af kommandoer til GPU'en og administrere tilhørende ressourcer, hukommelse, buffere, teksturobjekter og kompilerede grafikshadere. Denne tilgang muliggør højere ydeevne for grafikapplikationer ved at reducere overhead og øge effektiviteten af at arbejde med GPU'en.
Med WebGPU kan du oprette platformuafhængige, komplekse 3D-projekter, der fungerer lige så godt som selvstændige programmer, der direkte bruger Vulkan, Metal eller Direct3D. WebGPU giver også yderligere muligheder for at portere native grafikprogrammer til en formular, der kan køre i browsere, takket være kompilering til WebAssembly.
Nøglefunktioner i WebGPU og forskelle fra WebGL:
- Separat styring af ressourcer, forberedende arbejde og overførsel af kommandoer til GPU'en (i WebGL var ét objekt ansvarlig for alt på én gang). Tre separate kontekster tilbydes: GPUDevice til oprettelse af ressourcer såsom teksturer og buffere; GPUCommandEncoder til kodning af individuelle kommandoer, herunder rendering og beregningstrin; GPUCommandBuffer, der skal sendes til GPU-udførelseskøen. Resultatet kan tegnes i et område, der er tilknyttet et eller flere lærredselementer, eller behandles uden output (for eksempel når der køres beregningsopgaver). Adskillelse af stadierne gør det nemmere at adskille ressourceoprettelses- og forberedelsesoperationer i forskellige handlere, der kan udføres i forskellige tråde.
- En anderledes tilgang til håndtering af stater. WebGPU tilbyder to objekter, GPURenderPipeline og GPUComputePipeline, der tillader at kombinere forskellige tilstande, der er foruddefineret af udvikleren, hvilket gør det muligt for browseren at undgå at spilde ressourcer på ekstra arbejde såsom at rekompilere shaders. Understøttede tilstande omfatter: shaders, vertexbuffer og attributlayouts, tilknyttede gruppelayouts, blanding, dybde og mønstre samt gengivne outputformater.
- En bindingsmodel, der minder meget om de ressourcegrupperingsfunktioner, der findes i Vulkan. For at gruppere ressourcer sammen leverer WebGPU et GPUBindGroup-objekt, der kan linkes til andre sådanne objekter under kommandoskrivning til brug i shaders. Oprettelse af sådanne grupper giver driveren mulighed for at udføre de nødvendige forberedende handlinger på forhånd, og giver browseren mulighed for at ændre ressourcebindinger meget hurtigere mellem draw-kald. Layoutet af ressourcebindinger kan defineres på forhånd ved hjælp af GPUBindGroupLayout-objektet.
Kilde: opennet.ru
