Streamausgabezähler
Die Streamausgabe ist die Fähigkeit der GPU, Scheitelpunkte in einen Puffer zu schreiben. Die Datenstromausgabezähler überwachen den Fortschritt.
Unterschiede bei Streamzählern von Direct3D 11 zu Direct3D 12
Als Teil des Datenstromausgabeprozesses muss die GPU den aktuellen Speicherort im Puffer kennen, in den er schreibt. In Direct3D 11 wird der Speicher zum Speichern dieses Speicherorts vom Treiber zugewiesen, und die einzige Möglichkeit für Anwendungen, diesen Wert zu bearbeiten, erfolgt über die SOSetTargets-Methode. In Direct3D 12 weisen Apps Speicher zu, um diesen aktuellen Speicherort zu speichern. Es gibt keine besonderen Möglichkeiten, diesen Wert zu bearbeiten, und Apps können den Wert mit der CPU oder GPU lesen/schreiben.
BufferFilledSize
Die Anwendung ist für die Zuweisung von Speicher für eine 32-Bit-Menge mit dem Namen BufferFilledSizeverantwortlich. Dies enthält die Anzahl der Bytes von Daten im Datenstromausgabepuffer. Dieser Speicher kann in derselben oder einer anderen Ressource wie die Ressource platziert werden, die die Datenstromausgabe enthält. Auf diesen Wert wird von der GPU in der Streamausgabestufe zugegriffen, um zu bestimmen, wo neue Vertexdaten im Puffer angefügt werden sollen. Darüber hinaus wird auf diesen Wert von der GPU zugegriffen, um zu bestimmen, wann ein Überlauf aufgetreten ist.
Verweisen Sie auf die Struktur D3D12_STREAM_OUTPUT_DESC.
Die Debugebene überprüft Folgendes in ID3D12GraphicsCommandList::SOSetTargets:
- BufferFilledSize- in den von {OffsetInBytesimplizierten Bereich fällt, SizeInBytes}, wenn eine Ressource ohne NULL angegeben wird.
- BufferFilledSizeOffsetInBytes ist ein Vielfaches von 4.
- BufferFilledSizeOffsetInBytes- sich innerhalb des Bereichs der enthaltenden Ressource befindet.
- Die angegebene Ressource ist ein Puffer.
Die Laufzeit überprüft nicht den heap-Typ, der dem Datenstromausgabepuffer zugeordnet ist, da die Streamausgabe in allen Heap-Typen unterstützt wird.
Stammsignaturen müssen angeben, ob die Datenstromausgabe verwendet wird, indem die D3D12_ROOT_SIGNATURE_FLAGS Flags verwendet werden.
D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT können für in HLSL erstellte Stammsignaturen angegeben werden, ähnlich wie die anderen Flags angegeben werden.
CreateGraphicsPipelineState- schlägt fehl, wenn der Geometrie-Shader Streamausgabe enthält, die Stammsignatur jedoch nicht über den D3D12_ROOT_SIGNATURE_FLAG_ALLOW_STREAM_OUTPUT Flagsatz verfügt.
Wenn eine Ressource als Streamausgabeziel verwendet wird, müssen sich die verwendeten Ressourcen im D3D12_RESOURCE_STATE_STREAM_OUT Zustand befinden. Dies gilt sowohl für die Vertexdaten als auch für die BufferFilledSize- (die sich in denselben oder separaten Ressourcen befinden können).
Es gibt keine speziellen APIs zum Festlegen von Streamausgabepufferoffsets, da Anwendungen direkt in die BufferFilledSize- mit der CPU oder GPU schreiben können.
Verwandte Themen