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

François Beaufort
François Beaufort

Опубликовано 29 января 2025 г.

Дополнительные форматы вершин unorm8x4-bgra и с одним компонентом

Добавлен формат вершин "unorm8x4-bgra" и следующие однокомпонентные форматы вершин: "uint8", "sint8", "unorm8", "snorm8", "uint16", "sint16", "unorm16", "snorm16" и "float16". Формат вершин "unorm8x4-bgra" позволяет немного удобнее загружать цвета вершин, закодированные в формате BGRA, при использовании того же шейдера. Кроме того, формат вершин с одним компонентом позволяет запрашивать только необходимые данные, тогда как раньше для 8- и 16-битных типов данных требовалось в два раза больше. Подробнее о записи chromestatus и проблеме 376924407…

Разрешить запрашивать неизвестные лимиты с неопределенным значением

Чтобы сделать API WebGPU более устойчивым к изменениям, теперь при запросе устройства GPU можно указывать неизвестные ограничения со значением undefined. Это полезно, например, в следующем коде приложения, где adapter.limits.someLimit может быть undefined, если someLimit больше не существует. Спецификация PR 4781.

const adapter = await navigator.gpu.requestAdapter();

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

Изменения в правилах выравнивания WGSL

Теперь нельзя задать слишком маленькое значение выравнивания для элемента структуры, поскольку для всех структур требуется, чтобы @align(n) делило RequiredAlignOf. Это изменение упрощает использование языка WGSL и повышает его совместимость с браузерами Firefox и Safari. Образец кода, демонстрирующий различия между компиляторами Tint, Naga и WebKit, можно найти в спецификации PR.

Повышение производительности WGSL с помощью discard

Из-за значительного снижения производительности при отрисовке сложного эффекта отражений в экранном пространстве (SSR) реализация оператора discard использует семантику, предоставляемую платформой, для понижения до вспомогательного вызова, если он доступен. Это повышает производительность шейдеров, использующих discard. Подробнее об ошибке 372714384…

Используйте displaySize из VideoFrame для внешних текстур

Согласно спецификации WebGPU, при импорте VideoFrame в качестве видимого размера GPUExternalTexture следует использовать размеры displayWidth и displayHeight. Однако видимый размер использовался неправильно, из-за чего возникали проблемы при попытке использовать textureLoad() на GPUExternalTexture. Теперь эта неполадка устранена. Подробнее об ошибке 377574981…

Как обрабатывать изображения с нестандартной ориентацией с помощью copyExternalImageToTexture

Метод copyExternalImageToTexture() GPUQueue используется для копирования содержимого изображения или холста в текстуру. Теперь он корректно обрабатывает изображения с нестандартной ориентацией. Раньше при использовании ImageBitmap с imageOrientation "from-image" или изображения с ориентацией, отличной от ориентации по умолчанию, это было не так. Подробнее о проблеме 384858956…

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

Если значение adapter.limits высокое, это может показаться странным, но при запросе устройства с GPU нужно явно указать более высокое ограничение. В противном случае вы можете столкнуться с ограничениями в самый неподходящий момент.

Чтобы помочь вам, мы добавили в сообщения об ошибках подсказки, в которых говорится, что нужно явно запросить более высокий лимит, если в requiredLimits при вызове requestDevice() не был указан лимит. Подробнее о проблеме 42240683…

В примере ниже показано улучшенное сообщение об ошибке, которое регистрируется в консоли инструментов разработчика при создании буфера GPU с размером, превышающим ограничение размера буфера устройства по умолчанию.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

Как включить режим совместимости с помощью featureLevel

Теперь вы можете запросить адаптер графического процессора в экспериментальном режиме совместимости, задав для стандартизированного параметра featureLevel значение "compatibility". Допустимы только строки "core" (по умолчанию) и "compatibility". Ознакомьтесь с примером ниже и спецификацией PR 4897.

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

Вариант featureLevel заменяет нестандартный вариант compatibilityMode, а нестандартный атрибут featureLevel заменяет атрибут isCompatibilityMode.

Поскольку эта функция пока экспериментальная, вам нужно запустить Chrome с флагом "Небезопасная поддержка WebGPU" по адресу chrome://flags/#enable-unsafe-webgpu. Попробуйте webgpureport.org.

Удаление экспериментальных функций подгрупп

Удалены экспериментальные функции подгрупп "chromium-experimental-subgroups" и "chromium-experimental-subgroup-uniform-control-flow", поддержка которых прекращена. Подробнее о проблеме 377868468…

Теперь, когда вы экспериментируете с подгруппами, вам достаточно использовать экспериментальную функцию "subgroups". Экспериментальная функция "subgroups-f16" больше не поддерживается и скоро будет удалена. Значения f16 можно использовать с подгруппами, если приложение запрашивает функции "shader-f16" и "subgroups". Подробнее об этой проблеме…

Прекращение поддержки ограничения maxInterStageShaderComponents

Ограничение на количество символов в атрибуте "название" maxInterStageShaderComponents отменено по следующим причинам:

  • Избыточность с maxInterStageShaderVariables. Это ограничение уже выполняет аналогичную функцию, контролируя объем данных, передаваемых между этапами шейдера.
  • Незначительные расхождения. Несмотря на то что эти два ограничения рассчитываются немного по-разному, разница между ними невелика и ее можно эффективно контролировать в рамках ограничения maxInterStageShaderVariables.
  • Упрощение. Удаление maxInterStageShaderComponents упрощает интерфейс шейдера и уменьшает сложность для разработчиков. Вместо того чтобы управлять двумя отдельными ограничениями с незначительными различиями, они могут сосредоточиться на более подходящем и всеобъемлющем ограничении maxInterStageShaderVariables.

Мы планируем полностью удалить его в Chrome 135. Подробнее о намерении прекратить поддержку и проблеме 364338810…

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

wgpu::Device::GetAdapterInfo(adapterInfo) позволяет получать информацию об адаптере непосредственно от wgpu::Device. Подробнее о проблеме 376600838…

Структура WGPUProgrammableStageDescriptor переименована в WGPUComputeState, чтобы состояние вычислений соответствовало состояниям вершин и фрагментов. Подробнее о проблеме 379059434…

Значение перечисления wgpu::VertexStepMode::VertexBufferNotUsed удалено. Макет буфера вершин, который не используется, теперь можно обозначить с помощью {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0}. Подробнее об ошибке 383147017…

Это лишь некоторые из основных изменений. Ознакомьтесь с полным списком коммитов.

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