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

This commit is contained in:
2026-03-17 18:01:55 +08:00
parent 4638539f17
commit 55865a0252
6 changed files with 454 additions and 34 deletions

View File

@@ -760,6 +760,84 @@ public:
- 解决GetNativeHandle() 返回 void*
### 5.12 命令列表RHICommandList抽象设计
#### 5.12.1 设计理念对应
| 差异点 | 设计理念 | 处理方案 |
|--------|---------|---------|
| 资源状态转换 | 特性降级 | D3D12 实现转换OpenGL 空实现 |
| 绑定方式 | 求同存异 | 统一接口,后端各自实现 |
| 渲染目标 | 求同存异 | 统一接口,后端各自实现 |
#### 5.12.2 现有实现对比
| 功能 | D3D12CommandList | OpenGLCommandList | 处理方案 |
|------|-------------------|-------------------|----------|
| 资源转换 | TransitionBarrier | glBarrier | 统一 TransitionBarrier |
| PSO 设置 | SetPipelineState | UseShader | 统一 SetPipelineState |
| 视口/裁剪 | SetViewport/ScissorRect | SetViewport/Scissor | 统一 |
| 顶点缓冲 | SetVertexBuffer | BindVertexArray | 统一 |
| 索引缓冲 | SetIndexBuffer | BindVertexArray | 统一 |
| 绘制 | Draw/DrawIndexed | Draw/DrawIndexed | 统一 |
| 渲染目标 | SetRenderTargets | glBindFramebuffer | 统一 |
| 清除 | ClearRenderTargetView | Clear | 统一 |
| 复制 | CopyResource | CopyImageSubData | 统一 |
| 计算 | Dispatch | DispatchCompute | 统一 |
#### 5.12.3 抽象接口定义
```cpp
class RHICommandList {
public:
virtual ~RHICommandList() = default;
virtual void Shutdown() = 0;
virtual void Reset() = 0;
virtual void Close() = 0;
virtual void TransitionBarrier(void* resource, ResourceStates stateBefore, ResourceStates stateAfter) = 0;
virtual void SetPipelineState(void* pso) = 0;
virtual void SetViewport(const Viewport& viewport) = 0;
virtual void SetScissorRect(const Rect& rect) = 0;
virtual void SetRenderTargets(uint32_t count, void** renderTargets, void* depthStencil = nullptr) = 0;
virtual void SetVertexBuffer(uint32_t slot, void* buffer, uint64_t offset, uint32_t stride) = 0;
virtual void SetIndexBuffer(void* buffer, uint64_t offset, Format format) = 0;
virtual void Draw(uint32_t vertexCount, uint32_t instanceCount = 1, uint32_t startVertex = 0, uint32_t startInstance = 0) = 0;
virtual void DrawIndexed(uint32_t indexCount, uint32_t instanceCount = 1, uint32_t startIndex = 0, int32_t baseVertex = 0, uint32_t startInstance = 0) = 0;
virtual void Clear(float r, float g, float b, float a, uint32_t buffers) = 0;
virtual void ClearRenderTarget(void* renderTarget, const float color[4]) = 0;
virtual void ClearDepthStencil(void* depthStencil, float depth, uint8_t stencil) = 0;
virtual void CopyResource(void* dst, void* src) = 0;
virtual void Dispatch(uint32_t x, uint32_t y, uint32_t z) = 0;
};
```
#### 5.12.4 差异处理策略
1. **资源状态转换(特性降级)**
- D3D12显式 TransitionBarrier 管理资源状态
- OpenGL无资源状态概念
- 解决D3D12 实现转换OpenGL 空实现
2. **绑定方式(求同存异)**
- D3D12通过 DescriptorHeap 和 RootSignature
- OpenGL通过 glBind* 和 VAO
- 解决:统一 Set* 接口,后端各自实现
3. **渲染目标(求同存异)**
- D3D12SetRenderTargets 设置渲染目标视图
- OpenGLglBindFramebuffer 绑定帧缓冲
- 解决:统一 SetRenderTargets 接口
## 6. 后端实现示例
### 6.1 D3D12 设备实现D3D12Device.h
```cpp