feat(RHI): 实现 RHIPipelineState 抽象基类

This commit is contained in:
2026-03-17 18:09:34 +08:00
parent 354b6a5cfc
commit 20445999fc
6 changed files with 124 additions and 7 deletions

View File

@@ -896,6 +896,60 @@ public:
- 解决:统一 Present(syncInterval, flags)
### 5.14 管线状态RHIPipelineState抽象设计
#### 5.14.1 设计理念对应
| 差异点 | 设计理念 | 处理方案 |
|--------|---------|---------|
| 初始化差异 | 求同存异 | 后端各自处理 |
| 状态管理差异 | 特性降级 | D3D12 实现状态块OpenGL 分离状态 |
| 绑定方式差异 | 求同存异 | 统一 Bind 接口 |
#### 5.14.2 现有实现对比
| 功能 | D3D12PipelineState | OpenGLPipelineState | 处理方案 |
|------|-------------------|-------------------|----------|
| 初始化 | device + desc | 构造函数 | 后端各自处理 |
| 状态设置 | 单一 PSO 对象 | 分离状态对象 | 后端各自处理 |
| 绑定 | CommandList->SetPipelineState | AttachShader/Apply | 统一 Bind |
| 句柄 | ID3D12PipelineState* | GLuint (program) | 统一 void* |
#### 5.14.3 抽象接口定义
```cpp
class RHIPipelineState {
public:
virtual ~RHIPipelineState() = default;
virtual void Shutdown() = 0;
virtual void Bind() = 0;
virtual void Unbind() = 0;
virtual void* GetNativeHandle() = 0;
virtual PipelineType GetType() const = 0;
};
```
#### 5.14.4 差异处理策略
1. **初始化差异(求同存异)**
- D3D12device + D3D12_GRAPHICS_PIPELINE_STATE_DESC
- OpenGL通过 SetDepthStencilState/BlendState/RasterizerState
- 解决Device 的 CreatePipelineState() 统一接收 PipelineStateDesc
2. **状态管理差异(特性降级)**
- D3D12单一 PSO 对象包含所有状态
- OpenGL分离的状态对象
- 解决:后端各自实现,基类提供统一 Bind/Unbind
3. **绑定方式差异(求同存异)**
- D3D12通过 CommandList->SetPipelineState
- OpenGLAttachShader + Apply
- 解决:统一 Bind/Unbind 接口
## 6. 后端实现示例
### 6.1 D3D12 设备实现D3D12Device.h
```cpp