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

SALIn

指定 pPipelineStateSubobjectStream 成员指向的不透明数据结构的大小(以字节为单位)。

pPipelineStateSubobjectStream

SALIn_reads(Inexpressible("Dependentonsizeofsubobjects"))

指定数据结构的地址,该结构将任意管道状态子对象描述为字节流。

注解

将此结构与 ID3D12Device2::CreatePipelineState 方法一起使用,以创建管道状态对象。

提供的流的格式应包含一组交替 的D3D12_PIPELINE_STATE_SUBOBJECT_TYPE, (对应的子对象类型,例如, D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZERD3D12_RASTERIZER_DESC对。 在对齐方面,D3D12 运行时要求子对象是枚举结构的各个结构对,而不是一组连续的字段。 它还希望它们与系统的自然单词对齐方式对齐。 这可以使用 来实现alignas(void*),也可以使枚举 + 子对象的 和 void*union

重要

仅仅将 D3D12_PIPELINE_STATE_SUBOBJECT_TYPEvoid*联合是不够的,因为这将导致某些子对象未对齐。 例如, 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;
}

运行时将确定管道流的类型 (有效类型为 COMPUTEGRAPHICSMESH) ,根据哪个子对象类型、 VS (顶点着色器) 、 CS (计算着色器) ,以及 MS (网格着色器) 。 如果运行时找不到这些着色器,则管道创建将失败。 如果找到多个不为 null 的着色器,它也将失败。 这意味着在流对象中同时具有 CSVS 是合法的,前提是只有一个具有针对 ID3D12Device2::CreatePipelineState 的任何给定调用的着色器字节码的非 null 指针。 与管道 (无关的子对象类型,例如图形流) 中的计算着色器子对象将被忽略。 如果未提供子对象 (排除上述必需的子对象) ,运行时将为它提供默认值。

请考虑使用 d3dx12.h C++ 的扩展,该扩展为所有管道子对象提供一组帮助程序结构 (例如,上述结构非常 CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER 类似于) 。 可以在 github 上的 DirectX-Headers 存储库下找到此标头。

要求

要求
Header d3d12.h

另请参阅

核心结构