В
Ключовим завданням WebGPU є створення безпечного, зручного, переносного та високопродуктивного програмного інтерфейсу для використання у Web-платформі технологій та можливостей 3D-графіки, що надаються сучасними системними графічними API, такими як Direct3D 12 у Windows, Metal у macOS та Vulkan у Linux. Концептуально WebGPU відрізняється від WebGL приблизно так само, як Vulkan відрізняється від OpenGL, і при цьому не ґрунтується на конкретному графічному API, а являє собою універсальний прошарок, що у загальному вигляді використовує ті ж низькорівневі примітиви, що є в Vulkan, Metal і Direct3D.
WebGPU надає додаткам на JavaScript засоби для більш низькорівневого контролю за організацією, обробкою та передачею команд до GPU, управління пов'язаними ресурсами, пам'яттю, буферами, об'єктами текстур та скомпільованими графічними шейдерами. Подібний підхід дозволяє досягти вищої продуктивності графічних додатків за рахунок зниження накладних витрат та підвищення ефективності роботи з GPU.
WebGPU дає можливість створювати для Web повноцінні складні 3D-проекти, що працюють не гірше, ніж відокремлені програми, які безпосередньо звертаються з Vulkan, Metal або Direct3D, але не прив'язані до конкретних платформ. WebGPU також надає додаткові можливості портування нативних графічних програм у форму, здатну працювати на базі web-технологій, завдяки застосуванню технології WebAssembly. Крім 3D-графіки WebGPU охоплює й можливості, пов'язані з виносом обчислень на бік GPU та підтримкою розробки шейдерів. Шейдери
У 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 також потрібне включення системи композитингу
Джерело: opennet.ru