В сборките на Firefox поддръжка на спецификацията , предоставящ интерфейс за работа с 3D графика и изчисления на GPU, концептуално подобен на API , и . Спецификацията се развива от Mozilla, Google, Apple, Microsoft и представители на общността в , създадена при организацията W3C.
Ключовата задача на WebGPU е да създаде сигурен, удобен, преносим и високопроизводителен интерфейс за работа с технологии и възможности за 3D графика на уеб платформата, използващи съвременни системни графични API, като Direct3D 12 за Windows, Metal за macOS и Vulkan за Linux. Концепционно, WebGPU се различава от WebGL по същия начин, по който Vulkan се различава от OpenGL и не се базира на конкретен графичен API, а представлява универсален слой, който общо взето използва същите нискоуровневи примитиви, каквито са налични в Vulkan, Metal и Direct3D.
WebGPU предоставя на приложенията на JavaScript средства за по-нискостепенен контрол върху организацията, обработката и предаването на команди към GPU, управление на свързаните ресурси, памет, буфери, текстурни обекти и компилирани графични шейдъри. Такъв подход позволява да се постигне по-висока производителност на графичните приложения, чрез намаляване на разходите и повишаване на ефективността при работа с GPU.
WebGPU дава възможност за създаване на сложни 3D проекти за уеб, които функционират не по-лошо от самостоятелни програми, които директно взаимодействат с Vulkan, Metal или Direct3D, но не са свързани с конкретни платформи. WebGPU също така предоставя допълнителни възможности при пренасянето на нативни графични програми в форма, способна да работи на базата на уеб технологии, благодарение на използването на WebAssembly. Освен 3D графика, WebGPU обхваща и възможностите, свързани с прехвърляне на изчисления на GPU и поддръжка на разработка на шейдъри. Шейдърите могат да бъдат създавани на езика WebGPU Shading Language или зададени в междинен формат SPIR-V, след което да се трансформират в езици за шейдъри, поддържани от актуалните драйвъри.
В WebGPU се прилага разделно управление на ресурсите, подготвителните работи и предаването на команди към GPU (в WebGL един обект отговаряше за всичко наведнъж). Предоставят се три отделни контекста:
GPUDevice за създаване на ресурси, като текстури и буфери; GPUCommandEncoder за кодиране на отделни команди, включително етапи на рендеринг и изчисления; GPUCommandBuffer за опашка за изпълнение на GPU. Резултатът може да бъде визуализиран в област, свързана с един или повече елементи canvas, или обработен без показ (например, при стартиране на изчислителни задачи). Разделението на етапите улеснява разпределението на създаването на ресурси и подготвителните операции в различни обработващи единици, които могат да се изпълняват в различни нишки.
Второто отличие на WebGPU от WebGL е различния подход към обработката на състояния. В WebGPU се предлагат два обекта — GPURenderPipeline и GPUComputePipeline, които позволяват комбинирането на различни състояния, предварително зададени от разработчика, което дава възможност на браузъра да не харчи ресурси за допълнителна работа, като прекомпилация на шейдърите. Сред поддържаните състояния са: шейдъри, подредби на вершинни буфери и атрибути, подредби на прикрепени групи, смесване, дълбочина и шаблони, формати на изхода след рендеринг.
Третата особеност на WebGPU се нарича модел на свързване, който в значителна степен
напомня на средствата за групиране на ресурси, налични в Vulkan.
За обединяване на ресурси в групи в WebGPU се предоставя обект GPUBindGroup, който по време на запис на команди може да бъде свързан с други подобни обекти за използване в шейдъри. Създаването на такива групи позволява на драйвера предварително да извърши необходимите подготвителни действия, а на браузъра да опростява значително смяната на привързванията на ресурси между извикванията за рендеринг. Подредбата на привързванията на ресурсите може да бъде определена предварително с помощта на обекта GPUBindGroupLayout.

В Firefox за активиране на WebGPU в about:config съществува настройка “dom.webgpu.enabled”. За рендеринг на CanvasContext също е необходимо да се включи системата за композиране (“gfx.webrender.all” в about:config), написана на Rust и извеждаща на GPU операциите по рендеринг на съдържанието на страницата. Реализацията на WebGPU се основава на кода на проекта
, написан на Rust и способен да работи върху API DX12, Vulkan и Metal в Linux, Android, Windows и macOS (в разработка е и поддръжката на DX11 и OpenGL ES 3.0). Паралелно с това компанията Google развива друга реализация, която е достъпна в Chromium се активира с флага «chrome://flags/#enable-unsafe-webgpu», но засега работи само в macOS и Windows.
Източник: opennet.ru
