Поделиться через


Счетчики 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 поддерживаются во всех типах куч (по умолчанию, отправке, обратной передаче).