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

This commit is contained in:
2026-03-17 18:05:40 +08:00
parent 55865a0252
commit 354b6a5cfc
6 changed files with 163 additions and 17 deletions

View File

@@ -838,6 +838,64 @@ public:
- 解决:统一 SetRenderTargets 接口
### 5.13 交换链RHISwapChain抽象设计
#### 5.13.1 设计理念对应
| 差异点 | 设计理念 | 处理方案 |
|--------|---------|---------|
| 初始化参数差异 | 求同存异 | 统一 Desc后端各自处理 |
| 窗口管理差异 | 特性降级 | OpenGL 有D3D12 无 |
| 呈现方式差异 | 求同存异 | 统一 Present 接口 |
#### 5.13.2 现有实现对比
| 功能 | D3D12SwapChain | OpenGLSwapChain | 处理方案 |
|------|----------------|------------------|----------|
| 初始化 | factory/queue/hwnd | window | 统一 Initialize(Desc) |
| 后缓冲 | GetBackBuffer() | 无 | 通过 GetCurrentBackBuffer |
| 显示 | Present(sync, flags) | Present() | 统一 Present() |
| 调整大小 | Resize(w, h) | Resize(w, h) | 统一 |
| 窗口事件 | 无 | ShouldClose/PollEvents | OpenGL 实现 |
#### 5.13.3 抽象接口定义
```cpp
class RHISwapChain {
public:
virtual ~RHISwapChain() = default;
virtual void Shutdown() = 0;
virtual uint32_t GetCurrentBackBufferIndex() const = 0;
virtual RHITexture* GetCurrentBackBuffer() = 0;
virtual void Present(uint32_t syncInterval = 1, uint32_t flags = 0) = 0;
virtual void Resize(uint32_t width, uint32_t height) = 0;
virtual bool ShouldClose() const = 0;
virtual void SetShouldClose(bool shouldClose) = 0;
virtual void PollEvents() = 0;
};
```
#### 5.13.4 差异处理策略
1. **初始化参数差异(求同存异)**
- D3D12factory + commandQueue + hwnd
- OpenGLwindow
- 解决Device 的 CreateSwapChain() 统一接收 SwapChainDesc
2. **窗口管理差异(特性降级)**
- OpenGLShouldClose/PollEvents
- D3D12
- 解决OpenGL 实现具体功能D3D12 空实现
3. **呈现方式差异(求同存异)**
- D3D12Present(syncInterval, flags)
- OpenGLPresent() / SwapBuffers()
- 解决:统一 Present(syncInterval, flags)
## 6. 后端实现示例
### 6.1 D3D12 设备实现D3D12Device.h
```cpp