Firma Google ogłosiła wprowadzenie domyślnej obsługi graficznego API WebGPU oraz języka shaderów WGSL (WebGPU Shading Language) w wersji Chrome 113, której wydanie planowane jest na 2 maja. WebGPU zapewnia interfejs programowania podobny do Vulkan, Metal i Direct3D 12 do wykonywania operacji po stronie GPU, takich jak renderowanie i obliczenia, a także pozwala na korzystanie z języka shaderów do pisania programów działających na GPU. Wdrożenie WebGPU zostanie początkowo wprowadzone tylko w wersjach dla ChromeOS, macOS i Windows. Obsługa WebGPU dla Linux i Androida będzie aktywowana później.
Oprócz Chrome, eksperymentalna obsługa WebGPU jest testowana od kwietnia 2020 roku w Firefox i od listopada 2021 roku w Safari. Aby włączyć WebGPU w Firefoxie, należy ustawić flagi dom.webgpu.enabled i gfx.webgpu.force-enabled w about:config. Na razie nie ma informacji o planach włączenia WebGPU domyślnie w Firefoxie i Safari. Rozwijane dla Firefox i Chrome wdrożenia WebGPU są dostępne w formie osobnych bibliotek — Dawn (C++) i wgpu (Rust), które można wykorzystać do integracji obsługi WebGPU w swoje aplikacje. Trwają także prace nad dodaniem obsługi WebGPU do popularnych bibliotek JavaScript, które początkowo korzystają z WebGL. Na przykład pełna obsługa WebGPU została już ogłoszona w Babylon.js, a częściowa w Three.js, PlayCanvas i TensorFlow.js.
Koncepcyjnie WebGPU różni się od WebGL w podobny sposób, jak graficzne API Vulkan różni się od OpenGL, ale WebGPU nie opiera się na konkretnym API graficznym; stanowi uniwersalną warstwę, która wykorzystuje te same niskopoziomowe prymitywy, które występują w Vulkan, Metal i Direct3D. WebGPU zapewnia aplikacjom w JavaScript niskopoziomową kontrolę nad organizacją, przetwarzaniem i przesyłaniem komend do GPU, zarządzaniem powiązanymi zasobami, pamięcią, buforami, obiektami tekstur i skompilowanymi shaderami graficznymi. Takie podejście umożliwia osiągnięcie wyższej wydajności aplikacji graficznych poprzez zmniejszenie overheadu i zwiększenie efektywności pracy z GPU.
WebGPU umożliwia tworzenie skomplikowanych projektów 3D w sieci, które działają równie dobrze, jak dedykowane aplikacje korzystające z Vulkan, Metal lub Direct3D, ale nie są ograniczone do konkretnych platform. WebGPU oferuje także dodatkowe możliwości przy portowaniu natywnych programów graficznych do formy, która może działać w oparciu o technologie webowe, dzięki kompilacji do WebAssembly. Oprócz grafiki 3D, WebGPU obejmuje również możliwości związane z przenoszeniem obliczeń na GPU i wykonywaniem shaderów.
Kluczowe cechy WebGPU:
- Oddzielne zarządzanie zasobami, pracami przygotowawczymi i wysyłaniem poleceń do GPU (w WebGL jeden obiekt odpowiadał za wszystko). Udostępniane są trzy odrębne konteksty: GPUDevice do tworzenia zasobów, takich jak tekstury i bufory; GPUCommandEncoder do kodowania pojedynczych poleceń, w tym etapów renderowania i obliczeń; GPUCommandBuffer do umieszczania w kolejce do wykonania w GPU. Wynik może być rysowany w obszarze związanym z jednym lub wieloma elementami canvas, lub przetwarzany bez wyjścia (na przykład podczas uruchamiania zadań obliczeniowych). Podział etapów ułatwia rozdzielanie tworzenia zasobów i operacji przygotowawczych na różne obsługiwacze, które mogą działać w różnych wątkach.
- Inne podejście do przetwarzania stanów. W WebGPU oferowane są dwa obiekty — GPURenderPipeline i GPUComputePipeline, które pozwalają na łączenie różnych stanów wcześniej zdefiniowanych przez programistę, co pozwala przeglądarce zaoszczędzić zasoby na dodatkowej pracy, takiej jak rekonstrukcja shaderów. Wśród wspieranych stanów znajdują się: shadery, układy buforów wierzchołków i atrybutów, układy załączonych grup, mieszanie, głębokość i szablony, formaty wyjściowe po renderowaniu.
- Model powiązania, w dużej mierze przypominająca obecne w Vulkan narzędzia grupowania zasobów. Do grupowania zasobów w WebGPU udostępniany jest obiekt GPUBindGroup, który podczas zapisywania komend można powiązać z innymi podobnymi obiektami do użycia w shaderach. Tworzenie takich grup daje możliwość sterownikowi wcześniejszego wykonania niezbędnych przygotowań, a przeglądarkom umożliwia znacznie szybszą zmianę powiązań zasobów między wywołaniami renderowania. Układ powiązań zasobów można określić z wyprzedzeniem za pomocą obiektu GPUBindGroupLayout.
Źródło: opennet.ru
