> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# D3D12_PIPELINE_STATE_STREAM_DESC

> 描述管线状态流。

描述管线状态流。

## 语法

```cpp theme={null}
typedef struct D3D12_PIPELINE_STATE_STREAM_DESC
{
    SIZE_T SizeInBytes;
    void  pPipelineStateSubobjectStream;
} D3D12_PIPELINE_STATE_STREAM_DESC
```

### 成员

*SizeInBytes*\
类型：SIZE\_T

[SAL](https://learn.microsoft.com/en-us/cpp/code-quality/annotating-function-parameters-and-return-values)：<code>*In*</code>

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

*pPipelineStateSubobjectStream*\
类型：void \*

[SAL](https://learn.microsoft.com/en-us/cpp/code-quality/annotating-function-parameters-and-return-values)：<code>*In\_reads*(*Inexpressible*("Dependentonsizeofsubobjects"))</code>

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

## 备注

使用此结构与 **[ID3D12Device2::CreatePipelineState](/reference/graphics/d3d12/interfaces/id3d12device2/methods/id3d12device2_createpipelinestate_public)** 方法一起创建管线状态对象。

所提供的流的格式应包含交替的 **[D3D12\_PIPELINE\_STATE\_SUBOBJECT\_TYPE](/reference/graphics/d3d12_x/enums/d3d12_pipeline_state_subobject_type)** 集合以及对应的子对象类型（例如，**D3D12\_PIPELINE\_STATE\_SUBOBJECT\_TYPE\_RASTERIZER** 与 **[D3D12\_RASTERIZER\_DESC](/reference/graphics/d3d12/structs/d3d12_rasterizer_desc_public)** 配对）。在对齐方面，D3D12 运行时期望子对象为枚举-结构体的单独结构对，而不是连续的字段集。它还期望它们对齐到系统的自然字对齐。这可以通过使用 `alignas(void*)`，或将枚举 + 子对象与 `void*` 组成 `union` 来实现。

<Info>
  仅将 **D3D12\_PIPELINE\_STATE\_SUBOBJECT\_TYPE** 与 **void\*** 联合是不够的，因为这将导致某些子对象未对齐。例如，**D3D12\_PIPELINE\_STATE\_SUBOBJECT\_TYPE\_PRIMITIVE\_TOPOLOGY** 后跟一个 **[D3D12\_PRIMITIVE\_TOPOLOGY\_TYPE](/reference/graphics/d3d12_x/enums/d3d12_primitive_topology_type)** 枚举。如果子对象类型与 **void\*** 联合，则这两个成员之间将有额外的填充，导致流损坏。因此，当 `alignas` 不可用时，应将整个子对象结构与 **void\*** 联合。
</Info>

以下是可用于 **[D3D12\_RASTERIZER\_DESC](/reference/graphics/d3d12/structs/d3d12_rasterizer_desc_public)** 的合适子对象示例：

```cpp theme={null}
struct alignas(void*) StreamingRasterizerDesc
{
private:
D3D12_PIPELINE_STATE_SUBOBJECT_TYPE Type = D3D12_PIPELINE_STATE_SUBOBJECT_TYPE_RASTERIZER;
public:
D3D12_RASTERIZER_DESC Desc;
}
```

运行时将根据找到的是 **VS**（顶点着色器）、**CS**（计算着色器）还是 **MS**（网格着色器）子对象类型来确定管线流的类型（有效类型为 **COMPUTE**、**GRAPHICS** 和 **MESH**）。如果运行时未找到这些着色器中的任何一个，则管线创建将失败。如果它找到多个非空的这些着色器，也将失败。这意味着在流对象中同时拥有 **CS** 和 **VS** 等是合法的，只要在任何给定的对 **[ID3D12Device2::CreatePipelineState](/reference/graphics/d3d12/interfaces/id3d12device2/methods/id3d12device2_createpipelinestate_public)** 的调用中，只有一个具有非空的着色器字节码指针。
与管线无关的子对象类型（例如图形流中的计算着色器子对象）将被忽略。
如果未提供子对象（不包括上述必需的子对象），运行时将为其提供默认值。

考虑使用 C++ 的 `d3dx12.h` 扩展，它为所有管线子对象提供了一组辅助结构（例如，上面的结构与 `CD3DX12_PIPELINE_STATE_STREAM_RASTERIZER` 非常相似）。此头文件可在 github 上的 **[DirectX-Headers](https://github.com/microsoft/DirectX-Headers/blob/main/include/directx/d3dx12.h)** 仓库中找到。

### -runtime-validation

运行时将验证 PSO desc 是计算、网格或图形管线，所有子对象都是可识别的类型，并且没有重复的子对象。

<Note>
  出于识别重复子对象的目的，某些子对象被视为其他子对象的"派生"版本。例如，如果运行时发现一个 **[D3D12\_DEPTH\_STENCIL\_DESC](/reference/graphics/d3d12/structs/d3d12_depth_stencil_desc_public)** 子对象，然后又发现一个 **[D3D12\_DEPTH\_STENCIL\_DESC1](/reference/graphics/d3d12/structs/d3d12_depth_stencil_desc1_public)**，它将认为这些是重复的子对象并失败。
</Note>

## 要求

**头文件：** d3d12\_xs.h 或 d3d12\_x.h\
**库：** d3d12\_xs.lib 或 d3d12\_x.lib\
**支持的平台**：XBOX Series 主机和 XBOX One 系列

## 另请参阅

[Core Structures](https://learn.microsoft.com/en-us/windows/win32/direct3d12/direct3d-12-structures)


## Related topics

- [LoadPipeline](/zh-CN/reference/graphics/d3d12/interfaces/id3d12pipelinelibrary1/methods/id3d12pipelinelibrary1_loadpipeline_public.md)
- [D3D12_STREAM_OUTPUT_DESC](/zh-CN/reference/graphics/d3d12/structs/d3d12_stream_output_desc_public.md)
- [D3D12_COMPUTE_PIPELINE_STATE_DESC](/zh-CN/reference/graphics/d3d12/structs/d3d12_compute_pipeline_state_desc_public.md)
- [D3D12_CACHED_PIPELINE_STATE](/zh-CN/reference/graphics/d3d12/structs/d3d12_cached_pipeline_state_public.md)
- [D3D12_INPUT_LAYOUT_DESC](/zh-CN/reference/graphics/d3d12/structs/d3d12_input_layout_desc_public.md)
