From ce573d4e2dd9e77a8badbad41518a6e49a42b7b1 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 15 Apr 2026 15:31:05 +0800 Subject: [PATCH] refactor(rendering): unify fullscreen stage color-chain queries --- .../Rendering/Execution/CameraFramePlan.h | 1 + .../Rendering/Execution/CameraFramePlan.cpp | 36 ++++++++++++------- .../CameraFrameGraph/SurfaceUtils.cpp | 21 +++++------ .../unit/test_camera_scene_renderer.cpp | 3 ++ 4 files changed, 36 insertions(+), 25 deletions(-) diff --git a/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h b/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h index b4404b3a..65ea02ac 100644 --- a/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h +++ b/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h @@ -50,6 +50,7 @@ struct CameraFramePlan { bool IsFinalOutputStageValid() const; bool HasFrameStage(CameraFrameStage stage) const; RenderPassSequence* GetPassSequence(CameraFrameStage stage) const; + const CameraFrameFullscreenStagePlan* GetFullscreenStagePlan(CameraFrameStage stage) const; const FullscreenPassRenderRequest* GetFullscreenPassRequest(CameraFrameStage stage) const; const ScenePassRenderRequest* GetScenePassRequest(CameraFrameStage stage) const; const ObjectIdRenderRequest* GetObjectIdRequest(CameraFrameStage stage) const; diff --git a/engine/src/Rendering/Execution/CameraFramePlan.cpp b/engine/src/Rendering/Execution/CameraFramePlan.cpp index 2f1ca458..22c07590 100644 --- a/engine/src/Rendering/Execution/CameraFramePlan.cpp +++ b/engine/src/Rendering/Execution/CameraFramePlan.cpp @@ -41,23 +41,23 @@ bool CameraFramePlan::UsesGraphManagedMainSceneColor() const { } bool CameraFramePlan::UsesGraphManagedOutputColor(CameraFrameStage stage) const { - switch (stage) { - case CameraFrameStage::PostProcess: - return colorChain.postProcess.usesGraphManagedOutputColor; - default: - return false; + if (const CameraFrameFullscreenStagePlan* fullscreenStagePlan = + GetFullscreenStagePlan(stage); + fullscreenStagePlan != nullptr) { + return fullscreenStagePlan->usesGraphManagedOutputColor; } + + return false; } CameraFrameColorSource CameraFramePlan::ResolveStageColorSource(CameraFrameStage stage) const { - switch (stage) { - case CameraFrameStage::PostProcess: - return colorChain.postProcess.source; - case CameraFrameStage::FinalOutput: - return colorChain.finalOutput.source; - default: - return CameraFrameColorSource::ExplicitSurface; + if (const CameraFrameFullscreenStagePlan* fullscreenStagePlan = + GetFullscreenStagePlan(stage); + fullscreenStagePlan != nullptr) { + return fullscreenStagePlan->source; } + + return CameraFrameColorSource::ExplicitSurface; } bool CameraFramePlan::IsPostProcessStageValid() const { @@ -161,6 +161,18 @@ const FullscreenPassRenderRequest* CameraFramePlan::GetFullscreenPassRequest( } } +const CameraFrameFullscreenStagePlan* CameraFramePlan::GetFullscreenStagePlan( + CameraFrameStage stage) const { + switch (stage) { + case CameraFrameStage::PostProcess: + return &colorChain.postProcess; + case CameraFrameStage::FinalOutput: + return &colorChain.finalOutput; + default: + return nullptr; + } +} + const ScenePassRenderRequest* CameraFramePlan::GetScenePassRequest(CameraFrameStage stage) const { switch (GetCameraFrameStageRequestKind(stage)) { case CameraFrameStageRequestKind::ShadowCaster: diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/SurfaceUtils.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/SurfaceUtils.cpp index 2a0a5c9d..ea770190 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/SurfaceUtils.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/SurfaceUtils.cpp @@ -314,20 +314,15 @@ RenderGraphTextureHandle ResolveStageOutputColorHandle( const RenderGraphImportedSurface& outputSurface, RenderGraphBuilder& graphBuilder) { if (UsesCameraFrameStageGraphManagedOutputColor(plan, stage)) { - switch (stage) { - case CameraFrameStage::MainScene: - return graphBuilder.CreateTransientTexture( - stageName + ".Color", - BuildImportedTextureDesc( + const RenderGraphTextureDesc outputDesc = + IsCameraFrameFullscreenSequenceStage(stage) + ? BuildFullscreenTransientTextureDesc(stagePassContext.surface) + : BuildImportedTextureDesc( stagePassContext.surface, - kRenderGraphImportedColorFormat)); - case CameraFrameStage::PostProcess: - return graphBuilder.CreateTransientTexture( - stageName + ".Color", - BuildFullscreenTransientTextureDesc(stagePassContext.surface)); - default: - break; - } + kRenderGraphImportedColorFormat); + return graphBuilder.CreateTransientTexture( + stageName + ".Color", + outputDesc); } return GetPrimaryColorTexture(outputSurface); diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index 78b1398b..05b8fbe3 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -943,6 +943,9 @@ TEST(CameraRenderRequest_Test, ReportsFormalFrameStageContract) { EXPECT_EQ(plan.GetPassSequence(CameraFrameStage::FinalOutput), &finalOutputPasses); EXPECT_EQ(plan.GetPassSequence(CameraFrameStage::PostScenePasses), &postPasses); EXPECT_EQ(plan.GetPassSequence(CameraFrameStage::OverlayPasses), &overlayPasses); + EXPECT_EQ(plan.GetFullscreenStagePlan(CameraFrameStage::PostProcess), &plan.colorChain.postProcess); + EXPECT_EQ(plan.GetFullscreenStagePlan(CameraFrameStage::FinalOutput), &plan.colorChain.finalOutput); + EXPECT_EQ(plan.GetFullscreenStagePlan(CameraFrameStage::MainScene), nullptr); EXPECT_EQ(plan.GetFullscreenPassRequest(CameraFrameStage::PostProcess), &plan.postProcess); EXPECT_EQ(plan.GetFullscreenPassRequest(CameraFrameStage::FinalOutput), &plan.finalOutput); EXPECT_EQ(plan.GetFullscreenPassRequest(CameraFrameStage::MainScene), nullptr);