Udostępnij przez


Liczniki danych wyjściowych strumienia

Dane wyjściowe strumienia to zdolność procesora GPU do zapisywania wierzchołków w buforze. Liczniki wyjściowe strumienia monitorują postęp.

Różnice w licznikach strumienia z Direct3D 11 do Direct3D 12

W ramach procesu wyjściowego strumienia procesor GPU musi znać bieżącą lokalizację w buforze, do którego zapisuje. W trybie Direct3D 11 pamięć do przechowywania tej lokalizacji jest przydzielana przez sterownik, a jedynym sposobem manipulowania tą wartością przez aplikacje jest użycie metody soSetTargets . W wersji Direct3D 12 aplikacje przydzielają pamięć do przechowywania tej bieżącej lokalizacji. Nie ma specjalnych sposobów manipulowania tą wartością, a aplikacje mogą odczytywać/zapisywać wartość za pomocą procesora CPU lub procesora GPU.

BufferFilledSize

Aplikacja jest odpowiedzialna za przydzielanie magazynu dla 32-bitowej ilości o nazwie BufferFilledSize. Zawiera on liczbę bajtów danych w buforze strumienia wyjściowego. Ten magazyn można umieścić w tym samym lub innym zasobie, który zawiera dane wyjściowe strumienia. Ta wartość jest uzyskiwana przez procesor GPU na etapie strumienia wyjściowego, aby określić, gdzie dołączyć nowe dane wierzchołka w buforze. Ponadto ta wartość jest uzyskiwana przez procesor GPU, aby określić, kiedy wystąpił przepełnienie.

Zapoznaj się ze strukturą D3D12_STREAM_OUTPUT_DESC.

Warstwa debugowania zweryfikuje następujące elementy w ID3D12GraphicsCommandList::SOSetTargets:

  • BufferFilledSize mieści się w zakresie sugerowanym przez {OffsetInBytes, SizeInBytes}, jeśli określono zasób inny niż NULL.
  • BufferFilledSizeOffsetInBytes jest wielokrotność 4.
  • BufferFilledSizeOffsetInBytes mieści się w zakresie zawierającego zasobu.
  • Określony zasób jest buforem.

Środowisko uruchomieniowe nie zweryfikuje typu sterta skojarzonego z buforem wyjściowym strumienia, ponieważ dane wyjściowe strumienia są obsługiwane we wszystkich typach stert.

Podpisy główne muszą określać, czy będą używane dane wyjściowe strumienia przy użyciu flag D3D12_ROOT_SIGNATURE_FLAGS.

D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT można określić dla podpisów głównych utworzonych w języku HLSL w sposób podobny do sposobu określenia innych flag.

CreateGraphicsPipelineState zakończy się niepowodzeniem, jeśli cieniator geometrii zawiera strumień wyjściowy, ale sygnatura główna nie ma ustawionej flagi D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT.

Gdy zasób jest używany jako element docelowy strumienia, używane zasoby muszą znajdować się w stanie D3D12_RESOURCE_STATE_STREAM_OUT. Dotyczy to zarówno danych wierzchołków, jak i BufferFilledSize (które mogą znajdować się w tych samych lub oddzielnych zasobach).

Nie ma specjalnych interfejsów API do ustawiania przesunięć buforu wyjściowego strumienia, ponieważ aplikacje mogą zapisywać w BufferFilledSize za pomocą procesora CPU lub procesora GPU bezpośrednio.

liczniki i zapytania