В Firefox и Safari будет включена поддержка WebGPU

Компания 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, таких как рендеринг и вычисления, а также позволяет использовать язык шейдров для написания программ, работающих на стороне GPU. Концептуально WebGPU отличается от старой спецификации WebGL примерно так же, как графический API Vulkan отличается от OpenGL. При этом WebGPU не основывается на конкретном графическом API, а представляет собой универсальную прослойку, использующую те же низкоуровневые примитивы, что имеются в Vulkan, Metal и Direct3D.

WebGPU даёт возможность приложениям на языке JavaScript контролировать организацию, обработку и передачу команд к GPU, управлять связанными ресурсами, памятью, буферами, объектами текстур и скомпилированными графическими шейдерами. Подобный подход позволяет добиться более высокой производительности графических приложений за счёт снижения накладных расходов и повышения эффективности работы с GPU.

При помощи WebGPU можно создавать не привязанные к конкретным платформам сложные 3D-проекты, работающие не хуже, чем обособленные программы, напрямую использующие Vulkan, Metal или Direct3D. WebGPU также предоставляет дополнительные возможности для портирования нативных графических программ в форму, способную работать в браузерах, благодаря компиляции в WebAssembly. Кроме 3D-графики WebGPU охватывает и возможности, связанные с выносом вычислений на сторону GPU и выполнением шейдеров.

Ключевые особенности WebGPU:

  • Раздельное управление ресурсами, подготовительными работами и передачей команд в GPU (в WebGL один объект отвечал за всё разом). Предоставляется три отдельных контекста: GPUDevice для создания ресурсов, таких как текстуры и буферы; GPUCommandEncoder для кодирования отдельных команд, включая стадии рендеринга и вычисления; GPUCommandBuffer для передачи в очередь на выполнение в GPU. Результат может быть отрисован в области, связанной с одним или несколькими элементами canvas, или обработан без вывода (например, при запуске вычислительных задач). Разделение стадий упрощает разнесение создания ресурсов и подготовительные операции в разные обработчики, которые могут выполняться в разных потоках.
  • Иной подход при обработке состояний. В WebGPU предлагается два объекта – GPURenderPipeline и GPUComputePipeline, позволяющих комбинировать различные состояния, заранее определённые разработчиком, что даёт возможность браузеру не тратить ресурсы на проведение дополнительной работы, такой как перекомпиляция шейдеров. Среди поддерживаемых состояний: шейдеры, раскладки вершинных буферов и атрибутов, раскладки прикреплённых групп, смешивание, глубина и шаблоны, форматы вывода после рендеринга.
  • Модель связывания, во многом
    напоминающая присутствующие в Vulkan средства группировки ресурсов.
    Для объединения ресурсов в группы в WebGPU предоставляется объект GPUBindGroup, который во время записи команд можно связать с другими такими же объектами для использования в шейдерах. Создание подобных групп даёт возможность драйверу заранее выполнить необходимые подготовительные действия, а браузеру позволяет значительно быстрее менять привязки ресурсов между вызовами отрисовки. Раскладка привязок ресурсов может быть определена заранее при помощи объекта GPUBindGroupLayout.

Release. Ссылка here.