D3D12_PIPELINE_STATE_STREAM_DESC 結構 (d3d12.h)
描述管線狀態數據流。
語法
typedef struct D3D12_PIPELINE_STATE_STREAM_DESC {
SIZE_T SizeInBytes;
void *pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC;
成員
SizeInBytes
SAL: In
指定 pPipelineStateSubobjectStream 成員所指向之不透明數據結構的大小,以位元組為單位。
pPipelineStateSubobjectStream
SAL: In_reads(Inexpressible("Dependentonsizeofsubobjects"))
指定描述為任意管線狀態子物件之位元組數據流的數據結構位址。
備註
使用這個結構搭配 ID3D12Device2::CreatePipelineState 方法來建立管線狀態物件。
提供的數據流格式應該包含一組替代 的D3D12_PIPELINE_STATE_SUBOBJECT_TYPE,以及 (它們對應的子物件類型,例如 ,D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER 與 D3D12_RASTERIZER_DESC配對。 就對齊方式而言,D3D12 運行時間預期子對象必須是列舉結構組的個別結構組,而不是連續的一組字段。 它也預期它們會對齊系統的自然文字對齊方式。 這可以使用 來達成 alignas(void*)
,或建立 union
列舉 + 子物件和 void*
。
重要
它不足以直接將 D3D12_PIPELINE_STATE_SUBOBJECT_TYPE 與 void* 聯集,因為這會導致某些子對象不對齊。
例如, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_PRIMITIVE_TOPOLOGY 後面接著 D3D12_PRIMITIVE_TOPOLOGY_TYPE 列舉。 如果子物件類型與 void* 聯集,則這 2 個成員之間會有額外的填補,導致數據流損毀。
因此,當無法使用時alignas
,您應該將整個子對象結構與 void*聯集
以下顯示適合用於 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;
}
運行時間會決定管線數據流的類型, (有效的類型為 COMPUTE、 GRAPHICS 和 MESH) ,其子物件類型、 VS (頂點著色器) 、 CS (計算著色器) ,以及找到 MS (網狀著色器) 。 如果運行時間找不到這些著色器,則會失敗建立管線。 如果找到多個不是 Null 的著色器,它也會失敗。 這表示在串流對象中同時擁有 CS 和 VS 是合法的,前提是只有一個具有 ID3D12Device2::CreatePipelineState 之指定呼叫之著色器位元組碼的非 Null 指標。 與管線無關的子物件類型 (例如,將會忽略圖形數據流中的計算著色器子物件) 。 如果未提供子物件 (排除上述必要子物件) ,運行時間會為其提供預設值。
請考慮使用 d3dx12.h
C++ 的延伸模組,其為所有管線子物件提供一組協助程序結構 (,例如,上述結構非常類似 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER
) 。 您可以在 github 上的 DirectX-Headers 存放庫下找到此標頭。
規格需求
需求 | 值 |
---|---|
標頭 | d3d12.h |