構文
メンバー
SizeInBytes型: SIZE_T SAL:
In
pPipelineStateSubobjectStream メンバーが指す不透明なデータ構造のサイズをバイト単位で指定します。
pPipelineStateSubobjectStream型: void * SAL:
In_reads(Inexpressible(“Dependentonsizeofsubobjects”))
任意のパイプライン状態サブオブジェクトをバイト ストリームとして記述するデータ構造のアドレスを指定します。
解説
この構造体を ID3D12Device2::CreatePipelineState メソッドで使用して、パイプライン状態オブジェクトを作成します。 指定するストリームの形式は、D3D12_PIPELINE_STATE_SUBOBJECT_TYPE とそれに対応するサブオブジェクト型の交互のセットで構成する必要があります (たとえば、D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER は D3D12_RASTERIZER_DESC と対になります)。アラインメントに関して、D3D12 ランタイムは、サブオブジェクトが連続したフィールドのセットではなく、enum と構造体の個々のペア構造体であることを期待しています。また、システムの自然なワード アラインメントに揃えられることも期待しています。これは、alignas(void*) を使用するか、enum + サブオブジェクトと void* の union を作成することで実現できます。
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE を単純に void* と共用体にするだけでは不十分です。これは特定のサブオブジェクトのアラインメントが正しくなくなるためです。たとえば、D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY の後には D3D12_PRIMITIVE_TOPOLOGY_TYPE enum が続きます。サブオブジェクト型が void* と共用体になっている場合、この 2 つのメンバー間に追加のパディングが生じ、ストリームの破損につながります。このため、
alignas が利用できない場合は、サブオブジェクト構造体全体を void* と共用体にする必要がありますd3dx12.h 拡張機能の使用を検討してください。これはすべてのパイプライン サブオブジェクトに対する一連のヘルパー構造体を提供します (たとえば、上記の構造体は CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER に非常によく似ています)。このヘッダーは github の DirectX-Headers リポジトリにあります。
-runtime-validation
ランタイムは、PSO desc がコンピュート、メッシュ、またはグラフィックス パイプラインのいずれかであること、すべてのサブオブジェクトが認識される型であること、およびサブオブジェクトが重複していないことを検証します。一部のサブオブジェクトは、重複したサブオブジェクトを認識するために、他のサブオブジェクトの “派生” バージョンと見なされます。たとえば、ランタイムが D3D12_DEPTH_STENCIL_DESC サブオブジェクトを検出し、その後 D3D12_DEPTH_STENCIL_DESC1 を検出した場合、これらは重複したサブオブジェクトと見なされ失敗します。
要件
ヘッダー: d3d12_xs.h または d3d12_x.hライブラリ: d3d12_xs.lib または d3d12_x.lib
サポートされるプラットフォーム: XBOX Series 本体および XBOX One ファミリ
