Что нового в 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 с двумя GPU, если requestAdapter() вызывается без параметра powerPreference , возвращается дискретный GPU, когда устройство пользователя подключено к сети переменного тока. В противном случае возвращается интегрированный GPU. См. изменение 4499307 .

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

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

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

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

Несмотря на то, что нулевые отправка и розыгрыши допустимы, предупреждение призывает разработчиков избегать их, когда это возможно. См. выпуск 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, когда вы включаете его для отладки . Смотрите проблему dawn:1784

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

Записать HLSL в случае сбоя компиляции

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

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

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

Передача 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);

Временные вложения

Вы можете создавать вложения, которые позволяют операциям рендеринга оставаться в памяти плитки, избегая трафика VRAM и потенциально избегая выделения VRAM для текстур, устанавливая использование 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» .

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