diff --git a/RHI_Design_Issues.md b/RHI_Design_Issues.md index 8aa82bc2..4aab683f 100644 --- a/RHI_Design_Issues.md +++ b/RHI_Design_Issues.md @@ -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 抽象 | 🟡 中 | 中 | ❌ 未完成 | ---