W kompilacjach Firefox wsparcie specyfikacji , oferującym interfejs programowania do przetwarzania grafiki 3D i obliczeń po stronie GPU, koncepcyjnie podobnym do API , i . Specyfikacja rozwija się przy współpracy Mozilla, Google, Apple, Microsoft i przedstawicielami społeczności w , powołanej przez organizację W3C.
Kluczowym zadaniem WebGPU jest stworzenie bezpiecznego, wygodnego, przenośnego i wydajnego interfejsu programowania do wykorzystania w technologii platformy Web i możliwości grafiki 3D, oferowanych przez nowoczesne systemowe API graficzne, takie jak Direct3D 12 w Windows, Metal w macOS oraz Vulkan w Linux. Koncepcyjnie WebGPU różni się od WebGL mniej więcej tak, jak Vulkan różni się od OpenGL, a przy tym nie opiera się na konkretnym API graficznym, lecz stanowi uniwersalną warstwę, używającą ogólnie tych samych niskopoziomowych prymitywów, które znajdują się w Vulkan, Metal i Direct3D.
WebGPU zapewnia aplikacjom JavaScript narzędzia do niskopoziomowego sterowania organizacją, przetwarzaniem i przekazywaniem poleceń do GPU, zarządzania zasobami, pamięcią, buforami, obiektami tekstur i skompilowanymi szeregami graficznymi. Tego rodzaju podejście pozwala osiągnąć wyższą wydajność aplikacji graficznych poprzez redukcję narzutów i zwiększenie efektywności pracy z GPU.
WebGPU umożliwia tworzenie dla Web pełnoprawnych, złożonych projektów 3D, działających nie gorzej niż odrębne programy, bezpośrednio komunikujące się z Vulkan, Metal lub Direct3D, ale niezwiązanych z konkretnymi platformami. WebGPU zapewnia również dodatkowe możliwości podczas portowania natywnych programów graficznych w formę, zdolną do działania na bazie technologii webowych, dzięki zastosowaniu technologii WebAssembly. Oprócz grafiki 3D, WebGPU obejmuje również możliwości związane z wykonywaniem obliczeń na stronie GPU oraz wsparciem dla rozwoju shaderów. Shadery mogą być tworzone w języku WebGPU Shading Language lub definiowane w pośrednim formacie SPIR-V, po czym są transliterowane do języków shaderów obsługiwanych przez obecne sterowniki.
W WebGPU zastosowano oddzielne zarządzanie zasobami, pracami przygotowawczymi i przekazywaniem poleceń do GPU (w WebGL jeden obiekt odpowiadał za wszystko naraz). Udostępniane są trzy oddzielne konteksty:
GPUDevice do tworzenia zasobów, takich jak tekstury i bufory; GPUCommandEncoder do kodowania poszczególnych poleceń, w tym etapów renderowania i obliczeń; GPUCommandBuffer do przesyłania do kolejki do wykonania na GPU. Wynik może być renderowany w obszarze związanym z jednym lub wieloma elementami canvas, lub przetwarzany bez wyjścia (na przykład przy uruchamianiu zadań obliczeniowych). Rozdzielenie etapów ułatwia przeniesienie tworzenia zasobów i operacji wstępnych do różnych obsługujących, które mogą być wykonywane w różnych wątkach.
Drugą różnicą między WebGPU a WebGL jest inny sposób przetwarzania stanów. WebGPU oferuje dwa obiekty — GPURenderPipeline i GPUComputePipeline, które pozwalają na łączenie różnych stanów, wcześniej zdefiniowanych przez programistę, co daje przeglądarkom możliwość oszczędzania zasobów na dodatkowe operacje, takie jak rekonstrukcja shaderów. Wśród obsługiwanych stanów znajdują się: shadery, układy buforów wierzchołków i atrybutów, układy grup przypiętych, mieszanie, głębokość oraz szablony, formaty wyjściowe po renderowaniu.
Trzecią cechą WebGPU jest model wiązania, który w dużej mierze
przypomina istniejące w Vulkan narzędzia grupowania zasobów.
Aby połączyć zasoby w grupy, WebGPU udostępnia obiekt GPUBindGroup, który podczas nagrywania poleceń można powiązać z innymi podobnymi obiektami do użycia w shaderach. Tworzenie takich grup pozwala sterownikowi na wcześniejsze wykonanie potrzebnych operacji przygotowawczych, a przeglądarkom znacznie szybciej zmieniać powiązania zasobów między wywołaniami renderującymi. Rozkład powiązań zasobów może być określony wcześniej za pomocą obiektu GPUBindGroupLayout.

W Firefoxie, aby włączyć WebGPU, w about:config dostępna jest opcja „dom.webgpu.enabled”. Do renderowania CanvasContext wymagana jest również aktywacja systemu kompozycji („gfx.webrender.all” w about:config), napisanego w języku Rust i delegującego na GPU operacje renderowania zawartości strony. Implementacja WebGPU oparta jest na kodzie projektu
, napisanego w języku Rust i zdolnego do działania na API DX12, Vulkan i Metal w systemie Linux, Android, Windows i macOS (w trakcie rozwoju jest również wsparcie dla DX11 i OpenGL ES 3.0). Równolegle firma Google rozwija inną implementację, która jest dostępna w Chromium i można go włączyć za pomocą flagi „chrome://flags/#enable-unsafe-webgpu”, ale obecnie działa tylko w macOS i Windows.
Źródło: opennet.ru
