Files
XCEngine/docs/api/XCEngine/RHI/RHIPipelineState/RHIPipelineState.md

139 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# RHIPipelineState
**命名空间**: `XCEngine::RHI`
**类型**: `class (abstract)`
**头文件**: `XCEngine/RHI/RHIPipelineState.h`
**描述**: 抽象图形/计算管线状态对象负责聚合输入布局、光栅化、混合、深度模板、render target 格式以及可选计算 shader。
## 角色概述
`RHIPipelineState` 对应的是当前抽象层里的“可绑定管线状态包”。它的接口明显带有“统一图形状态描述”的设计意图,而不是简单把某个后端的 native PSO 结构原样暴露出去。
头文件注释里直接写了:
- `Unity SRP style`
- `Shader independent of PSO`
这说明当前设计方向是希望用一套更统一的 pipeline 状态模型去支撑不同后端,而不是要求所有状态都只通过 shader 或 native API 自己的配置路径表达。
## 当前状态模型
`RHIPipelineState` 当前主要包含两类信息:
### 图形状态
- [SetInputLayout](SetInputLayout.md)
- [SetRasterizerState](SetRasterizerState.md)
- [SetBlendState](SetBlendState.md)
- [SetDepthStencilState](SetDepthStencilState.md)
- [SetTopology](SetTopology.md)
- [SetRenderTargetFormats](SetRenderTargetFormats.md)
- [SetSampleCount](SetSampleCount.md)
- [SetSampleQuality](SetSampleQuality.md)
### 计算路径
- [SetComputeShader](SetComputeShader.md)
也就是说,当前同一个抽象接口既能表达 graphics pipeline也能表达 compute pipeline。
## 类型与有效性
这是这页最值得说明的地方。
### `GetType()`
从现有测试看:
- 默认创建出来的 pipeline state 类型是 `PipelineType::Graphics`
- 当设置了 compute shader 后,类型可以变成 `PipelineType::Compute`
### `IsValid()` / `EnsureValid()`
现有测试明确揭示了一个很重要的后端差异:
- 在 D3D12 下,默认或信息不足的 pipeline state 往往不是立即有效的。
- 在 OpenGL 路径下,默认 pipeline state 更容易被视为有效。
头文件注释甚至直接写出了当前统一语义:
- `D3D12` 需要编译
- `OpenGL` 总是有效
这意味着 `RHIPipelineState` 的“有效”不是完全抽象无差异的概念而是和后端实现成熟度、native API 要求直接相关。
## 设计理解
从商用引擎经验看,这样的 pipeline state 抽象是合理的:
- renderer 可以先在统一描述层拼好状态,再交给后端去编译或绑定
- 输入布局、混合、深度模板和 render target 格式等关键状态有明确归属
- 计算路径可以与图形路径复用一部分生命周期和绑定逻辑
但当前实现也有现实边界:
- 还保留了 `RHICommandList::SetShader()` 这种并行路径,所以整个系统并不是“只有 PSO”这一种绑定范式
- `GraphicsPipelineDesc``RHIPipelineState` 的关系更偏工程实现上的状态收敛,而不是已经完全封装成单一材质系统
- 有效性判定明显依赖后端
## 测试体现出的真实使用方式
`tests/RHI/unit/test_pipeline_state.cpp``test_compute.cpp` 给出了当前比较可信的使用路径:
- 可以先创建默认 `GraphicsPipelineDesc` 再逐步设置状态
- 可以读回 `RasterizerDesc``BlendDesc``DepthStencilStateDesc``InputLayoutDesc`
- 可以为 graphics pipeline 直接在 `GraphicsPipelineDesc` 里提供 vertex / fragment shader
- 可以用 `SetComputeShader()` 走 compute 路径
- 在部分后端下 `EnsureValid()` 会触发或推进有效性检查,但并不保证无条件成功
这说明当前 pipeline state 的职责更像“后端可消费的统一状态对象”,而不是文档层面随便说说的概念壳子。
## 生命周期
当前接口提供:
- [Bind](Bind.md)
- [Unbind](Unbind.md)
- [Shutdown](Shutdown.md)
- [GetNativeHandle](GetNativeHandle.md)
通常它由 [RHIDevice](../RHIDevice/RHIDevice.md) 创建,并以裸指针形式返回。使用完成后应显式 `Shutdown()``delete`
## 公共方法
- [SetInputLayout](SetInputLayout.md)
- [SetRasterizerState](SetRasterizerState.md)
- [SetBlendState](SetBlendState.md)
- [SetDepthStencilState](SetDepthStencilState.md)
- [SetTopology](SetTopology.md)
- [SetRenderTargetFormats](SetRenderTargetFormats.md)
- [SetSampleCount](SetSampleCount.md)
- [SetSampleQuality](SetSampleQuality.md)
- [SetComputeShader](SetComputeShader.md)
- [GetRasterizerState](GetRasterizerState.md)
- [GetBlendState](GetBlendState.md)
- [GetDepthStencilState](GetDepthStencilState.md)
- [GetInputLayout](GetInputLayout.md)
- [GetHash](GetHash.md)
- [GetComputeShader](GetComputeShader.md)
- [HasComputeShader](HasComputeShader.md)
- [IsValid](IsValid.md)
- [EnsureValid](EnsureValid.md)
- [Shutdown](Shutdown.md)
- [Bind](Bind.md)
- [Unbind](Unbind.md)
- [GetNativeHandle](GetNativeHandle.md)
- [GetType](GetType.md)
## 相关文档
- [当前模块](../RHI.md)
- [RHITypes](../RHITypes/RHITypes.md)
- [RHICommandList](../RHICommandList/RHICommandList.md)
- [RHIPipelineLayout](../RHIPipelineLayout/RHIPipelineLayout.md)
- [RHIShader](../RHIShader/RHIShader.md)
- [API 总索引](../../../main.md)