From bf0b81d03431e54088bbd1c17f45b2eb3fa626bd Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 15 Apr 2026 16:42:36 +0800 Subject: [PATCH] refactor(rendering): centralize stage graph output policies --- .../Rendering/Execution/CameraFrameStage.h | 15 +++++++++++ .../Rendering/Execution/CameraFramePlan.cpp | 4 +++ .../CameraFrameGraph/StageContract.cpp | 27 ++++++++++++++----- .../Internal/CameraFrameGraph/StagePolicy.h | 7 +---- .../test_camera_frame_graph_stage_policy.cpp | 7 +++++ 5 files changed, 48 insertions(+), 12 deletions(-) diff --git a/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h b/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h index 23ec12be..8df32d05 100644 --- a/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h +++ b/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h @@ -45,6 +45,11 @@ enum class CameraFrameStageSharedSurfaceRole : uint8_t { FinalComposited }; +enum class CameraFrameStagePublishedDepthAliasRole : uint8_t { + None, + MainDirectionalShadow +}; + struct CameraFrameStageInfo { CameraFrameStage stage = CameraFrameStage::MainScene; const char* name = ""; @@ -198,6 +203,16 @@ GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage stage) { } } +inline constexpr CameraFrameStagePublishedDepthAliasRole +GetCameraFrameStagePublishedDepthAliasRole(CameraFrameStage stage) { + switch (stage) { + case CameraFrameStage::ShadowCaster: + return CameraFrameStagePublishedDepthAliasRole::MainDirectionalShadow; + default: + return CameraFrameStagePublishedDepthAliasRole::None; + } +} + inline constexpr bool DoesCameraFrameStageFallbackUseColorOnlySurfaceAccess( CameraFrameStage stage) { return IsCameraFrameFullscreenSequenceStage(stage); diff --git a/engine/src/Rendering/Execution/CameraFramePlan.cpp b/engine/src/Rendering/Execution/CameraFramePlan.cpp index e96a9faf..40d479c9 100644 --- a/engine/src/Rendering/Execution/CameraFramePlan.cpp +++ b/engine/src/Rendering/Execution/CameraFramePlan.cpp @@ -41,6 +41,10 @@ bool CameraFramePlan::UsesGraphManagedMainSceneColor() const { } bool CameraFramePlan::UsesGraphManagedOutputColor(CameraFrameStage stage) const { + if (stage == CameraFrameStage::MainScene) { + return UsesGraphManagedMainSceneColor(); + } + if (const CameraFrameFullscreenStagePlan* fullscreenStagePlan = GetFullscreenStagePlan(stage); fullscreenStagePlan != nullptr) { diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp index adc6d9ea..38723d70 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp @@ -108,6 +108,23 @@ RenderGraphSurfaceAccessMode BuildCameraFrameStageFallbackSurfaceAccessMode( : RenderGraphSurfaceAccessMode::ColorDepth; } +void PublishCameraFrameStageGraphDepthAliasResource( + CameraFrameRenderGraphResources& frameResources, + const CameraFrameStageGraphBuildState& stageState, + const DirectionalShadowExecutionState& shadowState) { + switch (GetCameraFrameStagePublishedDepthAliasRole(stageState.stage)) { + case CameraFrameStagePublishedDepthAliasRole::MainDirectionalShadow: + if (shadowState.HasShadowSampling() && + stageState.outputSurface.depthTexture.IsValid()) { + frameResources.mainDirectionalShadow = + stageState.outputSurface.depthTexture; + } + break; + default: + break; + } +} + } // namespace CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding( @@ -168,12 +185,10 @@ void PublishCameraFrameStageGraphResources( stageState.stage, stageState.outputColor, stageState.outputSurface.depthTexture); - - if (stageState.stage == CameraFrameStage::ShadowCaster && - context.shadowState.HasShadowSampling() && - stageState.outputSurface.depthTexture.IsValid()) { - frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture; - } + PublishCameraFrameStageGraphDepthAliasResource( + frameResources, + stageState, + context.shadowState); } RenderSceneData BuildCameraFrameStandaloneStageSceneData( diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StagePolicy.h b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StagePolicy.h index 024f0e24..8afc6c64 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StagePolicy.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StagePolicy.h @@ -16,12 +16,7 @@ struct CameraFrameRenderGraphSourceBinding { inline bool UsesCameraFrameStageGraphManagedOutputColor( const CameraFramePlan& plan, CameraFrameStage stage) { - switch (stage) { - case CameraFrameStage::MainScene: - return plan.UsesGraphManagedMainSceneColor(); - default: - return plan.UsesGraphManagedOutputColor(stage); - } + return plan.UsesGraphManagedOutputColor(stage); } inline CameraFrameColorSource ResolveCameraFrameStageGraphManagedColorSource( diff --git a/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp b/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp index aa8c6806..a04823db 100644 --- a/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp +++ b/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp @@ -38,6 +38,12 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsStageFullscreenAndTransition EXPECT_EQ( GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage::PostProcess), CameraFrameStageSharedSurfaceRole::None); + EXPECT_EQ( + GetCameraFrameStagePublishedDepthAliasRole(CameraFrameStage::ShadowCaster), + CameraFrameStagePublishedDepthAliasRole::MainDirectionalShadow); + EXPECT_EQ( + GetCameraFrameStagePublishedDepthAliasRole(CameraFrameStage::MainScene), + CameraFrameStagePublishedDepthAliasRole::None); EXPECT_TRUE( DoesCameraFrameStageFallbackUseColorOnlySurfaceAccess( CameraFrameStage::PostProcess)); @@ -102,6 +108,7 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsGraphManagedOutputColorStage plan.colorChain.usesGraphManagedMainSceneColor = true; plan.colorChain.postProcess.usesGraphManagedOutputColor = true; + EXPECT_TRUE(plan.UsesGraphManagedOutputColor(CameraFrameStage::MainScene)); EXPECT_TRUE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::MainScene)); EXPECT_TRUE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::PostProcess)); EXPECT_FALSE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::FinalOutput));