diff --git a/RHI_Design_Issues.md b/RHI_Design_Issues.md index 260ffa84..e01d9865 100644 --- a/RHI_Design_Issues.md +++ b/RHI_Design_Issues.md @@ -241,6 +241,36 @@ virtual void SetBlendState(const BlendState& state) = 0; // 移到 PSO virtual void SetPrimitiveTopology(PrimitiveTopology topology) = 0; // 移到 PSO ``` +### 3.3.1 ✅ 已完成:动态状态移至 PSO + +**实现状态**:2026-03-25 已完成 + +**移除的无效方法**: +| 方法 | 问题 | +|------|------| +| `SetDepthStencilState` | D3D12 中是空实现(TODO),调用无效;OpenGL 中直接调用 GL 函数但状态应通过 PSO 配置 | +| `SetBlendState` | D3D12 中只设置 BlendFactor,其他参数被忽略;OpenGL 中直接调用 GL 函数但状态应通过 PSO 配置 | + +**保留的真正动态状态**: +| 方法 | 说明 | +|------|------| +| `SetViewport/SetViewports` | 真正的动态状态 | +| `SetScissorRect/SetScissorRects` | 真正的动态状态 | +| `SetStencilRef` | D3D12 动态状态 | +| `SetBlendFactor` | D3D12 动态状态 | + +**修改的文件**: +- `RHICommandList.h` - 移除 SetDepthStencilState/SetBlendState 纯虚方法 +- `D3D12CommandList.h/cpp` - 移除 SetDepthStencilState/SetBlendState 实现 +- `OpenGLCommandList.h/cpp` - 移除 SetDepthStencilState/SetBlendState 实现 +- `tests/RHI/unit/test_command_list.cpp` - 移除相关测试 +- `tests/RHI/OpenGL/unit/test_command_list.cpp` - 移除相关测试 + +**说明**: +- D3D12 中 PSO 是不可变的,SetDepthStencilState/SetBlendState 调用原本就是无效代码 +- OpenGL 中状态通过 OpenGLPipelineState::Apply() 在绑定 PSO 时应用 +- PrimitiveTopology 保留在 CommandList,因为 D3D12 允许动态改变 topology type + --- ### 3.4 ResourceView 类型不明确 ✅ 基本完成 @@ -507,7 +537,7 @@ class RHITexture : public RHIResource { ... }; |--------|------|--------|----------|------| | 1 | 字符串查找 SetUniform 不符合 D3D12/Vulkan | 🔴 致命 | 高 | ✅ 已完成 | | 2 | 缺少显式 RenderPass | 🔴 致命 | 高 | ✅ 已完成 | -| 3 | 动态状态太多 | 🔴 高 | 高 | ❌ 未完成 | +| 3 | 动态状态太多 | 🔴 高 | 高 | ✅ 已完成 | | 4 | ResourceView 类型不明确 | 🟡 中 | 中 | ✅ 基本完成 | | 5 | TransitionBarrier 针对 View 而非 Resource | 🟡 中 | 中 | ✅ 已完成 | | 6 | SetGlobal* 空操作 | 🟡 中 | 低 | ❌ 未完成 | diff --git a/engine/include/XCEngine/RHI/D3D12/D3D12CommandList.h b/engine/include/XCEngine/RHI/D3D12/D3D12CommandList.h index 15cb1a55..e7192218 100644 --- a/engine/include/XCEngine/RHI/D3D12/D3D12CommandList.h +++ b/engine/include/XCEngine/RHI/D3D12/D3D12CommandList.h @@ -104,8 +104,6 @@ public: void SetGraphicsRootShaderResourceView(uint32_t rootParameterIndex, D3D12_GPU_VIRTUAL_ADDRESS shaderResource); void SetStencilRef(uint8_t stencilRef) override; - void SetDepthStencilState(const DepthStencilState& state) override; - void SetBlendState(const BlendState& state) override; void SetBlendFactor(const float blendFactor[4]); void SetDepthBias(float depthBias, float slopeScaledDepthBias, float depthBiasClamp); diff --git a/engine/include/XCEngine/RHI/OpenGL/OpenGLCommandList.h b/engine/include/XCEngine/RHI/OpenGL/OpenGLCommandList.h index 409da6e7..148c695d 100644 --- a/engine/include/XCEngine/RHI/OpenGL/OpenGLCommandList.h +++ b/engine/include/XCEngine/RHI/OpenGL/OpenGLCommandList.h @@ -191,9 +191,7 @@ public: void SetScissorRect(const Rect& rect) override; void SetScissorRects(uint32_t count, const Rect* rects) override; void SetRenderTargets(uint32_t count, RHIResourceView** renderTargets, RHIResourceView* depthStencil = nullptr) override; - void SetDepthStencilState(const DepthStencilState& state) override; void SetStencilRef(uint8_t ref) override; - void SetBlendState(const BlendState& state) override; void SetBlendFactor(const float factor[4]) override; void ClearRenderTarget(RHIResourceView* renderTarget, const float color[4]) override; void ClearDepthStencil(RHIResourceView* depthStencil, float depth, uint8_t stencil) override; diff --git a/engine/include/XCEngine/RHI/RHICommandList.h b/engine/include/XCEngine/RHI/RHICommandList.h index 605b760d..9b162801 100644 --- a/engine/include/XCEngine/RHI/RHICommandList.h +++ b/engine/include/XCEngine/RHI/RHICommandList.h @@ -95,9 +95,7 @@ public: virtual void SetScissorRects(uint32_t count, const Rect* rects) = 0; virtual void SetRenderTargets(uint32_t count, RHIResourceView** renderTargets, RHIResourceView* depthStencil = nullptr) = 0; - virtual void SetDepthStencilState(const DepthStencilState& state) = 0; virtual void SetStencilRef(uint8_t ref) = 0; - virtual void SetBlendState(const BlendState& state) = 0; virtual void SetBlendFactor(const float factor[4]) = 0; virtual void SetVertexBuffers(uint32_t startSlot, uint32_t count, RHIResourceView** buffers, const uint64_t* offsets, const uint32_t* strides) = 0; diff --git a/engine/src/RHI/D3D12/D3D12CommandList.cpp b/engine/src/RHI/D3D12/D3D12CommandList.cpp index de90f54f..966bee5e 100644 --- a/engine/src/RHI/D3D12/D3D12CommandList.cpp +++ b/engine/src/RHI/D3D12/D3D12CommandList.cpp @@ -549,14 +549,6 @@ void D3D12CommandList::SetStencilRef(uint8_t stencilRef) { m_commandList->OMSetStencilRef(stencilRef); } -void D3D12CommandList::SetDepthStencilState(const DepthStencilState& state) { - // TODO: Implement depth stencil state -} - -void D3D12CommandList::SetBlendState(const BlendState& state) { - m_commandList->OMSetBlendFactor(state.blendFactor); -} - void D3D12CommandList::SetDepthBias(float depthBias, float slopeScaledDepthBias, float depthBiasClamp) { } diff --git a/engine/src/RHI/OpenGL/OpenGLCommandList.cpp b/engine/src/RHI/OpenGL/OpenGLCommandList.cpp index 4ca448cc..22ba87d3 100644 --- a/engine/src/RHI/OpenGL/OpenGLCommandList.cpp +++ b/engine/src/RHI/OpenGL/OpenGLCommandList.cpp @@ -813,58 +813,10 @@ void OpenGLCommandList::SetPrimitiveTopology(PrimitiveTopology topology) { m_primitiveType = ToGLPrimitiveTopology(topology); } -void OpenGLCommandList::SetDepthStencilState(const DepthStencilState& state) { - if (state.depthEnable) { - glEnable(GL_DEPTH_TEST); - glDepthFunc(ToGLComparisonFunc(state.depthFunc)); - glDepthMask(state.depthWriteMask ? GL_TRUE : GL_FALSE); - } else { - glDisable(GL_DEPTH_TEST); - } - - if (state.stencilEnable) { - glEnable(GL_STENCIL_TEST); - glStencilMask(state.stencilWriteMask); - glStencilFunc(ToGLComparisonFunc(state.frontFace.stencilFunc), 0, state.stencilReadMask); - glStencilOp( - ToGLStencilOp(state.frontFace.stencilFailOp), - ToGLStencilOp(state.frontFace.stencilDepthFailOp), - ToGLStencilOp(state.frontFace.stencilPassOp) - ); - } else { - glDisable(GL_STENCIL_TEST); - } -} - void OpenGLCommandList::SetStencilRef(uint8_t ref) { glStencilFunc(GL_FRONT_AND_BACK, ref, 0xFF); } -void OpenGLCommandList::SetBlendState(const BlendState& state) { - if (state.alphaToCoverageEnable) { - glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE); - } else { - glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE); - } - - const auto& rt = state.renderTargets[0]; - if (rt.blendEnable) { - glEnable(GL_BLEND); - glBlendFuncSeparate( - ToGLBlendFactor(rt.srcBlend), - ToGLBlendFactor(rt.dstBlend), - ToGLBlendFactor(rt.srcBlendAlpha), - ToGLBlendFactor(rt.dstBlendAlpha) - ); - glBlendEquationSeparate( - ToGLBlendOp(rt.blendOp), - ToGLBlendOp(rt.blendOpAlpha) - ); - } else { - glDisable(GL_BLEND); - } -} - void OpenGLCommandList::SetBlendFactor(const float factor[4]) { glBlendColor(factor[0], factor[1], factor[2], factor[3]); } diff --git a/tests/RHI/OpenGL/unit/test_command_list.cpp b/tests/RHI/OpenGL/unit/test_command_list.cpp index ad847595..8d6c9ada 100644 --- a/tests/RHI/OpenGL/unit/test_command_list.cpp +++ b/tests/RHI/OpenGL/unit/test_command_list.cpp @@ -147,36 +147,6 @@ TEST_F(OpenGLTestFixture, CommandList_SetPrimitiveTopology) { EXPECT_EQ(error, GL_NO_ERROR); } -TEST_F(OpenGLTestFixture, CommandList_SetDepthStencilState) { - OpenGLCommandList cmdList; - - DepthStencilState state = {}; - state.depthEnable = true; - state.depthWriteMask = true; - state.depthFunc = ComparisonFunc::Less; - - cmdList.SetDepthStencilState(state); - - GLint depthTest = 0; - glGetIntegerv(GL_DEPTH_TEST, &depthTest); - EXPECT_EQ(depthTest, 1); -} - -TEST_F(OpenGLTestFixture, CommandList_SetBlendState) { - OpenGLCommandList cmdList; - - BlendState state = {}; - state.renderTargets[0].blendEnable = true; - state.renderTargets[0].srcBlend = BlendFactor::SrcAlpha; - state.renderTargets[0].dstBlend = BlendFactor::InvSrcAlpha; - - cmdList.SetBlendState(state); - - GLint blend = 0; - glGetIntegerv(GL_BLEND, &blend); - EXPECT_EQ(blend, 1); -} - TEST_F(OpenGLTestFixture, CommandList_SetBlendFactor) { OpenGLCommandList cmdList; diff --git a/tests/RHI/unit/test_command_list.cpp b/tests/RHI/unit/test_command_list.cpp index 975eba24..99aa406a 100644 --- a/tests/RHI/unit/test_command_list.cpp +++ b/tests/RHI/unit/test_command_list.cpp @@ -147,45 +147,6 @@ TEST_P(RHITestFixture, CommandList_ClearRenderTarget) { delete cmdList; } -TEST_P(RHITestFixture, CommandList_SetDepthStencilState) { - CommandListDesc cmdDesc = {}; - cmdDesc.commandListType = static_cast(CommandQueueType::Direct); - - RHICommandList* cmdList = GetDevice()->CreateCommandList(cmdDesc); - ASSERT_NE(cmdList, nullptr); - - DepthStencilState dsState = {}; - dsState.depthEnable = true; - dsState.depthWriteMask = true; - dsState.depthFunc = ComparisonFunc::Less; - - cmdList->Reset(); - cmdList->SetDepthStencilState(dsState); - cmdList->Close(); - - cmdList->Shutdown(); - delete cmdList; -} - -TEST_P(RHITestFixture, CommandList_SetBlendState) { - CommandListDesc cmdDesc = {}; - cmdDesc.commandListType = static_cast(CommandQueueType::Direct); - - RHICommandList* cmdList = GetDevice()->CreateCommandList(cmdDesc); - ASSERT_NE(cmdList, nullptr); - - BlendState blendState = {}; - blendState.alphaToCoverageEnable = false; - blendState.independentBlendEnable = false; - - cmdList->Reset(); - cmdList->SetBlendState(blendState); - cmdList->Close(); - - cmdList->Shutdown(); - delete cmdList; -} - TEST_P(RHITestFixture, CommandList_SetStencilRef) { CommandListDesc cmdDesc = {}; cmdDesc.commandListType = static_cast(CommandQueueType::Direct);