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


Счетчики выходных данных потока

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

счетчики и запросы