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

This commit is contained in:
2026-03-17 17:45:01 +08:00
parent af718279ff
commit 14fb51e61e
5 changed files with 309 additions and 39 deletions

View File

@@ -589,7 +589,80 @@ public:
- OpenGLGLsync
- 解决GetNativeHandle() 返回 void*
### 5.10 根签名 vs OpenGL 资源绑定
### 5.10 设备RHIDevice抽象设计
#### 5.10.1 设计理念对应
| 差异点 | 设计理念 | 处理方案 |
|--------|---------|---------|
| 初始化参数差异 | 求同存异 | 统一 Initialize 接口,后端各自处理 |
| 工厂方法差异 | 特性降级 | D3D12 实现OpenGL 返回 nullptr |
| 窗口管理差异 | 特性降级 | OpenGL 有D3D12 通过 SwapChain 处理 |
| 适配器枚举差异 | 特性降级 | D3D12 实现OpenGL 空实现 |
| 底层设备类型差异 | 底层逃逸 | 统一返回 void* |
#### 5.10.2 现有实现对比
| 功能 | D3D12Device | OpenGLDevice | 处理方案 |
|------|--------------|---------------|----------|
| 初始化 | Initialize(debugLayer) | CreateRenderWindow/InitializeWithExistingWindow | 统一 Initialize |
| 关闭 | Shutdown() | Shutdown() | 统一 |
| 获取设备 | GetDevice() | 无 | GetNativeHandle 统一 |
| 适配器信息 | GetAdapterInfo() | GetDeviceInfo() | 统一 GetDeviceInfo |
| 工厂方法 | CreateBuffer/Texture/Shader... | 无 | OpenGL 返回 nullptr |
| 窗口管理 | 通过 SwapChain | GetWindow/SwapBuffers/PollEvents | OpenGL 有D3D12 无 |
#### 5.10.3 抽象接口定义
```cpp
class RHIDevice {
public:
virtual ~RHIDevice() = default;
virtual bool Initialize(const RHIDeviceDesc& desc) = 0;
virtual void Shutdown() = 0;
virtual const RHIDeviceInfo& GetDeviceInfo() const = 0;
virtual const RHICapabilities& GetCapabilities() const = 0;
virtual RHIBuffer* CreateBuffer(const BufferDesc& desc) = 0;
virtual RHITexture* CreateTexture(const TextureDesc& desc) = 0;
virtual RHIShader* CompileShader(const ShaderCompileDesc& desc) = 0;
virtual RHISampler* CreateSampler(const SamplerDesc& desc) = 0;
virtual RHIFence* CreateFence(const FenceDesc& desc) = 0;
virtual void* GetNativeDevice() = 0;
virtual void* GetNativeHandle() const = 0;
};
```
#### 5.10.4 差异处理策略
1. **初始化参数差异(求同存异)**
- D3D12`Initialize(enableDebugLayer)`
- OpenGL`CreateRenderWindow` / `InitializeWithExistingWindow`
- 解决:统一 `Initialize(const RHIDeviceDesc& desc)` 接口Desc 中包含窗口参数
2. **工厂方法差异(特性降级)**
- D3D12有完整的工厂方法
- OpenGL资源直接用 glGen* 创建,没有工厂方法
- 解决OpenGL 后端返回 nullptr上层需直接创建 OpenGL 资源
3. **窗口管理差异(特性降级)**
- OpenGL直接管理窗口有 GetWindow/SwapBuffers/PollEvents
- D3D12通过 SwapChain 处理
- 解决OpenGL 提供窗口管理接口D3D12 空实现
4. **适配器枚举差异(特性降级)**
- D3D12支持 EnumerateAdapters
- OpenGL无此概念
- 解决D3D12 实现具体功能OpenGL 返回空
5. **底层设备类型差异(底层逃逸)**
- D3D12ID3D12Device*
- OpenGL无对等概念
- 解决GetNativeDevice() 返回 void*OpenGL 返回 nullptr 或窗口句柄
- **D3D12**:显式 `RootSignature` 定义资源绑定规则
- **OpenGL**:隐式通过 `glUniformLocation`、`glBindTextureUnit` 绑定
- **解决方案**