D3D12_PIPELINE_STATE_STREAM_DESC-Struktur (d3d12.h)

Beschreibt einen Pipelinestatusdatenstrom.

Syntax

typedef struct D3D12_PIPELINE_STATE_STREAM_DESC {
  SIZE_T SizeInBytes;
  void   *pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC;

Member

SizeInBytes

SAL: In

Gibt die Größe der undurchsichtigen Datenstruktur an, auf die das pPipelineStateSubobjectStream-Element in Bytes verweist.

pPipelineStateSubobjectStream

SAL: In_reads(Inexpressible("Dependentonsizeofsubobjects"))

Gibt die Adresse einer Datenstruktur an, die als Bytestream ein beliebiges Pipelinezustandsunterobjekt beschreibt.

Hinweise

Verwenden Sie diese Struktur mit der ID3D12Device2::CreatePipelineState-Methode , um Pipelinestatusobjekte zu erstellen.

Das Format des bereitgestellten Datenstroms sollte aus einem wechselnden Satz von D3D12_PIPELINE_STATE_SUBOBJECT_TYPE und den entsprechenden Unterobjekttypen für sie bestehen (z. B. D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER Paare mit D3D12_RASTERIZER_DESC. In Bezug auf die Ausrichtung erwartet die D3D12-Runtime, dass Unterobjekte einzelne Strukturpaare von Enum-Struktur und nicht ein fortlaufender Satz von Feldern sind. Außerdem wird erwartet, dass sie an der natürlichen Wortausrichtung des Systems ausgerichtet werden. Dies kann entweder mithilfe alignas(void*)von erreicht werden oder ein union aus dem Unterobjekt enum + und ein void*erstellt werden.

Wichtig

Es reicht nicht aus, die D3D12_PIPELINE_STATE_SUBOBJECT_TYPE einfach mit einem Void* zu verbinden, da dies dazu führt, dass bestimmte Unterobjekte falsch ausgerichtet werden. Auf D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY folgt beispielsweise eine D3D12_PRIMITIVE_TOPOLOGY_TYPE-Enumeration . Wenn der Unterobjekttyp mit einem void* vereinigt ist, gibt es zusätzliche Auffüllung zwischen diesen 2 Membern, was zu einer Beschädigung des Datenstroms führt. Aus diesem Grund sollten Sie die gesamte Unterobjektstruktur mit einem void* verbinden, wenn alignas nicht verfügbar ist.

Ein Beispiel für ein geeignetes Unterobjekt für die Verwendung mit D3D12_RASTERIZER_DESC ist hier dargestellt:

struct alignas(void*) StreamingRasterizerDesc
{
private:
  D3D12_PIPELINE_STATE_SUBOBJECT_TYPE Type = D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER;
public:
  D3D12_RASTERIZER_DESC Desc;
}

Die Runtime bestimmt den Typ eines Pipelinestreams (gültige Typen sind COMPUTE, GRAPHICS und MESH), nach denen der Unterobjekttyp aus VS (Vertex-Shader), CS (Compute-Shader) und MS (Mesh-Shader) gefunden wird. Wenn die Runtime keinen dieser Shader findet, schlägt die Pipelineerstellung fehl. Wenn mehrere dieser Shader gefunden werden, die nicht NULL sind, tritt auch ein Fehler auf. Dies bedeutet, dass es legal ist, sowohl eine CS als auch eine VS in Ihrem Streamobjekt zu haben, vorausgesetzt, dass nur eins über einen Nicht-NULL-Zeiger für den Shaderbytecode für jeden gegebenen Aufruf von ID3D12Device2::CreatePipelineState verfügt. Für die Pipeline irrelevante Unterobjekttypen (z. B. ein Compute-Shader-Unterobjekt in einem Grafikstream) werden ignoriert. Wenn kein Unterobjekt bereitgestellt wird (mit Ausnahme der oben erforderlichen Unterobjekte), stellt die Runtime einen Standardwert dafür bereit.

Erwägen Sie, die d3dx12.h Erweiterungen für C++ zu CD3DX12_PIPELINE_STATE_STREAM_RASTERIZERverwenden, die eine Reihe von Hilfsstrukturen für alle Pipelineunterobjekte bereitstellen (z. B. ist die obige Struktur sehr ähnlich wie ). Dieser Header finden Sie unter dem Repository DirectX-Headers auf github.

Anforderungen

Anforderung Wert
Header d3d12.h

Weitere Informationen

Kernstrukturen