Google har annonsert at støtte for grafikk-API-en WebGPU og shader-språket WGSL (WebGPU Shading Language) vil bli aktivert som standard i Chrome 113, som er planlagt for lansering den 2. mai. WebGPU gir et programmeringsgrensesnitt likt Vulkan, Metal og Direct3D 12 for å utføre operasjoner på GPU-siden, som rendering og beregninger, samt gjøre det mulig å bruke et shader-språk for å skrive programmer som kjører på GPU. Implementeringen av WebGPU vil først bli inkludert i bygg for ChromeOS, macOS og Windows. For Linux og Android vil støtte for WebGPU bli aktivert senere.
I tillegg til Chrome har eksperimentell støtte for WebGPU vært testet siden april 2020 i Firefox og siden november 2021 i Safari. For å aktivere WebGPU i Firefox må du gå til about:config og sette flaggene dom.webgpu.enabled og gfx.webgpu.force-enabled. Det er ennå ikke meldt om planer for å aktivere WebGPU som standard i Firefox og Safari. Implementeringene av WebGPU for Firefox og Chrome er tilgjengelige i form av separate biblioteker — Dawn (C++) og wgpu (Rust), som kan brukes for å integrere støtte for WebGPU i applikasjonene dine. Det jobbes også med å legge til støtte for WebGPU i populære JavaScript-biblioteker som opprinnelig bruker WebGL. For eksempel er full støtte for WebGPU allerede bekreftet i Babylon.js, mens delvis støtte er tilgjengelig i Three.js, PlayCanvas og TensorFlow.js.
Konseptuelt skiller WebGPU seg fra WebGL omtrent på samme måte som grafikk-API-en Vulkan skiller seg fra OpenGL, men WebGPU er ikke basert på et spesifikt grafikk-API; det er et universelt lag som bruker de samme lavnivås primitive som finnes i Vulkan, Metal og Direct3D. WebGPU gir JavaScript-applikasjoner verktøy for lavnivåkontroll av organisering, behandling og overføring av kommandoer til GPU, administrering av tilknyttede ressurser, minne, buffere, teksturobjekter og kompilert grafikk-shadere. Denne tilnærmingen gjør det mulig å oppnå høyere ytelse i grafiske applikasjoner ved å redusere overhead og øke effektiviteten i arbeidet med GPU.
WebGPU gir mulighet til å lage komplekse 3D-prosjekter for nettet som fungerer like bra som fristående programmer som bruker Vulkan, Metal eller Direct3D, men som ikke er knyttet til spesifikke plattformer. WebGPU gir også ekstra muligheter for å portere native grafiske programmer til en form som kan kjøre på nettet, takket være kompilering til WebAssembly. I tillegg til 3D-grafikk dekker WebGPU også muligheter for å utføre beregninger på GPU-siden og kjøre shaders.
Nøkkelfunksjoner i WebGPU:
- Separert kontroll over ressurser, forberedende arbeid og overføring av kommandoer til GPU (i WebGL var ett objekt ansvarlig for alt). Tre separate kontekster tilbys: GPUDevice for å opprette ressurser som teksturer og buffere; GPUCommandEncoder for å kode individuelle kommandoer, inkludert rendering og beregningsfaser; GPUCommandBuffer for å sende til kø for utførelse på GPU. Resultatet kan gjengis i et område knyttet til ett eller flere canvas-elementer, eller prosesseres uten utdata (for eksempel ved kjøring av beregningsoppgaver). Separasjonen av stadier forenkler oppdelingen av ressursopprettelse og forberedende operasjoner i forskjellige prosessorer som kan kjøre i forskjellige tråder.
- Annen tilnærming til behandling av tilstander. I WebGPU tilbys to objekter — GPURenderPipeline og GPUComputePipeline, som lar utvikleren kombinere forskjellige stater som er forhåndsdefinert, noe som gjør at nettleseren ikke trenger å bruke ressurser på ekstra arbeid som shader-rekompilering. Blant de støttede tilstandene er: shaders, oppsett av vertex-buffere og attributter, oppsett av tilknyttede grupper, blanding, dybde og maler, samt utdataformater etter rendering.
- Modellen for binding, som i stor grad ligner de tilgjengelige ressursgrupperingsverktøyene i Vulkan. For å sammenføre ressurser i grupper, tilbyr WebGPU et GPUBindGroup-objekt, som i løpet av kommandoskriving kan knyttes til andre lignende objekter for bruk i shaderne. Opprettelsen av slike grupper gir driveren mulighet til å utføre nødvendige forberedende tiltak på forhånd, og gjør det mulig for nettleseren å bytte ressurser mellom gjengivelseskall betydelig raskere. Ressursbindingene kan defineres på forhånd ved hjelp av GPUBindGroupLayout-objektet.
Kilde: opennet.ru
