Счетчики выходных данных потока
Выходные данные потока — это возможность 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 напрямую.
Связанные разделы
-
счетчики и запросы