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

Франсуа Бофор
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 .

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

Новые предупреждения DevTools

Если ключ depth используется в GPUExtend3DDict в консоли DevTools отображается предупреждение, поскольку правильным ключом является 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 становится удобнее отладка, если вы включите ее для отладки . См. выпуск Dawn:1784.

Снимок экрана приложения «Инструменты» на macOS с пользовательскими метками, полученными из WebGPU.
Пользовательские метки в приложении «Инструменты» в 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

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

Что нового в WebGPU

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

Хром 124

Хром 123

Хром 122

Хром 121

Хром 120

Хром 119

Хром 118

Хром 117

Хром 116

Хром 115

Хром 114

Хром 113