В 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. Кроме 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.

Источник: http://www.opennet.ru/opennews/art.shtml?num=63592