Что нового в WebGPU (Chrome 126)

Франсуа Бофор
François Beaufort

Увеличить лимит maxTextureArrayLayers

Максимально допустимое значение глубины или количества слоёв 2D-текстуры по умолчанию составляет 256. Теперь можно запросить до 2048 с помощью ограничения maxTextureArrayLayers (если поддерживается). См. следующий пример и ошибку 42241514 .

const adapter = await navigator.gpu.requestAdapter();
if (adapter.limits.maxTextureArrayLayers < 30) {
  // When the desired limit isn't supported, take action to either fall back to
  // a code path that does not require the higher limit or notify the user that
  // their device does not meet minimum requirements.
}

// Request highest limit of max texture array layers attributes.
const device = await adapter.requestDevice({
  requiredLimits: { maxTextureArrayLayers: 2048 }
});

Оптимизация загрузки буфера для бэкэнда Vulkan

Теперь доступен быстрый способ вызова метода writeBuffer() бэкенда GPUQueue для Vulkan. Данные теперь можно записывать непосредственно в целевой буфер, устраняя необходимость в дополнительном копировании и синхронизации. Эта оптимизация сокращает трафик памяти, необходимый для загрузки данных в графический процессор.

Для оптимизации быстрого пути требуется, чтобы память буфера была видна хосту и не выполняла какие-либо ожидающие операции с графическим процессором. См. проблему 42242084 .

Улучшение времени компиляции шейдера

Команда Chrome повышает эффективность Tint , компилятора языка шейдеров WebGPU. В настоящее время Tint многократно модифицирует абстрактное синтаксическое дерево (AST) кода шейдера перед генерацией машинного кода, что на некоторых платформах требует больших ресурсов. Для оптимизации этого процесса вводится новое промежуточное представление (IR), а также перерабатываются бэкенды, использующие его. Это изменение направлено на ускорение компиляции шейдеров.

Создание конвейера рендеринга включает преобразование WGSL в SPIR-V с помощью компилятора Tint, а затем в ISA с помощью компилятора Driver.
Создание конвейера рендеринга в ChromeOS.

Эти улучшения, уже доступные на Android, постепенно распространяются на устройства ChromeOS с поддержкой WebGPU и бэкэнда Vulkan. См. проблему 42250751 .

Отправленные буферы команд должны быть уникальными.

Каждый буфер GPUCommandBuffer, отправляемый в GPUQueue методом submit() должен быть уникальным, в противном случае генерируется ошибка валидации. Это ошибка спецификации . См. проблему 42241492 .

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const commandEncoder = device.createCommandEncoder();
const commandBuffer = commandEncoder.finish();

device.queue.submit([commandBuffer, commandBuffer]);
// ⚠️ Validation fails because command buffers are not unique.

Обновления Dawn

C++-обёртка webgpu_cpp.h теперь доступна только в виде заголовка, что упрощает её использование и облегчает интеграцию с альтернативными C++-обёртками. См. issue 40195122 .

API webgpu.h на языке C больше не предоставляет концепцию объектов Swapchain. Это изменение призвано обеспечить более тесное соответствие API JavaScript. Внутренняя настройка теперь осуществляется через метод Configure() нового объекта wgpu::Surface , который может быть изменен в будущем. Пример см. в документации по сборке приложения с использованием WebGPU . См. issue 42241264 .

Ознакомьтесь с исчерпывающим списком коммитов .

Что нового в WebGPU

Список всего, что было рассмотрено в серии « Что нового в WebGPU» .

Хром 139

Хром 138

Хром 137

Хром 136

Хром 135

Хром 134

Хром 133

Хром 132

Хром 131

Хром 130

Хром 129

Хром 128

Хром 127

Хром 126

Хром 125

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113