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*)
,也可以使枚举 + 子对象的 和 void*
。union
重要
仅仅将 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 存储库下找到此标头。
要求
要求 | 值 |
---|---|
Header | d3d12.h |