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

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

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

Член wgslLanguageFeatures объекта GPU содержит список поддерживаемых языковых расширений WGSL. Поддерживаемые языковые расширения WGSL включаются автоматически, поэтому вам не нужно явно запрашивать их. Этот список пока пуст, но ожидается их появление в будущем (например, do-while loops ). См. issue 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 . См. issue dawn:1705 .

Получите дискретный графический процессор по умолчанию при питании от сети переменного тока

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

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

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

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

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

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

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

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

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

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

Сообщение об ошибке проверки minBindingSize теперь содержит группу и номер привязки, не прошедшей проверку, а также буфер. См. issue 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

Скриншот приложения «Инструменты» на macOS с пользовательскими метками, полученными с помощью WebGPU.
Пользовательские метки в приложении «Инструменты» на macOS.

Регистрировать HLSL, если компиляция не удалась

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

Обновления Dawn

Сбросить буфер вершин

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

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

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

Временные привязанности

Вы можете создавать вложения, которые позволяют операциям рендеринга оставаться в памяти тайлов, избегая трафика видеопамяти и, возможно, выделения видеопамяти для текстур, установив использование wgpu::TextureUsage::TransientAttachment . Эта функция поддерживается только для Metal и Vulkan. См. issue dawn: 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» .

Хром 140

Хром 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