Дата публикации:Wed, 16 Jul 2025 18:19:15 +0300
Компания 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.
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=63592