В ночные сборки Firefox добавлена поддержка WebGPU
24 апреля 2020 года
В ночных сборках Firefox появилась поддержка спецификации WebGPU, предоставляющей программный интерфейс для обработки 3D-графики и вычислений на стороне GPU, концептуально схожий с API Vulkan, Metal и Direct3D 12. Спецификация развивается Mozilla, Google, Apple, Microsoft и представителями сообщества в рабочей группе, созданной при организации W3C.
Ключевой задачей 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 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 также требуется включение системы композитинга WebRender ("gfx.webrender.all" в about:config), написанной на языке Rust и выносящей на сторону GPU операции отрисовки содержимого страницы. Реализация WebGPU основана на коде проекта wgpu, написанного на языке Rust и способного работать поверх API DX12, Vulkan и Metal в Linux, Android, Windows и macOS (в разработке также находится поддержка DX11 и OpenGL ES 3.0). Параллельно компанией Google развивается другая реализация, которая доступна в Canary-ветке Chromium и включается при помощи флага "chrome://flags/#enable-unsafe-webgpu", но работает пока только в macOS и Windows.
Источники
править
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.