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


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