Счетчики потокового вывода
Потоковый вывод — это возможность GPU записывать вершины в буфер. Счетчики потокового вывода отслеживают ход выполнения.
Различия счетчиков потоков от Direct3D 11 до Direct3D 12
В рамках процесса вывода потока GPU должен знать текущее расположение в буфере, в который выполняется запись. В Direct3D 11 память для хранения этого расположения выделяется драйвером, и единственным способом управления этим значением для приложений является метод SOSetTargets . В Direct3D 12 приложения выделяют память для хранения текущего расположения. Нет специальных способов управления этим значением, и приложения могут считывать и записывать значение с помощью ЦП или GPU.
BufferFilledSize
Приложение отвечает за выделение хранилища для 32-разрядного количества, называемого BufferFilledSize. Содержит количество байтов данных в буфере вывода потока. Это хранилище может размещаться в том же или другом ресурсе, что и тот, который содержит потоковые выходные данные. К этому значению обращается GPU на этапе потокового вывода, чтобы определить, куда следует добавить новые данные вершин в буфер. Кроме того, к этому значению обращается GPU, чтобы определить, когда произошло переполнение.
См. D3D12_STREAM_OUTPUT_DESC структуры.
Уровень отладки проверит следующее в ID3D12GraphicsCommandList::SOSetTargets:
- BufferFilledSize попадает в диапазон, подразумеваемый {OffsetInBytes, SizeInBytes}, если указан ресурс, отличный от NULL.
- BufferFilledSizeOffsetInBytes кратно 4.
- BufferFilledSizeOffsetInBytes находится в диапазоне содержащего ресурса.
- Указанный ресурс является буфером.
Среда выполнения не будет проверять тип кучи, связанный с буфером вывода потока, так как потоковый вывод поддерживается во всех типах кучи.
Корневые сигнатуры должны указывать, будут ли использоваться выходные данные потока с помощью флагов D3D12_ROOT_SIGNATURE_FLAGS .
D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT можно указать для корневых подписей, созданных в HLSL, так же, как и другие флаги.
CreateGraphicsPipelineState завершится ошибкой , если геометрический шейдер содержит потоковые выходные данные, но для корневой подписи не задан флаг D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT.
Если ресурс используется в качестве целевого объекта потокового вывода, используемые ресурсы должны находиться в D3D12_RESOURCE_STATE_STREAM_OUT состоянии. Это относится как к данным вершины, так и к BufferFilledSize (который может находиться в одном или отдельном ресурсе).
Нет специальных API для задания смещений буфера потокового вывода, так как приложения могут выполнять запись в BufferFilledSize напрямую с помощью ЦП или GPU.
Связанные темы