Skip to main content
描述管线状态流。

语法

成员

SizeInBytes
类型:SIZE_T
SALIn 指定 pPipelineStateSubobjectStream 成员所指向的不透明数据结构的大小(以字节为单位)。 pPipelineStateSubobjectStream
类型:void *
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* 联合,则这两个成员之间将有额外的填充,导致流损坏。因此,当 alignas 不可用时,应将整个子对象结构与 void* 联合。
以下是可用于 D3D12_RASTERIZER_DESC 的合适子对象示例:
运行时将根据找到的是 VS(顶点着色器)、CS(计算着色器)还是 MS(网格着色器)子对象类型来确定管线流的类型(有效类型为 COMPUTEGRAPHICSMESH)。如果运行时未找到这些着色器中的任何一个,则管线创建将失败。如果它找到多个非空的这些着色器,也将失败。这意味着在流对象中同时拥有 CSVS 等是合法的,只要在任何给定的对 ID3D12Device2::CreatePipelineState 的调用中,只有一个具有非空的着色器字节码指针。 与管线无关的子对象类型(例如图形流中的计算着色器子对象)将被忽略。 如果未提供子对象(不包括上述必需的子对象),运行时将为其提供默认值。 考虑使用 C++ 的 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 系列

另请参阅

Core Structures
最后修改于 2026年8月24日