structure D3D12_PIPELINE_STATE_STREAM_DESC (d3d12.h)
Décrit un flux d’état de pipeline.
Syntaxe
typedef struct D3D12_PIPELINE_STATE_STREAM_DESC {
SIZE_T SizeInBytes;
void *pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC;
Membres
SizeInBytes
SAL : In
Spécifie la taille de la structure de données opaque pointée par le membre pPipelineStateSubobjectStream, en octets.
pPipelineStateSubobjectStream
SAL : In_reads(Inexpressible("Dependentonsizeofsubobjects"))
Spécifie l’adresse d’une structure de données qui décrit comme un bytestream un sous-objet d’état de pipeline arbitraire.
Remarques
Utilisez cette structure avec la méthode ID3D12Device2 ::CreatePipelineState pour créer des objets d’état de pipeline.
Le format du flux fourni doit se composer d’un ensemble alterné de D3D12_PIPELINE_STATE_SUBOBJECT_TYPE et des types de sous-objets correspondants (par exemple, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER paires avec D3D12_RASTERIZER_DESC. En termes d’alignement, le runtime D3D12 s’attend à ce que les sous-objets soient des paires de struct individuelles d’enum-struct, plutôt qu’un ensemble continu de champs. Il s’attend également à ce qu’ils soient alignés sur l’alignement naturel des mots du système. Cela peut être réalisé à l’aide alignas(void*)
de , ou de la création d’un union
du sous-objet enum + et d’un void*
.
Important
Il ne suffit pas d’associer simplement le D3D12_PIPELINE_STATE_SUBOBJECT_TYPE à un vide*, car cela entraîne une mauvaise alignement de certains sous-objectifs.
Par exemple, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY est suivi d’une énumération D3D12_PRIMITIVE_TOPOLOGY_TYPE . Si le type de sous-objet est associé à un objet void*, il y aura un remplissage supplémentaire entre ces 2 membres, ce qui entraîne une altération du flux.
Pour cette raison, vous devez associer l’ensemble du struct de sous-objet à un objet void*, lorsque n’est alignas
pas disponible
Voici un exemple de sous-objet approprié à utiliser avec D3D12_RASTERIZER_DESC :
struct alignas(void*) StreamingRasterizerDesc
{
private:
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE Type = D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER;
public:
D3D12_RASTERIZER_DESC Desc;
}
Le runtime détermine le type d’un flux de pipeline (les types validesétant COMPUTE, GRAPHICS et MESH), par lequel le type de sous-objet, en dehors de VS (nuanceur de vertex), CS (nuanceur de calcul) et MS (nuanceur de maillage), est trouvé. Si le runtime ne trouve aucun de ces nuanceurs, la création du pipeline échoue. S’il trouve plusieurs de ces nuanceurs qui ne sont pas null, il échouera également. Cela signifie qu’il est légal d’avoir à la fois, par exemple, un CS et un VS dans votre objet de flux, à condition qu’un seul ait un pointeur non null pour le bytecode du nuanceur pour un appel donné à ID3D12Device2 ::CreatePipelineState. Les types de sous-objets non pertinents pour le pipeline (par exemple, un sous-objet de nuanceur de calcul dans un flux graphique) sont ignorés. Si un sous-objet n’est pas fourni (à l’exception des sous-objets requis ci-dessus), le runtime lui fournit une valeur par défaut.
Envisagez d’utiliser les d3dx12.h
extensions pour C++, qui fournissent un ensemble de structs d’assistance pour tous les sous-objets de pipeline (par exemple, le struct ci-dessus est très similaire à CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER
). Cet en-tête se trouve sous le référentiel DirectX-Headers sur github.
Configuration requise
Condition requise | Valeur |
---|---|
En-tête | d3d12.h |