docs: Update RHI_Design_Issues.md with completed items status

This commit is contained in:
2026-03-25 00:00:36 +08:00
parent 5eb731bc2d
commit c5c43ae7aa

View File

@@ -111,6 +111,45 @@ virtual void EndRenderPass() = 0;
// 移除或废弃 ClearRenderTarget改为 BeginRenderPass 的 LoadOp
```
### 3.2.1 ✅ 已完成:显式 RenderPass 实现
**实现状态**2026-03-24 已完成
**新增抽象**
| 类名 | 说明 |
|------|------|
| `RHIFramebuffer` | Framebuffer 基类,含 Initialize/Bind/GetHandle |
| `RHIRenderPass` | RenderPass 基类,含 AttachmentDesc |
| `D3D12Framebuffer` | D3D12 Framebuffer 实现 |
| `D3D12RenderPass` | D3D12 RenderPass 实现(使用 OMSetRenderTargets |
| `OpenGLFramebuffer` | OpenGL 实现(继承自 RHIFramebuffer |
| `OpenGLRenderPass` | OpenGL RenderPass 实现 |
**RHICommandList 新增接口**
```cpp
virtual void BeginRenderPass(RHIRenderPass* renderPass, RHIFramebuffer* framebuffer,
const Rect& renderArea, uint32_t clearValueCount,
const ClearValue* clearValues) = 0;
virtual void EndRenderPass() = 0;
```
**AttachmentDesc 结构**(定义在 RHIRenderPass.h
```cpp
struct AttachmentDesc {
Format format = Format::Unknown;
LoadAction loadOp = LoadAction::Undefined; // Undefined/Load/Clear
StoreAction storeOp = StoreAction::Store; // Store/Resolve/Discard
LoadAction stencilLoadOp = LoadAction::Undefined;
StoreAction stencilStoreOp = StoreAction::Undefined;
ClearValue clearValue;
};
```
**实现说明**
- D3D12使用 `OMSetRenderTargets` + `ClearRenderTargetView`/`ClearDepthStencilView`
- OpenGL使用 `glBindFramebuffer` + `glClearBufferfv` 处理 LoadOp
- 旧的 `SetRenderTargets`/`ClearRenderTarget` 仍保留,向后兼容
---
### 3.3 动态状态太多,应该收敛到 PipelineState
@@ -162,7 +201,7 @@ virtual void SetPrimitiveTopology(PrimitiveTopology topology) = 0; // 移到 PS
---
### 3.4 ResourceView 类型不明确
### 3.4 ResourceView 类型不明确 ✅ 基本完成
**问题描述**:当前用 `RHIResourceView*` 代表所有视图:
@@ -196,26 +235,40 @@ class RHIIndexBufferView : public RHIResourceView {};
class RHIConstantBufferView : public RHIResourceView {};
```
```cpp
// 修改 CommandList 接口
virtual void SetVertexBuffers(
uint32_t startSlot,
uint32_t count,
RHIVertexBufferView** buffers,
const uint64_t* offsets,
const uint32_t* strides) = 0;
virtual void SetIndexBuffer(
RHIIndexBufferView* buffer,
uint64_t offset,
IndexFormat format) = 0;
// BeginRenderPass 里用 FramebufferFramebuffer 内部包含 RTV/DSV
```
**实现状态**:✅ 基本完成 - `RHIResourceView.h` 中定义了具体视图类型,但 `RHICommandList` 仍使用 `RHIResourceView*` 以保持兼容性
---
### 3.5 TransitionBarrier 针对 View 而非 Resource
### 3.5 TransitionBarrier 针对 View 而非 Resource ✅ 已完成
**问题描述**:当前接口:
```cpp
virtual void TransitionBarrier(RHIResourceView* resource, ResourceStates stateBefore, ResourceStates stateAfter) = 0;
```
资源状态转换是针对 **ResourceBuffer/Texture 本身)** 的,不是针对 View 的。一张 Texture 可能创建多个 ViewSRV、RTV、DSV但状态转换是对整个 Texture 做的。
**根本原因**:没有区分 Resource 和 ResourceView 的概念。
**修改建议**
```cpp
// 新增 Resource 基类
class RHIResource {};
class RHIBuffer : public RHIResource {};
class RHITexture : public RHIResource {};
// 修改 TransitionBarrier
struct ResourceBarrier {
RHIResource* resource;
ResourceStates stateBefore;
ResourceStates stateAfter;
uint32_t subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
};
virtual void ResourceBarrier(uint32_t count, const ResourceBarrier* barriers) = 0;
```
**实现状态**:✅ 已完成 - `RHIResource.h` 已创建,`RHIBuffer``RHITexture` 已继承自 `RHIResource`
**问题描述**:当前接口:
```cpp
@@ -408,16 +461,16 @@ class RHITexture : public RHIResource { ... };
## 7. 问题优先级总结
| 优先级 | 问题 | 严重性 | 修复难度 |
|--------|------|--------|----------|
| 1 | 字符串查找 SetUniform 不符合 D3D12/Vulkan | 🔴 致命 | 高 |
| 2 | 缺少显式 RenderPass | 🔴 致命 | 高 |
| 3 | 动态状态太多 | 🔴 高 | 高 |
| 4 | ResourceView 类型不明确 | 🟡 中 | 中 |
| 5 | TransitionBarrier 针对 View 而非 Resource | 🟡 中 | 中 |
| 6 | SetGlobal* 空操作 | 🟡 中 | 低 |
| 7 | OpenGL 特有方法暴露 | 🟡 中 | 高 |
| 8 | 缺少 Compute Pipeline 抽象 | 🟡 中 | 中 |
| 优先级 | 问题 | 严重性 | 修复难度 | 状态 |
|--------|------|--------|----------|------|
| 1 | 字符串查找 SetUniform 不符合 D3D12/Vulkan | 🔴 致命 | 高 | ❌ 未完成 |
| 2 | 缺少显式 RenderPass | 🔴 致命 | 高 | ✅ 已完成 |
| 3 | 动态状态太多 | 🔴 高 | 高 | ❌ 未完成 |
| 4 | ResourceView 类型不明确 | 🟡 中 | 中 | ✅ 基本完成 |
| 5 | TransitionBarrier 针对 View 而非 Resource | 🟡 中 | 中 | ✅ 已完成 |
| 6 | SetGlobal* 空操作 | 🟡 中 | 低 | ❌ 未完成 |
| 7 | OpenGL 特有方法暴露 | 🟡 中 | 高 | ❌ 未完成 |
| 8 | 缺少 Compute Pipeline 抽象 | 🟡 中 | 中 | ❌ 未完成 |
---