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

François Beaufort
François Beaufort

Поддерживаемые расширения языка WGSL

Член wgslLanguageFeatures объекта GPU содержит список названий поддерживаемых расширений языка WGSL. Поддерживаемые расширения языка WGSL включаются автоматически, поэтому вам не нужно запрашивать их явным образом. Сейчас этот список пуст, но в будущем в нем будет много проблем (например, do-while loops). Подробнее о проблеме dawn:1777…

if (navigator.gpu.wgslLanguageFeatures?.has("unknown-feature")) {
  // Use unknown-feature in WGSL shader code.
}

Экспериментальная поддержка Direct3D 11

Команда Chromium работает над добавлением поддержки WebGPU для Direct3D 11. Теперь вы можете протестировать его локально, запустив Chrome в Windows с флагами командной строки --enable-unsafe-webgpu --use-webgpu-adapter=d3d11. Подробнее о проблеме dawn:1705…

Как по умолчанию использовать дискретный графический процессор при работе от сети

На устройствах macOS с двумя графическими процессорами, если функция requestAdapter() вызывается без параметра powerPreference, возвращается дискретный графический процессор, когда устройство пользователя подключено к сети переменного тока. В противном случае возвращается интегрированный графический процессор. См. изменение 4499307.

Улучшение работы разработчиков

Новые предупреждения в инструментах разработчика

Если ключ depth используется в GPUExtend3DDict, в консоли разработчика появится предупреждение, поскольку правильный ключ – depthOrArrayLayers. Подробнее о проблеме chromium:1440900…

Предупреждение также появляется, если в GPUBlendComponent есть как явные, так и заданные по умолчанию участники. См. проблему dawn:1785.

Хотя отправка и отрисовка нулевого размера допустимы, предупреждение побуждает разработчиков избегать их, когда это возможно. См. проблему dawn:1786.

Улучшенные сообщения об ошибках

Теперь при использовании GPUCommandEncoder, если finish() уже был вызван, показывается улучшенное сообщение об ошибке. См. проблему dawn:1736.

При отправке буферов команд с уничтоженными объектами ярлыки буферов команд, которые использовались в submit(), теперь видны в сообщении об ошибке. Подробнее о проблеме dawn:1747…

Теперь в сообщении об ошибке при проверке depthStencil указывается недопустимая часть состояния трафарета глубины. Подробнее о проблеме dawn:1735…

В сообщении об ошибке проверки minBindingSize теперь указывается группа и номер привязки, которая не прошла проверку, а также буфер. Подробнее о проблеме dawn:1604…

Сообщения об ошибках, возвращаемые методом mapAsync() для объекта GPUBuffer, были улучшены, чтобы помочь разработчикам при отладке. Пример приведен ниже, а ошибка chromium:1431622 описана здесь.

// Create a GPU buffer and map it.
const descriptor = { size: 0, usage: GPUBufferUsage.MAP_READ };
const buffer = device.createBuffer(descriptor);
buffer.mapAsync(GPUMapMode.READ);

// Before it has been mapped, request another mapping.
try {
  await buffer.mapAsync(GPUMapMode.READ);
} catch (error) {
  // New! Error message tells you mapping is already pending.
  console.warn(error.message);
}

Ярлыки в инструментах отладки macOS

Переключатель use_user_defined_labels_in_backend позволяет пересылать ярлыки объектов на серверную часть, чтобы их можно было просматривать в инструментах отладки для определенных платформ, таких как RenderDoc, PIX или Instruments. Теперь при отладке на macOS доступна улучшенная отладка. См. issue dawn:1784

Скриншот приложения Instruments на macOS с пользовательскими ярлыками, полученными от WebGPU.
Метки, заданные пользователем в приложении Instruments на устройстве с macOS.

Запись HLSL в журнал при сбое компиляции

Переключатель отладки dump_shaders позволяет регистрировать входные шейдеры WGSL и переведенные серверные шейдеры. Теперь, если вы включите его для отладки, HLSL будет сохранен, если не удастся выполнить компиляцию. См. проблему dawn:1681.

Обновления на рассвете

Отменить буфер вершин

Передача nullptr вместо wgpu::Buffer в SetVertexBuffer() на wgpu::RenderPassEncoder или wgpu::RenderBundleEncoder позволяет отменить ранее заданный буфер вершин в определенном слоте. Подробнее о проблеме dawn:1675…

// Set vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, myVertexBuffer);

// Then later, unset vertex buffer in slot 0.
myRenderPassEncoder.SetVertexBuffer(0, nullptr);

Временные прикрепленные файлы

Вы можете создавать прикрепленные файлы, которые позволяют операциям прохода отрисовки оставаться в памяти фрагментов, избегая трафика VRAM и потенциально избегая выделения VRAM для текстур, задавая использование wgpu::TextureUsage::TransientAttachment. Эта функция поддерживается только для Metal и Vulkan. Подробнее о проблеме 1695…

wgpu::TextureDescriptor desc;
desc.format = wgpu::TextureFormat::RGBA8Unorm;
desc.size = {1, 1, 1};
desc.usage = wgpu::TextureUsage::RenderAttachment |
             wgpu::TextureUsage::TransientAttachment;

auto transientTexture = device.CreateTexture(&desc);

// You can now create views from the texture to serve as transient
// attachments, e.g. as color attachments in a render pipeline.

Строительство без depot_tools

Новый параметр DAWN_FETCH_DEPENDENCIES CMake позволяет получать зависимости Dawn с помощью скрипта Python, который считывает файлы DEPS, вместо того чтобы требовать установки depot_tools для всех проектов, которые от него зависят. Подробнее об изменении 131750…

Что нового в WebGPU

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

Chrome 155–156

Chrome 153–154

Chrome 151–152

Chrome 149–150

Chrome 147–148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113