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

109 lines
4.3 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`
**描述**: 图形/计算管线状态的跨后端抽象,负责收敛固定功能状态、着色器与目标格式,并向具体后端暴露统一的配置接口。
## 角色概述
`RHIPipelineState` 对应的是“上层渲染系统描述管线状态”的统一入口。它不是简单照抄某个 native API 的 PSO 结构,而是把输入布局、光栅化、混合、深度模板、拓扑、目标格式、多重采样信息以及计算着色器统一收敛到一套接口上。
这是一种典型的商业引擎设计思路:
- 渲染器先在统一描述层组织状态。
- 具体后端再决定这些状态是立即创建 native PSO、延迟编译还是只作为运行时状态缓存。
## 当前状态模型
### 图形路径
- [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)
其中 `SetSampleCount``SetSampleQuality` 共同表达多重采样配置,目的是让 `GraphicsPipelineDesc` 的采样参数可以完整下传到后端,而不是让上层在描述层就为不同图形 API 分叉。
## 为什么要有 SetSampleQuality
`sampleQuality` 在显式图形 API 中并不是完全对等的概念:
- D3D12 会直接把它映射到 `DXGI_SAMPLE_DESC::Quality`
- Vulkan 当前实现只消费 sample count不消费 quality
- OpenGL 当前实现也没有把 quality 落到真实状态
但抽象层仍然保留这个接口,原因很明确:
- 上层 `GraphicsPipelineDesc` 可以保持完整
- 后端可以渐进式演进,不必修改渲染器对外契约
- 文档能够明确告诉使用者“这个字段在不同后端的成熟度不同”
这比“为了照顾当前最弱后端,直接把接口删掉”更符合商业级引擎的长期演进方式。
## 后端语义差异
- `D3D12PipelineState` 会真正存储 sample quality并让它进入 PSO 创建与 hash。
- `VulkanPipelineState` 暂时把 quality 视为兼容字段,当前实现忽略其值。
- `OpenGLPipelineState` 当前同样把它作为占位契约处理。
因此 `RHIPipelineState` 的接口是稳定的,但“字段被消费的深度”仍然是后端相关事实,文档必须把这一点写清楚。
## 生命周期与有效性
`RHIPipelineState` 的“有效”并不保证在所有后端都等价于“native pipeline 已经创建完成”:
- 有的后端在初始化时就固化 native 对象。
- 有的后端在 `EnsureValid()` 时才推进到真正可绑定状态。
- 还有的后端只是把状态缓存起来,绑定时再逐步写回。
这也是为什么文档不能把所有实现都粗暴描述成“标准 PSO”。
## 公开方法
- [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)
- [RHIDevice](../RHIDevice/RHIDevice.md)
- [RHIPipelineLayout](../RHIPipelineLayout/RHIPipelineLayout.md)
- [RHIShader](../RHIShader/RHIShader.md)
- [D3D12PipelineState](../D3D12/D3D12PipelineState/D3D12PipelineState.md)
- [OpenGLPipelineState](../OpenGL/OpenGLPipelineState/OpenGLPipelineState.md)
- [VulkanPipelineState](../Vulkan/VulkanPipelineState/VulkanPipelineState.md)
- [API 总索引](../../../main.md)