Консорциум W3C представил первые черновые варианты спецификаций WebGPU и WebGPU Shading Language (WGSL), определяющих API для выполнения операций на GPU, таких как рендеринг и вычисления, а также язык шейдров для написания программ, работающих на стороне GPU. концептуально схожий с API Vulkan, Metal и Direct3D 12. Спецификации подготовлены рабочей группой, в которую вошли инженеры из Mozilla, Google, Apple и Microsoft.
Концептуально WebGPU отличается от WebGL примерно так же, как графический API Vulkan отличается от OpenGL, но при этом не основывается на конкретном графическом API, а представляет собой универсальную прослойку, использующую те же низкоуровневые примитивы, что имеются в Vulkan, Metal и Direct3D. WebGPU предоставляет приложениям на JavaScript средства для низкоуровневого контроля за организацией, обработкой и передачей команд к GPU, управления связанными ресурсами, памятью, буферами, объектами текстур и скомпилированными графическими шейдерами. Подобный подход позволяет добиться более высокой производительности графических приложений за счёт снижения накладных расходов и повышения эффективности работы с GPU.
WebGPU даёт возможность создавать для Web сложные 3D-проекты, работающие не хуже, чем обособленные программы, напрямую обращающиеся с Vulkan, Metal или Direct3D, но не привязанные к конкретным платформам. WebGPU также предоставляет дополнительные возможности при портировании нативных графических программ в форму, способную работать на базе web-технологий, благодаря компиляции в WebAssembly. Кроме 3D-графики WebGPU охватывает и возможности, связанные с выносом вычислений на сторону GPU и выполнением шейдеров.
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
