Консорциум 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 позволява създаването на сложни 3D проекти за Web, които работят не по-лошо от отделни програми, които директно комуникират с Vulkan, Metal или Direct3D, но не са свързани с конкретни платформи. WebGPU предлага също така допълнителни възможности при портированието на нативни графични програми в форма, способна да работи на база уеб технологии, благодарение на компилацията в WebAssembly. Освен 3D графика, WebGPU обхваща и възможности, свързани с изнасянето на изчисления на страната на GPU и изпълнението на шейдъри.
Ключови характеристики на WebGPU:
- Разделно управление на ресурсите, подготвителните работи и прехвърлянето на команди в GPU (в WebGL един обект отговаряше за всичко наведнъж). Предоставят се три отделни контекста: GPUDevice за създаване на ресурси, като текстури и буфери; GPUCommandEncoder за енкодиране на отделни команди, включително етапи на рендеринг и изчисления; GPUCommandBuffer за прехвърляне в опашката за изпълнение в GPU. Резултатът може да бъде визуализиран в област, свързана с един или повече елементи canvas, или обработен без визуализация (например, при изпълнение на изчислителни задачи). Разделянето на етапите опростява разпределянето на създаването на ресурси и подготвителните операции в различни обработвачи, които могат да се изпълняват в различни нишки.
- Алтернативен подход при обработка на състояния. В WebGPU се предлагат два обекта — GPURenderPipeline и GPUComputePipeline, които позволяват комбинирането на различни състояния, предварително определени от разработчика, което дава възможност на браузъра да не губи ресурси за допълнителна работа, като прекапмилиране на шейдери. Сред поддържаните състояния: шейдери, подреждане на вершинни буфери и атрибути, подреждане на прикрепени групи, смесване, дълбочина и шаблони, формати на извеждане след рендеринг.
- Модел на свързване, който до голяма степен напомня наличните в Vulkan средства за групиране на ресурси. За обединяване на ресурси в групи в WebGPU се предоставя обект GPUBindGroup, който по време на запис на команди може да бъде свързан с други подобни обекти за използване в шейдерите. Създаването на подобни групи позволява на драйвера предварително да извърши необходимите подготвителни действия, а на браузъра значително да ускори смяната на привързванията на ресурсите между повикванията за рендеринг. Подреждането на привързванията на ресурсите може да бъде определено предварително с помощта на обекта GPUBindGroupLayout.
Източник: opennet.ru
