Что нового в 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 .

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

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

Если ключ 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. См. проблему dawn:1784

Скриншот приложения Instruments на 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. См. проблему 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» .

Хром 144

Хром 143

Хром 142

Хром 141

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