Компанія Mozilla вирішила активувати в Firefox підтримку API WebGPU та мови шейдерів WGSL (WebGPU Shading Language). Для платформи Windows Підтримка WebGPU буде включена за замовчуванням у випуску Firefox 141, наміченому на 22 липня. Потім протягом кількох місяців підтримку WebGPU планують активувати у збірках для Linux и macOS, а через деякий час і у версії для платформи Android. Для ручного увімкнення WebGPU можна використовувати параметри «dom.webgpu.enabled» та «gfx.webrender.all» на сторінці about:config.
У Chrome підтримка WebGPU була запропонована за умовчанням у версії 113, сформованій у травні 2023 року. У Safari підтримку WebGPU планують включити за умовчанням восени (експериментальна підтримка доступна з листопада 2021 року). У Firefox експериментальна підтримка WebGPU була присутня з 2020 року, але була включена за умовчанням лише у нічних збірках Firefox. Реалізація WebGPU в Firefox заснована на коді проекту WGPU, написаного мовою Rust і здатного працювати поверх графічних API Direct3D 12, Vulkan, OpenGL та Metal.
WebGPU надає схожий з Vulkan, Metal та Direct3D 12 програмний інтерфейс для виконання операцій на стороні GPU. Крім 3D-графіки WebGPU охоплює і можливості, пов'язані з винесенням обчислень на бік GPU та виконанням шейдерів. Концептуально WebGPU відрізняється від старої специфікації WebGL приблизно так, як графічний API Vulkan відрізняється від OpenGL. При цьому WebGPU не ґрунтується на конкретному графічному API, а є універсальним прошарком, що використовує ті ж низькорівневі примітиви, що є в Vulkan, Metal і Direct3D.
WebGPU дає можливість програмам на мові JavaScript контролювати організацію, обробку та передачу команд до GPU, керувати пов'язаними ресурсами, пам'яттю, буферами, об'єктами текстур та скомпільованими графічними шейдерами. Подібний підхід дозволяє досягти вищої продуктивності графічних додатків за рахунок зниження накладних витрат та підвищення ефективності роботи з GPU.
За допомогою WebGPU можна створювати складні 3D-проекти, що не прив'язані до конкретних платформ, що працюють не гірше, ніж відокремлені програми, що безпосередньо використовують Vulkan, Metal або Direct3D. WebGPU також надає додаткові можливості для портування нативних графічних програм у форму, здатну працювати в браузерах завдяки компіляції в WebAssembly.
Ключові особливості WebGPU та відмінності від WebGL:
- Роздільне управління ресурсами, підготовчими роботами та передачею команд у GPU (в WebGL один об'єкт відповідав за все разом). Надається три окремі контексти: GPUDevice для створення ресурсів, таких як текстури та буфери; GPUCommandEncoder для кодування окремих команд, включаючи стадії рендерингу та обчислення; GPUCommandBuffer для передачі в чергу на виконання в GPU. Результат може бути змальований в області, пов'язаної з одним або декількома елементами canvas, або оброблений без виводу (наприклад, при запуску обчислювальних завдань). Поділ стадій спрощує рознесення створення ресурсів та підготовчі операції у різні обробники, які можуть виконуватись у різних потоках.
- Інший підхід для обробки станів. WebGPU пропонує два об'єкти - GPURenderPipeline і GPUComputePipeline, що дозволяють комбінувати різні стани, заздалегідь визначені розробником, що дає можливість браузеру не витрачати ресурси на проведення додаткової роботи, такої як перекомпіляція шейдерів. Серед станів, що підтримуються: шейдери, розкладки вершинних буферів і атрибутів, розкладки прикріплених груп, змішування, глибина і шаблони, формати виведення після рендерингу.
- Модель зв'язування, багато в чому нагадує присутні у Vulkan засоби угруповання ресурсів. Для об'єднання ресурсів у групи WebGPU надається об'єкт GPUBindGroup, який під час запису команд можна пов'язати з іншими такими ж об'єктами для використання в шейдерах. Створення подібних груп дозволяє драйверу заздалегідь виконати необхідні підготовчі дії, а браузеру дозволяє значно швидше змінювати прив'язки ресурсів між викликами малювання. Розкладку прив'язок ресурсів можна визначити заздалегідь за допомогою об'єкта GPUBindGroupLayout.
Джерело: opennet.ru
