În versiuni Firefox suport pentru specificație , oferind o interfață de programare pentru procesarea graficii 3D și calcule pe GPU, similar conceptual cu API-ul , și . Specificația este dezvoltată de Mozilla, Google, Apple, Microsoft și reprezentanți ai comunității în , créé au sein du W3C.
Obiectivul principal al WebGPU este de a crea o interfață de programare sigură, convenabilă, portabilă și performantă pentru utilizarea pe platforma web a tehnologiilor și capacităților graficii 3D, furnizate de API-urile grafice de sistem moderne, cum ar fi Direct3D 12 pe Windows, Metal pe macOS și Vulkan pe Linux. Conceptual, WebGPU se diferențiază de WebGL cam la fel cum Vulkan se diferențiază de OpenGL și nu se bazează pe un API grafic specific, ci reprezintă un strat universal, folosind în general aceleași primitive de nivel scăzut, disponibile în Vulkan, Metal și Direct3D.
WebGPU oferă aplicațiilor JavaScript instrumente pentru un control mai detaliat asupra organizării, procesării și transmiterii comenzilor către GPU, gestionării resurselor asociate, memoriei, bufferelor, obiectelor textură și shaderelor grafice compilate. O astfel de abordare permite obținerea unei performanțe superioare a aplicațiilor grafice prin reducerea suprasarcinii și îmbunătățirea eficienței lucrului cu GPU.
WebGPU permite crearea de proiecte complexe 3D pentru web, care funcționează la fel de bine ca programele separate care interacționează direct cu Vulkan, Metal sau Direct3D, dar nu sunt legate de platforme specifice. WebGPU oferă, de asemenea, oportunități suplimentare în portarea programelor grafice native într-o formă capabilă să funcționeze pe baza tehnologiilor web, datorită utilizării tehnologiei WebAssembly. Pe lângă grafică 3D, WebGPU acoperă și capacitățile legate de externalizarea calculului pe GPU și suportul pentru dezvoltarea shaderelor. Shaderele pot fi create în limbajul WebGPU Shading Language sau definite într-un format intermediar SPIR-V, după care sunt transpuse în limbaje de shadere acceptate de driverele actuale.
În WebGPU, administrarea resurselor, lucrările preliminare și transmiterea comenzilor către GPU sunt gestionate separat (în WebGL, un singur obiect era responsabil de toate simultan). Se oferă trei contexte separate:
GPUDevice pentru crearea resurselor, cum ar fi texturi și buffere; GPUCommandEncoder pentru codificarea de comenzi individuale, inclusiv etapele de randare și calcul; GPUCommandBuffer pentru a fi plasat în coada de execuție pe GPU. Rezultatul poate fi randat într-o zonă asociată cu unul sau mai multe elemente canvas sau procesat fără a fi afișat (de exemplu, în timpul execuției sarcinilor de calcul). Separarea etapelor facilitează distribuirea creării resurselor și a operațiunilor pregătitoare în diferiți manipulatoare, care pot fi executate pe fire diferite.
A doua diferență dintre WebGPU și WebGL este abordarea diferită în gestionarea stărilor. WebGPU oferă două obiecte — GPURenderPipeline și GPUComputePipeline, care permit combinarea diferitelor stări, predefinite de dezvoltator, ceea ce permite browserului să nu consume resurse inutile pentru acțiuni suplimentare, cum ar fi recompilarea shaderelor. Printre stările suportate se numără: shadere, dispozitii ale bufferelor de vârfuri și a atributelor, dispozitii ale grupurilor atașate, amestecare, adâncime și șabloane, formate de ieșire după randare.
A treia caracteristică a WebGPU este modelul de legare, care este în mare parte
similar cu instrumentele de grupare a resurselor prezente în Vulkan.
Pentru a grupa resursele în grupuri, WebGPU oferă obiectul GPUBindGroup, care în timpul scrierii comenzilor poate fi legat cu alte obiecte similare pentru utilizare în shadere. Crearea acestor grupuri permite driverului să finalizeze din timp acțiunile pregătitoare necesare, iar browserului să schimbe semnificativ mai repede legăturile de resurse între apelurile de randare. Dispoziția legăturilor de resurse poate fi definită din timp cu ajutorul obiectului GPUBindGroupLayout.

În Firefox, pentru a activa WebGPU, în about:config există setarea „dom.webgpu.enabled”. Pentru randarea CanvasContext este necesară activarea sistemului de compunere („gfx.webrender.all” în about:config), scris în limbajul Rust și care externalizează pe GPU operațiunile de randare a conținutului paginii. Implementarea WebGPU se bazează pe codul proiectului
, scris în limbajul Rust și capabil să funcționeze deasupra API-urilor DX12, Vulkan și Metal în Linux, Android, Windows și macOS (în dezvoltare se află, de asemenea, suport pentru DX11 și OpenGL ES 3.0). În paralel, compania Google dezvoltă o altă implementare, care este disponibilă în Chromium se activează folosind flag-ul „chrome://flags/#enable-unsafe-webgpu”, dar funcționează deocamdată doar pe macOS și Windows.
Sursa: opennet.ro
