From 00fa6fffa08eaf6d50be6b8b6a9e8c53531fd10b Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 15 Apr 2026 00:32:23 +0800 Subject: [PATCH] Group camera frame fullscreen color chain intent --- .../Rendering/Execution/CameraFramePlan.h | 55 ++++++++++++--- .../CameraFrameRenderGraphStagePolicy.h | 15 +--- .../Rendering/Execution/CameraRenderer.cpp | 2 +- .../CameraFrameStageSurfaceResolver.h | 6 +- .../Planning/CameraFramePlanBuilder.cpp | 12 ++-- ...camera_frame_render_graph_stage_policy.cpp | 8 +-- .../unit/test_camera_scene_renderer.cpp | 70 ++++++++++++------- 7 files changed, 108 insertions(+), 60 deletions(-) diff --git a/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h b/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h index ce44010e..ce6b48c1 100644 --- a/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h +++ b/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h @@ -12,6 +12,17 @@ enum class CameraFrameColorSource { PostProcessColor }; +struct CameraFrameFullscreenStagePlan { + bool usesGraphManagedOutputColor = false; + CameraFrameColorSource source = CameraFrameColorSource::ExplicitSurface; +}; + +struct CameraFrameColorChainPlan { + bool usesGraphManagedMainSceneColor = false; + CameraFrameFullscreenStagePlan postProcess = {}; + CameraFrameFullscreenStagePlan finalOutput = {}; +}; + struct CameraFramePlan { static RenderSurface BuildGraphManagedIntermediateSurfaceTemplate( const RenderSurface& surface) { @@ -32,10 +43,7 @@ struct CameraFramePlan { RenderPassSequence* preScenePasses = nullptr; RenderPassSequence* postScenePasses = nullptr; RenderPassSequence* overlayPasses = nullptr; - bool usesGraphManagedMainSceneColor = false; - bool usesGraphManagedPostProcessColor = false; - CameraFrameColorSource postProcessSource = CameraFrameColorSource::ExplicitSurface; - CameraFrameColorSource finalOutputSource = CameraFrameColorSource::ExplicitSurface; + CameraFrameColorChainPlan colorChain = {}; RenderSurface graphManagedMainSceneSurface = {}; static CameraFramePlan FromRequest(const CameraRenderRequest& request) { @@ -61,20 +69,45 @@ struct CameraFramePlan { BuildGraphManagedIntermediateSurfaceTemplate(request.surface); } + bool UsesGraphManagedMainSceneColor() const { + return colorChain.usesGraphManagedMainSceneColor; + } + + bool UsesGraphManagedOutputColor(CameraFrameStage stage) const { + switch (stage) { + case CameraFrameStage::PostProcess: + return colorChain.postProcess.usesGraphManagedOutputColor; + default: + return false; + } + } + + CameraFrameColorSource ResolveStageColorSource(CameraFrameStage stage) const { + switch (stage) { + case CameraFrameStage::PostProcess: + return colorChain.postProcess.source; + case CameraFrameStage::FinalOutput: + return colorChain.finalOutput.source; + default: + return CameraFrameColorSource::ExplicitSurface; + } + } + bool IsPostProcessStageValid() const { if (!postProcess.IsRequested()) { return true; } - if (postProcessSource == CameraFrameColorSource::ExplicitSurface) { + if (ResolveStageColorSource(CameraFrameStage::PostProcess) == + CameraFrameColorSource::ExplicitSurface) { return postProcess.IsValid(); } const bool hasUsableDestination = - usesGraphManagedPostProcessColor || + UsesGraphManagedOutputColor(CameraFrameStage::PostProcess) || (HasValidColorTarget(postProcess.destinationSurface) && HasValidSurfaceSampleDescription(postProcess.destinationSurface)); - return usesGraphManagedMainSceneColor && + return UsesGraphManagedMainSceneColor() && postProcess.passes != nullptr && HasValidSingleSampleColorSource(request.surface) && hasUsableDestination; @@ -85,14 +118,16 @@ struct CameraFramePlan { return true; } + const CameraFrameColorSource finalOutputSource = + ResolveStageColorSource(CameraFrameStage::FinalOutput); if (finalOutputSource == CameraFrameColorSource::ExplicitSurface) { return finalOutput.IsValid(); } const bool hasUsableSource = finalOutputSource == CameraFrameColorSource::MainSceneColor - ? usesGraphManagedMainSceneColor - : usesGraphManagedPostProcessColor; + ? UsesGraphManagedMainSceneColor() + : UsesGraphManagedOutputColor(CameraFrameStage::PostProcess); return hasUsableSource && finalOutput.passes != nullptr && HasValidColorTarget(finalOutput.destinationSurface) && @@ -157,7 +192,7 @@ struct CameraFramePlan { } const RenderSurface& GetMainSceneSurface() const { - if (usesGraphManagedMainSceneColor && + if (UsesGraphManagedMainSceneColor() && graphManagedMainSceneSurface.GetWidth() > 0u && graphManagedMainSceneSurface.GetHeight() > 0u) { return graphManagedMainSceneSurface; diff --git a/engine/include/XCEngine/Rendering/Execution/CameraFrameRenderGraphStagePolicy.h b/engine/include/XCEngine/Rendering/Execution/CameraFrameRenderGraphStagePolicy.h index 6f758a7a..0d15e394 100644 --- a/engine/include/XCEngine/Rendering/Execution/CameraFrameRenderGraphStagePolicy.h +++ b/engine/include/XCEngine/Rendering/Execution/CameraFrameRenderGraphStagePolicy.h @@ -40,25 +40,16 @@ inline bool UsesCameraFrameStageGraphManagedOutputColor( CameraFrameStage stage) { switch (stage) { case CameraFrameStage::MainScene: - return plan.usesGraphManagedMainSceneColor; - case CameraFrameStage::PostProcess: - return plan.usesGraphManagedPostProcessColor; + return plan.UsesGraphManagedMainSceneColor(); default: - return false; + return plan.UsesGraphManagedOutputColor(stage); } } inline CameraFrameColorSource ResolveCameraFrameStageGraphManagedColorSource( const CameraFramePlan& plan, CameraFrameStage stage) { - switch (stage) { - case CameraFrameStage::PostProcess: - return plan.postProcessSource; - case CameraFrameStage::FinalOutput: - return plan.finalOutputSource; - default: - return CameraFrameColorSource::ExplicitSurface; - } + return plan.ResolveStageColorSource(stage); } inline CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding( diff --git a/engine/src/Rendering/Execution/CameraRenderer.cpp b/engine/src/Rendering/Execution/CameraRenderer.cpp index dc6d45ee..c95e77f2 100644 --- a/engine/src/Rendering/Execution/CameraRenderer.cpp +++ b/engine/src/Rendering/Execution/CameraRenderer.cpp @@ -264,7 +264,7 @@ bool CameraRenderer::Render( "CameraRenderer::Render failed: post-process request invalid"); return false; } - if (plan.usesGraphManagedMainSceneColor && + if (plan.UsesGraphManagedMainSceneColor() && (m_pipeline == nullptr || !m_pipeline->SupportsMainSceneRenderGraph())) { Debug::Logger::Get().Error( Debug::LogCategory::Rendering, diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameStageSurfaceResolver.h b/engine/src/Rendering/Execution/Internal/CameraFrameStageSurfaceResolver.h index 2acfd822..0a9181ce 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameStageSurfaceResolver.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameStageSurfaceResolver.h @@ -57,7 +57,8 @@ inline CameraFrameStageSourceBinding ResolveCameraFrameStageSourceBinding( switch (stage) { case CameraFrameStage::PostProcess: return plan.postProcess.IsRequested() && - plan.postProcessSource == CameraFrameColorSource::ExplicitSurface + plan.ResolveStageColorSource(CameraFrameStage::PostProcess) == + CameraFrameColorSource::ExplicitSurface ? CameraFrameStageSourceBinding{ &plan.postProcess.sourceSurface, plan.postProcess.sourceColorView, @@ -65,7 +66,8 @@ inline CameraFrameStageSourceBinding ResolveCameraFrameStageSourceBinding( : CameraFrameStageSourceBinding{}; case CameraFrameStage::FinalOutput: return plan.finalOutput.IsRequested() && - plan.finalOutputSource == CameraFrameColorSource::ExplicitSurface + plan.ResolveStageColorSource(CameraFrameStage::FinalOutput) == + CameraFrameColorSource::ExplicitSurface ? CameraFrameStageSourceBinding{ &plan.finalOutput.sourceSurface, plan.finalOutput.sourceColorView, diff --git a/engine/src/Rendering/Planning/CameraFramePlanBuilder.cpp b/engine/src/Rendering/Planning/CameraFramePlanBuilder.cpp index 48a80021..a649bfb8 100644 --- a/engine/src/Rendering/Planning/CameraFramePlanBuilder.cpp +++ b/engine/src/Rendering/Planning/CameraFramePlanBuilder.cpp @@ -84,9 +84,9 @@ void CameraFramePlanBuilder::AttachFullscreenStageRequests( if (hasPostProcess) { m_ownedPostProcessSequences[index] = std::move(postProcessSequence); plan.postProcess.passes = m_ownedPostProcessSequences[index].get(); - plan.usesGraphManagedMainSceneColor = true; - plan.postProcessSource = CameraFrameColorSource::MainSceneColor; - plan.usesGraphManagedPostProcessColor = hasFinalOutput; + plan.colorChain.usesGraphManagedMainSceneColor = true; + plan.colorChain.postProcess.source = CameraFrameColorSource::MainSceneColor; + plan.colorChain.postProcess.usesGraphManagedOutputColor = hasFinalOutput; if (!hasFinalOutput) { plan.postProcess.destinationSurface = plan.request.surface; } @@ -95,15 +95,15 @@ void CameraFramePlanBuilder::AttachFullscreenStageRequests( if (hasFinalOutput) { m_ownedFinalOutputSequences[index] = std::move(finalOutputSequence); plan.finalOutput.passes = m_ownedFinalOutputSequences[index].get(); - plan.usesGraphManagedMainSceneColor = true; - plan.finalOutputSource = + plan.colorChain.usesGraphManagedMainSceneColor = true; + plan.colorChain.finalOutput.source = hasPostProcess ? CameraFrameColorSource::PostProcessColor : CameraFrameColorSource::MainSceneColor; plan.finalOutput.destinationSurface = plan.request.surface; } - if (plan.usesGraphManagedMainSceneColor) { + if (plan.UsesGraphManagedMainSceneColor()) { plan.ConfigureGraphManagedMainSceneSurface(); } } diff --git a/tests/Rendering/unit/test_camera_frame_render_graph_stage_policy.cpp b/tests/Rendering/unit/test_camera_frame_render_graph_stage_policy.cpp index 98543583..3a6f0f3f 100644 --- a/tests/Rendering/unit/test_camera_frame_render_graph_stage_policy.cpp +++ b/tests/Rendering/unit/test_camera_frame_render_graph_stage_policy.cpp @@ -33,8 +33,8 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsStageFullscreenAndTransition TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsGraphManagedOutputColorStagesFromPlan) { CameraFramePlan plan = {}; - plan.usesGraphManagedMainSceneColor = true; - plan.usesGraphManagedPostProcessColor = true; + plan.colorChain.usesGraphManagedMainSceneColor = true; + plan.colorChain.postProcess.usesGraphManagedOutputColor = true; EXPECT_TRUE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::MainScene)); EXPECT_TRUE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::PostProcess)); @@ -71,7 +71,7 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, KeepsExplicitFullscreenSourceBindin TEST(CameraFrameRenderGraphStagePolicy_Test, ResolvesGraphManagedPostProcessSourceFromBlackboard) { CameraFramePlan plan = {}; - plan.postProcessSource = CameraFrameColorSource::MainSceneColor; + plan.colorChain.postProcess.source = CameraFrameColorSource::MainSceneColor; RenderGraphBlackboard blackboard = {}; CameraFrameRenderGraphResources& frameResources = @@ -98,7 +98,7 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ResolvesGraphManagedPostProcessSour TEST(CameraFrameRenderGraphStagePolicy_Test, ResolvesGraphManagedFinalOutputSourceFromBlackboard) { CameraFramePlan plan = {}; - plan.finalOutputSource = CameraFrameColorSource::PostProcessColor; + plan.colorChain.finalOutput.source = CameraFrameColorSource::PostProcessColor; RenderGraphBlackboard blackboard = {}; CameraFrameRenderGraphResources& frameResources = diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index efb8b715..0c8c8d21 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -1877,11 +1877,11 @@ TEST(CameraRenderer_Test, ResolvesGraphManagedFullscreenSequenceSourcesFromFrame request.finalOutput.destinationSurface = request.surface; CameraFramePlan plan = CameraFramePlan::FromRequest(request); - plan.usesGraphManagedMainSceneColor = true; + plan.colorChain.usesGraphManagedMainSceneColor = true; plan.ConfigureGraphManagedMainSceneSurface(); - plan.usesGraphManagedPostProcessColor = true; - plan.postProcessSource = CameraFrameColorSource::MainSceneColor; - plan.finalOutputSource = CameraFrameColorSource::PostProcessColor; + plan.colorChain.postProcess.usesGraphManagedOutputColor = true; + plan.colorChain.postProcess.source = CameraFrameColorSource::MainSceneColor; + plan.colorChain.finalOutput.source = CameraFrameColorSource::PostProcessColor; ASSERT_TRUE(plan.IsPostProcessStageValid()); ASSERT_TRUE(plan.IsFinalOutputStageValid()); @@ -2877,9 +2877,11 @@ TEST(SceneRenderer_Test, BuildsCameraColorScalePostProcessRequestFromCameraPassS EXPECT_TRUE(plan.IsPostProcessStageValid()); EXPECT_NE(plan.postProcess.passes, nullptr); ASSERT_EQ(plan.postProcess.passes->GetPassCount(), 2u); - EXPECT_TRUE(plan.usesGraphManagedMainSceneColor); - EXPECT_FALSE(plan.usesGraphManagedPostProcessColor); - EXPECT_EQ(plan.postProcessSource, CameraFrameColorSource::MainSceneColor); + EXPECT_TRUE(plan.UsesGraphManagedMainSceneColor()); + EXPECT_FALSE(plan.UsesGraphManagedOutputColor(CameraFrameStage::PostProcess)); + EXPECT_EQ( + plan.ResolveStageColorSource(CameraFrameStage::PostProcess), + CameraFrameColorSource::MainSceneColor); EXPECT_EQ(plan.postProcess.destinationSurface.GetColorAttachments()[0], backBufferColorView); EXPECT_EQ(plan.postProcess.destinationSurface.GetDepthAttachment(), depthView); EXPECT_EQ( @@ -3015,8 +3017,10 @@ TEST(SceneRenderer_Test, BuildsFinalOutputRequestFromResolvedFinalColorPolicy) { EXPECT_TRUE(plan.IsFinalOutputStageValid()); ASSERT_NE(plan.finalOutput.passes, nullptr); EXPECT_EQ(plan.finalOutput.passes->GetPassCount(), 1u); - EXPECT_TRUE(plan.usesGraphManagedMainSceneColor); - EXPECT_EQ(plan.finalOutputSource, CameraFrameColorSource::MainSceneColor); + EXPECT_TRUE(plan.UsesGraphManagedMainSceneColor()); + EXPECT_EQ( + plan.ResolveStageColorSource(CameraFrameStage::FinalOutput), + CameraFrameColorSource::MainSceneColor); EXPECT_EQ(plan.finalOutput.destinationSurface.GetColorAttachments()[0], backBufferColorView); EXPECT_EQ(plan.finalOutput.destinationSurface.GetDepthAttachment(), depthView); EXPECT_EQ( @@ -3106,10 +3110,14 @@ TEST(SceneRenderer_Test, RoutesPostProcessIntoIntermediateSurfaceBeforeFinalOutp ASSERT_NE(plan.finalOutput.passes, nullptr); EXPECT_EQ(plan.postProcess.passes->GetPassCount(), 1u); EXPECT_EQ(plan.finalOutput.passes->GetPassCount(), 1u); - EXPECT_TRUE(plan.usesGraphManagedMainSceneColor); - EXPECT_TRUE(plan.usesGraphManagedPostProcessColor); - EXPECT_EQ(plan.postProcessSource, CameraFrameColorSource::MainSceneColor); - EXPECT_EQ(plan.finalOutputSource, CameraFrameColorSource::PostProcessColor); + EXPECT_TRUE(plan.UsesGraphManagedMainSceneColor()); + EXPECT_TRUE(plan.UsesGraphManagedOutputColor(CameraFrameStage::PostProcess)); + EXPECT_EQ( + plan.ResolveStageColorSource(CameraFrameStage::PostProcess), + CameraFrameColorSource::MainSceneColor); + EXPECT_EQ( + plan.ResolveStageColorSource(CameraFrameStage::FinalOutput), + CameraFrameColorSource::PostProcessColor); const CameraFrameStageSourceBinding postProcessSource = ResolveStageSourceBinding(CameraFrameStage::PostProcess, plan); @@ -3251,8 +3259,10 @@ TEST(SceneRenderer_Test, KeepsMainSceneGraphManagedWhenPostProcessIsEnabledAcros renderer.BuildFramePlans(scene, nullptr, context, surface); ASSERT_EQ(firstFramePlans.size(), 1u); CameraFramePlan firstFramePlan = firstFramePlans[0]; - EXPECT_TRUE(firstFramePlan.usesGraphManagedMainSceneColor); - EXPECT_EQ(firstFramePlan.postProcessSource, CameraFrameColorSource::MainSceneColor); + EXPECT_TRUE(firstFramePlan.UsesGraphManagedMainSceneColor()); + EXPECT_EQ( + firstFramePlan.ResolveStageColorSource(CameraFrameStage::PostProcess), + CameraFrameColorSource::MainSceneColor); EXPECT_EQ( firstFramePlan.GetMainSceneSurface().GetColorStateBefore(), XCEngine::RHI::ResourceStates::Common); @@ -3271,8 +3281,10 @@ TEST(SceneRenderer_Test, KeepsMainSceneGraphManagedWhenPostProcessIsEnabledAcros renderer.BuildFramePlans(scene, nullptr, context, surface); ASSERT_EQ(secondFramePlans.size(), 1u); const CameraFramePlan secondFramePlan = secondFramePlans[0]; - EXPECT_TRUE(secondFramePlan.usesGraphManagedMainSceneColor); - EXPECT_EQ(secondFramePlan.postProcessSource, CameraFrameColorSource::MainSceneColor); + EXPECT_TRUE(secondFramePlan.UsesGraphManagedMainSceneColor()); + EXPECT_EQ( + secondFramePlan.ResolveStageColorSource(CameraFrameStage::PostProcess), + CameraFrameColorSource::MainSceneColor); EXPECT_EQ( secondFramePlan.GetMainSceneSurface().GetColorStateBefore(), XCEngine::RHI::ResourceStates::Common); @@ -3334,10 +3346,14 @@ TEST(SceneRenderer_Test, KeepsPostProcessOutputGraphManagedWhenFinalOutputIsEnab CameraFramePlan firstFramePlan = firstFramePlans[0]; EXPECT_TRUE(firstFramePlans[0].postProcess.IsRequested()); EXPECT_TRUE(firstFramePlans[0].finalOutput.IsRequested()); - EXPECT_TRUE(firstFramePlan.usesGraphManagedMainSceneColor); - EXPECT_TRUE(firstFramePlan.usesGraphManagedPostProcessColor); - EXPECT_EQ(firstFramePlan.postProcessSource, CameraFrameColorSource::MainSceneColor); - EXPECT_EQ(firstFramePlan.finalOutputSource, CameraFrameColorSource::PostProcessColor); + EXPECT_TRUE(firstFramePlan.UsesGraphManagedMainSceneColor()); + EXPECT_TRUE(firstFramePlan.UsesGraphManagedOutputColor(CameraFrameStage::PostProcess)); + EXPECT_EQ( + firstFramePlan.ResolveStageColorSource(CameraFrameStage::PostProcess), + CameraFrameColorSource::MainSceneColor); + EXPECT_EQ( + firstFramePlan.ResolveStageColorSource(CameraFrameStage::FinalOutput), + CameraFrameColorSource::PostProcessColor); EXPECT_EQ( firstFramePlan.GetMainSceneSurface().GetColorStateBefore(), XCEngine::RHI::ResourceStates::Common); @@ -3362,10 +3378,14 @@ TEST(SceneRenderer_Test, KeepsPostProcessOutputGraphManagedWhenFinalOutputIsEnab renderer.BuildFramePlans(scene, nullptr, context, surface); ASSERT_EQ(secondFramePlans.size(), 1u); const CameraFramePlan secondFramePlan = secondFramePlans[0]; - EXPECT_TRUE(secondFramePlan.usesGraphManagedMainSceneColor); - EXPECT_TRUE(secondFramePlan.usesGraphManagedPostProcessColor); - EXPECT_EQ(secondFramePlan.postProcessSource, CameraFrameColorSource::MainSceneColor); - EXPECT_EQ(secondFramePlan.finalOutputSource, CameraFrameColorSource::PostProcessColor); + EXPECT_TRUE(secondFramePlan.UsesGraphManagedMainSceneColor()); + EXPECT_TRUE(secondFramePlan.UsesGraphManagedOutputColor(CameraFrameStage::PostProcess)); + EXPECT_EQ( + secondFramePlan.ResolveStageColorSource(CameraFrameStage::PostProcess), + CameraFrameColorSource::MainSceneColor); + EXPECT_EQ( + secondFramePlan.ResolveStageColorSource(CameraFrameStage::FinalOutput), + CameraFrameColorSource::PostProcessColor); EXPECT_EQ( secondFramePlan.GetMainSceneSurface().GetColorStateBefore(), XCEngine::RHI::ResourceStates::Common);