Счетчики UAV
Счетчики неупорядоченного доступа (UAV) можно использовать для связывания 32-разрядного атомарного счетчика с неупорядоченным представлением доступа (UAV).
Различия в счетчиках UAV от Direct3D 11 до Direct3D 12
Приложения Direct3D 12 и приложения Direct3D 11 используют одинаковые функции шейдера высокого уровня (HLSL) для доступа к счетчикам UAV.
- IncrementCounter
- DecrementCounter
- добавление
- потреблять
Direct3D 12
В Direct3D 12 32-разрядные значения выделяются приложением, поэтому 32-разрядные значения можно считывать и записывать с помощью ЦП или GPU, как и любой другой ресурс Direct3D 12.
Direct3D 11
Вне шейдеров с Direct3D 11 необходимо вызвать методы API для доступа к счетчикам (например, ID3D11DeviceContext::CopyStructureCount).
Использование счетчиков UAV
Ваше приложение отвечает за выделение 32-разрядных хранилищ для счетчиков UAV. Это хранилище может быть выделено в другом ресурсе, так как оно содержит данные, доступные через UAV.
Ознакомьтесь с CreateUnorderedAccessView, D3D12_BUFFER_UAV_FLAGS и D3D12_BUFFER_UAV.
Если pCounterResource указывается в вызове CreateUnorderedAccessView, то есть счетчик, связанный с UAV. В этом случае:
- StructureByteStride должно быть больше нуля
- Формат должен быть DXGI_FORMAT_UNKNOWN
- Флаг RAW не должен быть задан
- Оба ресурса должны быть буферами
- CounterOffsetInBytes должно быть несколькими 4 байтами
- CounterOffsetInBytes должен находиться в диапазоне ресурса счетчика.
- pDesc не может иметь значение NULL
- pResource не может иметь значение NULL
И обратите внимание на следующие варианты использования:
- Если pCounterResource не указано, counterOffsetInBytes должно быть равно 0.
- Если флаг RAW задан, формат должен быть DXGI_FORMAT_R32_TYPELESS, а ресурс UAV должен быть буфером.
- Если pCounterResource не задано, CounterOffsetInBytes должен иметь значение 0.
- Если флаг RAW не задан и StructureByteStride = 0, то формат должен быть допустимым форматом UAV.
Direct3D 12 удаляет различие между добавленными и счетчиками UAV (хотя различие по-прежнему существует в байт-коде HLSL).
Базовая среда выполнения проверяет эти ограничения внутри CreateUnorderedAccessView.
Во время рисования и отправки ресурс счетчика должен находиться в состоянии D3D12_RESOURCE_STATE_UNORDERED_ACCESS. Кроме того, в одном вызове Draw/Dispatch приложение может получить доступ к одному 32-разрядному расположению памяти с помощью двух отдельных счетчиков UAV. Уровень отладки выдает ошибки, если обнаружен любой из них.
Нет методов SetUnorderedAccessViewCounterValue или CopyStructureCount, так как приложения могут просто копировать данные в значение счетчика и из нее напрямую.
Поддерживается динамическое индексирование uav с счетчиками.
Если шейдер пытается получить доступ к счетчику UAV, который не имеет связанного счетчика, уровень отладки выдает предупреждение, а ошибка страницы GPU приведет к удалению устройства приложений.
Счетчики UAV поддерживаются во всех типах куч (по умолчанию, отправке, обратной передаче).
Связанные разделы
- счетчики и запросы