W3C-konsortiet har lansert de første utkastene til spesifikasjonene for WebGPU og WebGPU Shading Language (WGSL), som definerer et API for å utføre operasjoner på GPU, slik som rendering og beregninger, samt et shaderspråk for å skrive programmer som kjører på GPU-siden. Dette er konseptuelt likt APIene Vulkan, Metal og Direct3D 12. Spesifikasjonene er utarbeidet av en arbeidsgruppe med ingeniører fra Mozilla, Google, Apple og Microsoft.
Konseptuelt skiller WebGPU seg fra WebGL omtrent på samme måte som grafikk-APIet Vulkan skiller seg fra OpenGL, men det er ikke basert på et spesifikt grafikk-API, men representerer et universelt lag som bruker de samme lavnivåprimitive som finnes i Vulkan, Metal og Direct3D. WebGPU gir JavaScript-applikasjoner midler for lavnivåkontroll over organisering, behandling og overføring av kommandoer til GPU, samt styring av tilknyttede ressurser, minne, buffere, teksturobjekter og kompilerte grafikkshaders. Denne tilnærmingen gjør det mulig å oppnå høyere ytelse for grafiske applikasjoner ved å redusere overhead og forbedre effektiviteten av GPU-arbeidet.
WebGPU gir mulighet for å lage komplekse 3D-prosjekter for web som fungerer like bra som separate programmer som direkte samhandler med Vulkan, Metal eller Direct3D, men som ikke er bundet til spesifikke plattformer. WebGPU tilbyr også ekstra muligheter når det gjelder portering av native grafikkprogrammer til en form som kan kjøre basert på webteknologier, takket være kompilering til WebAssembly. I tillegg til 3D-grafikk dekker WebGPU også muligheter knyttet til å utføre beregninger på GPU-siden og kjøring av 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
