Счетчики UAV
Счетчики неупорядоченного доступа можно использовать для связывания 32-разрядного атомарного счетчика с неупорядоченным представлением доступа (UAV).
Различия в счетчиках UAV от Direct3D 11 до Direct3D 12
Приложения Direct3D 12 и Direct3D 11 используют одни и те же функции шейдера HLSL для доступа к счетчикам UAV.
- IncrementCounter
- DecrementCounter
- Append
- Использование
Direct3D 12
В Direct3D 12 32-разрядные значения выделяются приложением, поэтому 32-разрядные значения могут быть прочитаны и записаны либо ЦП, либо GPU, как и любой другой ресурс Direct3D 12.
Direct3D 11
Вне шейдеров в Direct3D 11 необходимо вызывать методы API для доступа к счетчикам (например, ID3D11DeviceContext::CopyStructureCount).
Использование счетчиков UAV
Ваше приложение отвечает за выделение 32-разрядного хранилища для счетчиков БПЛА. Это хранилище можно выделить в другом ресурсе, который содержит данные, доступные через 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 удаляет различие между добавочные и счетчики БПЛА (хотя различие по-прежнему существует в байт-коде HLSL).
Базовая среда выполнения проверит эти ограничения в CreateUnorderedAccessView.
Во время рисования или отправки ресурс счетчика должен находиться в состоянии D3D12_RESOURCE_STATE_UNORDERED_ACCESS. Кроме того, в рамках одного вызова Draw/Dispatch приложение не может получить доступ к одному и тому же 32-разрядному расположению памяти через два отдельных счетчика UAV. Уровень отладки выдает ошибки, если обнаружена любая из них.
Методы SetUnorderedAccessViewCounterValue или CopyStructureCount отсутствуют, так как приложения могут просто копировать данные в значение счетчика и из них напрямую.
Поддерживается динамическое индексирование БПЛА со счетчиками.
Если шейдер попытается получить доступ к счетчику UAV, у которых нет связанного счетчика, уровень отладки выдаст предупреждение, и произойдет ошибка страницы GPU, в результате чего устройство приложения будет удалено.
Счетчики UAV поддерживаются во всех типах кучи (по умолчанию, отправке, обратному чтению).