Расширение fragment_depth в WGSL
При рендеринге с большим количеством геометрии оптимизация Early-Z – лучший друг разработчика. Они значительно повышают производительность, позволяя графическому процессору отбрасывать скрытые пиксели перед запуском ресурсоемких фрагментных шейдеров. Если растрированная глубина не проходит проверку, графический процессор полностью пропускает фрагментный шейдер, если у него нет других побочных эффектов.
Если вы хотите узнать, как аппаратное обеспечение обрабатывает это, у MJP есть отличная статья о том, когда необходимо отключить Early-Z.
Хотя манипулирование глубиной полезно, его выполнение во фрагментном шейдере сопряжено со скрытыми затратами. Запись в @builtin(frag_depth) внутри фрагментного шейдера обычно заставляет драйверы отключать эти оптимизации раннего Z-буфера для всего вызова отрисовки. Это происходит потому, что эвристика драйвера не может гарантировать, что рассчитанная шейдером глубина вывода соответствует глубине, интерполированной растеризатором.
Чтобы решить эту проблему, расширение WGSL fragment_depth позволяет указать имя режима глубины less или greater в @builtin(frag_depth), чтобы явно указать, как записанная глубина сравнивается с интерполированной глубиной, что позволяет графическому процессору безопасно применять ранние оптимизации Z.
Это расширение языка можно обнаружить в JavaScript с помощью navigator.gpu.wgslLanguageFeatures. Рекомендуется использовать директиву requires, чтобы сигнализировать о потенциальной непереносимости с помощью requires fragment_depth; в верхней части кода шейдера WGSL. Ознакомьтесь с примером ниже и намерением выпустить функцию.
if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
throw new Error(`WGSL fragment depth is not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires fragment_depth;
@fragment
fn main() -> @builtin(frag_depth, less) f32 {
// Explicitly states that the output fragment depth is less than early-Z depth,
// allowing the GPU to safely preserve early-Z optimizations.
return 0.0f;
}`,
});
Сжатие текстур не выровнено
Функция графического процессора texture-compression-unaligned позволяет создавать сжатые текстуры, размеры которых не кратны размеру блока (например, 4 x 4 для форматов BC, ETC2 и ASTC). Ранее WebGPU строго требовал, чтобы размеры текстур соответствовали этим границам блоков. Благодаря этому текстуры не нужно дополнять или масштабировать, чтобы они соответствовали выравниванию блоков, и сохраняется исходная точность сжатия без искажений. Подробнее о планах по выпуску…
Следующий фрагмент кода проверяет, поддерживает ли адаптер несжатое сжатие текстур, и, если оно доступно, запрашивает устройство с ним.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
requiredFeatures: ["texture-compression-unaligned"],
});
Большое спасибо внешнему участнику Игнасио Кастаньо (Ignacio Castaño) из spark.js за работу над этой функцией, спецификацией и CTS.
Цветовые пространства srgb-linear и display-p3-linear
Благодаря добавлению предопределенных цветовых пространств srgb-linear и display-p3-linear контекст холста WebGPU теперь может выполнять рендеринг непосредственно в линейных цветовых пространствах расширенного диапазона для поддержки дисплеев с широкой цветовой гаммой. В этих цветовых пространствах сохраняется линейная зависимость между значениями пикселей и физической яркостью. Это делает их идеальными для рендеринга физического света в играх, а также для задач пространственной обработки, таких как сглаживание, интерполяция и децимация. Ознакомьтесь с планом выпуска и примером Particles (HDR) PR #574.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");
context.configure({
device,
format: "rgba16float",
colorSpace: "display-p3-linear",
});
Дополнительный формат вершин snorm10-10-10-2
Формат вершин snorm10-10-10-2 – это упакованный 32-битный формат, содержащий четыре нормализованных значения со знаком: три 10-битных компонента (r, g, b) и один 2-битный (a). С помощью этого формата можно эффективно хранить атрибуты, например трехмерные нормальные векторы с дополнительным 2-битным скаляром или флагом выравнивания, экономя пропускную способность памяти. Подробности приведены в запросе на включение изменений 6491.
Поддержка f16 в Linux для NVIDIA
Необязательная функция shader-f16, которая обеспечивает поддержку 16-битных значений с плавающей запятой в WGSL, теперь поддерживается в Linux для последних версий драйверов графических процессоров NVIDIA. Подробнее о проблеме chromium:42251215…
Обновления Dawn
Теперь вы можете запрашивать LUID базового DXGIAdapter для определенного графического процессора, используя структуру WGPUAdapterPropertiesD3D. Подробнее о проблеме chromium:562849566…
Это лишь некоторые из основных моментов. Ознакомьтесь с полным списком коммитов.
Что нового в WebGPU
Список всего, что было рассмотрено в серии Что нового в WebGPU.
Chrome 155–156
- Расширение fragment_depth для WGSL
- Несоответствие сжатия текстур
- Цветовые пространства srgb-linear и display-p3-linear
- Дополнительный формат вершин snorm10-10-10-2
- Поддержка f16 в Linux для NVIDIA
- Обновления Dawn
Chrome 153–154
- Расширение buffer_view в WGSL
- Расширение swizzle_assignment для WGSL
- Обновления расширения WGSL
- Обновления Dawn
Chrome 151–152
Chrome 149–150
Chrome 147–148
Chrome 146
- Поддержка режима совместимости WebGPU в OpenGL ES 3.1
- Временные прикрепленные файлы
- Расширение texture_and_sampler_let для WGSL
- Обновления Dawn
Chrome 145
- Расширение subgroup_uniformity для WGSL
- Экспериментальное синхронное сопоставление буферов в рабочих процессах
- Обновления Dawn
Chrome 144
- Расширение WGSL subgroup_id
- Расширение uniform_buffer_standard_layout для WGSL
- WebGPU на Linux
- Ускорение writeBuffer и writeTexture
- Обновления Dawn
Chrome 143
- Перестановка компонентов текстуры
- Удаление использования текстуры хранилища bgra8unorm, доступной только для чтения
- Обновления Dawn
Chrome 142
Chrome 141
- Проверка на соответствие требованиям к Tint IR завершена
- Анализ диапазона целых чисел в компиляторе WGSL
- Обновление SPIR-V 1.4 для бэкенда Vulkan
- Обновления Dawn
Chrome 140
- Запросы устройств используют адаптер
- Сокращение для использования текстуры, когда используется представление текстуры
- Функция textureSampleLevel в WGSL поддерживает одномерные текстуры
- Прекращение поддержки использования текстуры хранилища bgra8unorm только для чтения
- Удаление атрибута isFallbackAdapter для GPUAdapter
- Обновления Dawn
Chrome 139
- Поддержка 3D-текстур для сжатых форматов BC и ASTC
- Новая функция core-features-and-limits
- Эксперимент с источником для режима совместимости WebGPU
- Обновления Dawn
Chrome 138
- Сокращение для использования буфера в качестве ресурса привязки
- Изменения требований к размеру буферов, сопоставленных при создании
- Отчет об архитектуре современных графических процессоров
- Прекращение поддержки атрибута isFallbackAdapter для GPUAdapter
- Обновления Dawn
Chrome 137
- Используйте представление текстуры для привязки externalTexture
- Копирование буферов без указания смещений и размера
- Функция workgroupUniformLoad в WGSL с указателем на атомарный тип
- Атрибут powerPreference для GPUAdapterInfo
- Удаление атрибута compatibilityMode для GPURequestAdapterOptions
- Обновления Dawn
Chrome 136
- Атрибут isFallbackAdapter для GPUAdapterInfo
- Ускорение компиляции шейдеров в D3D12
- Как сохранять и копировать изображения на холсте
- Ограничения режима совместимости с Lift
- Обновления Dawn
Chrome 135
- Разрешить создание макета конвейера с макетом группы привязки null
- Разрешить областям просмотра выходить за границы целей рендеринга
- Упрощенный доступ к экспериментальному режиму совместимости на Android
- Удаление ограничения maxInterStageShaderComponents
- Обновления Dawn
Chrome 134
- Как улучшить рабочие нагрузки машинного обучения с помощью подгрупп
- Удаление поддержки фильтруемых текстур с плавающей запятой в качестве смешиваемых
- Обновления Dawn
Chrome 133
- Дополнительные форматы вершин unorm8x4-bgra и 1-component
- Разрешить запрашивать неизвестные лимиты с неопределенным значением
- Изменения в правилах выравнивания WGSL
- Повышение производительности WGSL с помощью discard
- Использовать displaySize VideoFrame для внешних текстур
- Обработка изображений с нестандартной ориентацией с помощью copyExternalImageToTexture
- Улучшение условий для разработчиков
- Как включить режим совместимости с помощью featureLevel
- Удаление экспериментальных функций подгрупп
- Устаревшее ограничение maxInterStageShaderComponents
- Обновления Dawn
Chrome 132
- Использование TextureView
- Смешивание 32-битных текстур с плавающей запятой
- Атрибут adapterInfo для GPUDevice
- Настройка контекста холста с недопустимым форматом вызывает ошибку JavaScript
- Ограничения фильтрации текстур
- Расширенное тестирование подгрупп
- Улучшение условий для разработчиков
- Экспериментальная поддержка 16-битных нормализованных форматов текстур
- Обновления Dawn
Chrome 131
- Расстояния отсечения в WGSL
- GPUCanvasContext getConfiguration()
- Примитивы точек и линий не должны иметь смещения глубины
- Встроенные функции инклюзивного сканирования для подгрупп
- Экспериментальная поддержка multi-draw indirect
- Параметр компиляции модуля шейдера strict math
- Удаление метода requestAdapterInfo() из GPUAdapter
- Обновления Dawn
Chrome 130
- Смешивание двух источников
- Ускорение компиляции шейдеров в Metal
- Прекращение поддержки requestAdapterInfo() для GPUAdapter
- Обновления Dawn
Chrome 129
Chrome 128
- Эксперименты с подгруппами
- Прекращение поддержки настройки смещения глубины для линий и точек
- Скрывать предупреждение инструментов разработчика о неперехваченной ошибке, если используется preventDefault
- WGSL interpolate sampling first and either
- Обновления Dawn
Chrome 127
- Экспериментальная поддержка OpenGL ES на Android
- Атрибут info для GPUAdapter
- Улучшения совместимости WebAssembly
- Улучшенные ошибки кодировщика команд
- Обновления Dawn
Chrome 126
- Увеличение лимита maxTextureArrayLayers
- Оптимизация загрузки буфера для бэкенда Vulkan
- Ускорение компиляции шейдеров
- Отправленные буферы команд должны быть уникальными
- Обновления Dawn
Chrome 125
Chrome 124
- Текстуры хранилища только для чтения и для чтения и записи
- Поддержка сервисных и общих рабочих процессов
- Новые атрибуты с информацией об адаптере
- Исправленные ошибки
- Обновления Dawn
Chrome 123
- Поддержка встроенных функций DP4a в WGSL
- Неограниченные параметры указателей в WGSL
- Синтаксический сахар для разыменования составных объектов в WGSL
- Раздельное состояние только для чтения для аспектов трафарета и глубины
- Обновления Dawn
Chrome 122
- Расширение охвата с помощью режима совместимости (функция в разработке)
- Увеличение лимита maxVertexAttributes
- Обновления Dawn
Chrome 121
- Поддержка WebGPU на Android
- Используйте DXC вместо FXC для компиляции шейдеров в Windows
- Запросы временных меток в проходах вычислений и рендеринга
- Точки входа по умолчанию в модули шейдеров
- Поддержка display-p3 в качестве цветового пространства GPUExternalTexture
- Информация о кучах памяти
- Обновления Dawn
Chrome 120
- Поддержка 16-битных значений с плавающей запятой в WGSL
- Расширяйте границы
- Изменения состояния буфера глубины и трафарета
- Обновление информации об адаптере
- Квантование запросов с временными метками
- Функции для весенней уборки
Chrome 119
- Фильтруемые 32-битные текстуры с плавающей запятой
- Формат вершин unorm10-10-10-2
- Формат текстуры rgb10a2uint
- Обновления Dawn
Chrome 118
- Поддержка HTMLImageElement и ImageData в
copyExternalImageToTexture() - Экспериментальная поддержка текстур хранилища только для чтения и для чтения и записи
- Обновления Dawn
Chrome 117
- Unset vertex buffer
- Отменить привязку группы
- Отключение ошибок, связанных с асинхронным созданием конвейера, когда устройство потеряно
- Обновления создания модуля шейдера SPIR-V
- Улучшение условий для разработчиков
- Конвейеры кеширования с автоматически созданным макетом
- Обновления Dawn
Chrome 116
- Интеграция WebCodecs
- Устройство, возвращенное GPUAdapter
requestDevice(), потеряно - Обеспечьте плавное воспроизведение видео при вызове
importExternalTexture() - Соответствие спецификациям
- Улучшение условий для разработчиков
- Обновления Dawn
Chrome 115
- Поддерживаемые расширения языка WGSL
- Экспериментальная поддержка Direct3D 11
- Как по умолчанию использовать дискретный графический процессор при питании от сети
- Улучшение условий для разработчиков
- Обновления Dawn
Chrome 114
- Оптимизация JavaScript
- Метод getCurrentTexture() для ненастроенного элемента canvas вызывает ошибку InvalidStateError
- Обновления WGSL
- Обновления Dawn