feat(RHI): 实现 RHIDevice 抽象基类
This commit is contained in:
@@ -589,7 +589,80 @@ public:
|
||||
- OpenGL:GLsync
|
||||
- 解决: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. **底层设备类型差异(底层逃逸)**
|
||||
- D3D12:ID3D12Device*
|
||||
- OpenGL:无对等概念
|
||||
- 解决:GetNativeDevice() 返回 void*,OpenGL 返回 nullptr 或窗口句柄
|
||||
- **D3D12**:显式 `RootSignature` 定义资源绑定规则
|
||||
- **OpenGL**:隐式通过 `glUniformLocation`、`glBindTextureUnit` 绑定
|
||||
- **解决方案**:
|
||||
|
||||
Reference in New Issue
Block a user