docs: Update RHI_Design_Issues.md with completed items status
This commit is contained in:
@@ -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 里用 Framebuffer,Framebuffer 内部包含 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;
|
||||
```
|
||||
|
||||
资源状态转换是针对 **Resource(Buffer/Texture 本身)** 的,不是针对 View 的。一张 Texture 可能创建多个 View(SRV、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 抽象 | 🟡 中 | 中 | ❌ 未完成 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user