feat(RHI): 实现 RHICommandList 抽象基类
This commit is contained in:
@@ -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. **渲染目标(求同存异)**
|
||||
- D3D12:SetRenderTargets 设置渲染目标视图
|
||||
- OpenGL:glBindFramebuffer 绑定帧缓冲
|
||||
- 解决:统一 SetRenderTargets 接口
|
||||
|
||||
|
||||
## 6. 后端实现示例
|
||||
### 6.1 D3D12 设备实现(D3D12Device.h)
|
||||
```cpp
|
||||
|
||||
Reference in New Issue
Block a user