From 7671663b121f6433998919e921563dc4c8b52bc5 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 15 Apr 2026 19:31:52 +0800 Subject: [PATCH] refactor(rendering): generalize pipeline stage render graph boundary --- .../Graph/RenderGraphRecordingContext.h | 8 +++++--- .../Pipelines/BuiltinForwardPipeline.h | 6 +++--- .../Pipelines/ScriptableRenderPipelineHost.h | 6 +++--- .../XCEngine/Rendering/RenderPipeline.h | 9 +++++---- .../RenderPipelineMainSceneGraphContract.h | 10 +++++----- .../src/Rendering/Execution/CameraRenderer.cpp | 3 ++- .../Internal/CameraFrameGraph/PassRecorder.cpp | 9 +++++---- .../Internal/CameraFrameGraph/PassRecorder.h | 2 +- .../CameraFrameGraph/StageContract.cpp | 13 +++++++------ .../Internal/CameraFrameGraph/StageContract.h | 4 ++-- .../CameraFrameGraph/StageDispatch.cpp | 2 +- .../BuiltinForwardMainSceneGraphBuilder.cpp | 18 ++++++++++-------- .../BuiltinForwardMainSceneGraphBuilder.h | 4 ++-- .../Internal/BuiltinForwardPipelineFrame.cpp | 12 +++++++----- .../Pipelines/ScriptableRenderPipelineHost.cpp | 11 ++++++----- .../RenderPipelineMainSceneGraphContract.cpp | 12 ++++++------ .../unit/test_builtin_forward_pipeline.cpp | 17 ++++++++++------- .../test_camera_frame_graph_stage_contract.cpp | 13 ++++++++----- .../unit/test_camera_scene_renderer.cpp | 16 +++++++++------- .../test_render_graph_recording_context.cpp | 17 +++++++++++------ 20 files changed, 108 insertions(+), 84 deletions(-) diff --git a/engine/include/XCEngine/Rendering/Graph/RenderGraphRecordingContext.h b/engine/include/XCEngine/Rendering/Graph/RenderGraphRecordingContext.h index 41765ace..e43aa00a 100644 --- a/engine/include/XCEngine/Rendering/Graph/RenderGraphRecordingContext.h +++ b/engine/include/XCEngine/Rendering/Graph/RenderGraphRecordingContext.h @@ -110,7 +110,7 @@ inline RenderGraphRecordingContext BuildRenderGraphRecordingContext( } inline RenderGraphRecordingContext BuildRenderGraphRecordingContext( - const RenderPipelineMainSceneRenderGraphContext& context) { + const RenderPipelineStageRenderGraphContext& context) { return { context.graphBuilder, context.passName, @@ -176,11 +176,13 @@ inline SceneRenderFeaturePassRenderGraphContext BuildSceneRenderFeaturePassRende }; } -inline RenderPipelineMainSceneRenderGraphContext BuildRenderPipelineMainSceneRenderGraphContext( - const RenderGraphRecordingContext& common) { +inline RenderPipelineStageRenderGraphContext BuildRenderPipelineStageRenderGraphContext( + const RenderGraphRecordingContext& common, + CameraFrameStage stage) { return { common.graphBuilder, common.passName, + stage, common.renderContext, common.sceneData, common.surface, diff --git a/engine/include/XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h b/engine/include/XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h index 49b176c0..d23abcc3 100644 --- a/engine/include/XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h +++ b/engine/include/XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h @@ -61,9 +61,9 @@ public: bool Initialize(const RenderContext& context) override; void Shutdown() override; - bool SupportsMainSceneRenderGraph() const override; - bool RecordMainSceneRenderGraph( - const RenderPipelineMainSceneRenderGraphContext& context) override; + bool SupportsStageRenderGraph(CameraFrameStage stage) const override; + bool RecordStageRenderGraph( + const RenderPipelineStageRenderGraphContext& context) override; bool Render(const FrameExecutionContext& executionContext) override; bool Render( const RenderContext& context, diff --git a/engine/include/XCEngine/Rendering/Pipelines/ScriptableRenderPipelineHost.h b/engine/include/XCEngine/Rendering/Pipelines/ScriptableRenderPipelineHost.h index f95061ca..fcfe288c 100644 --- a/engine/include/XCEngine/Rendering/Pipelines/ScriptableRenderPipelineHost.h +++ b/engine/include/XCEngine/Rendering/Pipelines/ScriptableRenderPipelineHost.h @@ -32,9 +32,9 @@ public: bool Initialize(const RenderContext& context) override; void Shutdown() override; - bool SupportsMainSceneRenderGraph() const override; - bool RecordMainSceneRenderGraph( - const RenderPipelineMainSceneRenderGraphContext& context) override; + bool SupportsStageRenderGraph(CameraFrameStage stage) const override; + bool RecordStageRenderGraph( + const RenderPipelineStageRenderGraphContext& context) override; bool Render(const FrameExecutionContext& executionContext) override; bool Render( const RenderContext& context, diff --git a/engine/include/XCEngine/Rendering/RenderPipeline.h b/engine/include/XCEngine/Rendering/RenderPipeline.h index 0a771110..44e93748 100644 --- a/engine/include/XCEngine/Rendering/RenderPipeline.h +++ b/engine/include/XCEngine/Rendering/RenderPipeline.h @@ -19,9 +19,10 @@ namespace Rendering { class RenderGraphBuilder; -struct RenderPipelineMainSceneRenderGraphContext { +struct RenderPipelineStageRenderGraphContext { RenderGraphBuilder& graphBuilder; Containers::String passName = {}; + CameraFrameStage stage = CameraFrameStage::MainScene; const RenderContext& renderContext; const RenderSceneData& sceneData; RenderSurface surfaceTemplate = {}; @@ -41,11 +42,11 @@ public: virtual bool Initialize(const RenderContext& context) = 0; virtual void Shutdown() = 0; - virtual bool SupportsMainSceneRenderGraph() const { + virtual bool SupportsStageRenderGraph(CameraFrameStage) const { return false; } - virtual bool RecordMainSceneRenderGraph( - const RenderPipelineMainSceneRenderGraphContext&) { + virtual bool RecordStageRenderGraph( + const RenderPipelineStageRenderGraphContext&) { return false; } virtual bool Render(const FrameExecutionContext& executionContext) { diff --git a/engine/include/XCEngine/Rendering/RenderPipelineMainSceneGraphContract.h b/engine/include/XCEngine/Rendering/RenderPipelineMainSceneGraphContract.h index f85917bf..348cdf1f 100644 --- a/engine/include/XCEngine/Rendering/RenderPipelineMainSceneGraphContract.h +++ b/engine/include/XCEngine/Rendering/RenderPipelineMainSceneGraphContract.h @@ -13,12 +13,12 @@ namespace Rendering { class SceneRenderFeatureHost; -Containers::String BuildRenderPipelineMainScenePhasePassName( +Containers::String BuildRenderPipelineStagePhasePassName( const Containers::String& baseName, ScenePhase scenePhase); -bool RecordRenderPipelineMainSceneFeaturePasses( - const RenderPipelineMainSceneRenderGraphContext& context, +bool RecordRenderPipelineStageFeaturePasses( + const RenderPipelineStageRenderGraphContext& context, SceneRenderFeatureHost& featureHost, SceneRenderInjectionPoint injectionPoint, bool clearAttachments, @@ -26,8 +26,8 @@ bool RecordRenderPipelineMainSceneFeaturePasses( SceneRenderFeaturePassEndCallback endPassCallback = {}, bool* recordedAnyPass = nullptr); -bool RecordRenderPipelineMainScenePhasePass( - const RenderPipelineMainSceneRenderGraphContext& context, +bool RecordRenderPipelineStagePhasePass( + const RenderPipelineStageRenderGraphContext& context, ScenePhase scenePhase, RenderPassGraphExecutePassCallback executePassCallback, RenderPassGraphBeginCallback beginPassCallback = {}, diff --git a/engine/src/Rendering/Execution/CameraRenderer.cpp b/engine/src/Rendering/Execution/CameraRenderer.cpp index 1f47a0c2..4a352b09 100644 --- a/engine/src/Rendering/Execution/CameraRenderer.cpp +++ b/engine/src/Rendering/Execution/CameraRenderer.cpp @@ -181,7 +181,8 @@ bool CameraRenderer::Render( return false; } if (plan.UsesGraphManagedOutputColor(CameraFrameStage::MainScene) && - (m_pipeline == nullptr || !m_pipeline->SupportsMainSceneRenderGraph())) { + (m_pipeline == nullptr || + !m_pipeline->SupportsStageRenderGraph(CameraFrameStage::MainScene))) { Debug::Logger::Get().Error( Debug::LogCategory::Rendering, "CameraRenderer::Render failed: graph-managed main scene color requires pipeline main-scene render-graph support"); diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/PassRecorder.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/PassRecorder.cpp index d6329389..3dba73b1 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/PassRecorder.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/PassRecorder.cpp @@ -48,26 +48,27 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass( return true; } -bool TryRecordCameraFrameMainSceneGraphPass( +bool TryRecordCameraFramePipelineStageGraphPass( const CameraFrameStageGraphBuildState& stageState, const CameraFrameRenderGraphStageContext& context, bool& handled) { CameraFrameRenderGraphBuilderContext& builder = context.builder; if (!SupportsCameraFramePipelineGraphRecording(stageState.stage) || builder.executionState.pipeline == nullptr || - !builder.executionState.pipeline->SupportsMainSceneRenderGraph()) { + !builder.executionState.pipeline->SupportsStageRenderGraph( + stageState.stage)) { handled = false; return true; } handled = true; - if (!RecordCameraFrameMainSceneGraphPass( + if (!RecordCameraFramePipelineStageGraphPass( context, stageState, *builder.executionState.pipeline)) { Debug::Logger::Get().Error( Debug::LogCategory::Rendering, - "CameraRenderer::Render failed: RenderPipeline::RecordMainSceneRenderGraph returned false"); + "CameraRenderer::Render failed: RenderPipeline::RecordStageRenderGraph returned false"); return false; } diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/PassRecorder.h b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/PassRecorder.h index fbedf293..85e5453b 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/PassRecorder.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/PassRecorder.h @@ -11,7 +11,7 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass( const CameraFrameRenderGraphStageContext& context, bool& handled); -bool TryRecordCameraFrameMainSceneGraphPass( +bool TryRecordCameraFramePipelineStageGraphPass( const CameraFrameStageGraphBuildState& stageState, const CameraFrameRenderGraphStageContext& context, bool& handled); diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp index 38723d70..432f07b7 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp @@ -554,22 +554,23 @@ RenderPassContext BuildCameraFrameStageFallbackPassContext( }; } -RenderPipelineMainSceneRenderGraphContext BuildCameraFrameMainSceneStageRenderGraphContext( +RenderPipelineStageRenderGraphContext BuildCameraFramePipelineStageRenderGraphContext( const CameraFrameRenderGraphStageContext& context, const CameraFrameStageGraphBuildState& stageState) { - return BuildRenderPipelineMainSceneRenderGraphContext( + return BuildRenderPipelineStageRenderGraphContext( BuildCameraFrameStageGraphRecordingContext( context, stageState, - context.sceneData)); + context.sceneData), + stageState.stage); } -bool RecordCameraFrameMainSceneGraphPass( +bool RecordCameraFramePipelineStageGraphPass( const CameraFrameRenderGraphStageContext& context, const CameraFrameStageGraphBuildState& stageState, RenderPipelineRenderer& pipeline) { - return pipeline.RecordMainSceneRenderGraph( - BuildCameraFrameMainSceneStageRenderGraphContext( + return pipeline.RecordStageRenderGraph( + BuildCameraFramePipelineStageRenderGraphContext( context, stageState)); } diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.h b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.h index 269d9bce..90399f82 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.h @@ -146,11 +146,11 @@ RenderPassContext BuildCameraFrameStageFallbackPassContext( const RenderContext& renderContext, const RenderSceneData& sceneData); -RenderPipelineMainSceneRenderGraphContext BuildCameraFrameMainSceneStageRenderGraphContext( +RenderPipelineStageRenderGraphContext BuildCameraFramePipelineStageRenderGraphContext( const CameraFrameRenderGraphStageContext& context, const CameraFrameStageGraphBuildState& stageState); -bool RecordCameraFrameMainSceneGraphPass( +bool RecordCameraFramePipelineStageGraphPass( const CameraFrameRenderGraphStageContext& context, const CameraFrameStageGraphBuildState& stageState, RenderPipelineRenderer& pipeline); diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageDispatch.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageDispatch.cpp index 90e6f01d..11a754ca 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageDispatch.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageDispatch.cpp @@ -20,7 +20,7 @@ using CameraFrameStageRecordHandler = bool (*)( constexpr std::array kCameraFrameStageRecordHandlers = { &TryRecordCameraFrameStageSequence, &TryRecordCameraFrameStageStandaloneRenderGraphPass, - &TryRecordCameraFrameMainSceneGraphPass + &TryRecordCameraFramePipelineStageGraphPass }; } // namespace diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardMainSceneGraphBuilder.cpp b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardMainSceneGraphBuilder.cpp index 8fbb700b..dd3802db 100644 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardMainSceneGraphBuilder.cpp +++ b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardMainSceneGraphBuilder.cpp @@ -36,7 +36,7 @@ bool ScenePhaseSamplesMainDirectionalShadow(ScenePhase scenePhase) { bool BuiltinForwardMainSceneGraphBuilder::Record( BuiltinForwardPipeline& pipeline, - const RenderPipelineMainSceneRenderGraphContext& context) { + const RenderPipelineStageRenderGraphContext& context) { const RenderSurface graphManagedSurface = BuildGraphManagedForwardSceneSurface(context.surfaceTemplate); const bool hasSourceSurface = context.sourceSurface != nullptr; @@ -58,8 +58,10 @@ bool BuiltinForwardMainSceneGraphBuilder::Record( ? frameResources->mainDirectionalShadow : RenderGraphTextureHandle{}; bool* const executionSucceeded = recordingContext.executionSucceeded; - const RenderPipelineMainSceneRenderGraphContext graphContext = - BuildRenderPipelineMainSceneRenderGraphContext(recordingContext); + const RenderPipelineStageRenderGraphContext graphContext = + BuildRenderPipelineStageRenderGraphContext( + recordingContext, + CameraFrameStage::MainScene); const std::shared_ptr graphExecutionState = std::make_shared(); const SceneRenderFeaturePassBeginCallback beginRecordedPass = @@ -76,7 +78,7 @@ bool BuiltinForwardMainSceneGraphBuilder::Record( if (!pipeline.Initialize(passContext.renderContext)) { Debug::Logger::Get().Error( Debug::LogCategory::Rendering, - "BuiltinForwardPipeline::RecordMainSceneRenderGraph failed during execution: Initialize returned false"); + "BuiltinForwardPipeline::RecordStageRenderGraph failed during execution: Initialize returned false"); if (executionSucceeded != nullptr) { *executionSucceeded = false; } @@ -93,7 +95,7 @@ bool BuiltinForwardMainSceneGraphBuilder::Record( if (!pipeline.m_forwardSceneFeatureHost.Prepare(executionContext)) { Debug::Logger::Get().Error( Debug::LogCategory::Rendering, - "BuiltinForwardPipeline::RecordMainSceneRenderGraph failed during execution: SceneRenderFeatureHost::Prepare returned false"); + "BuiltinForwardPipeline::RecordStageRenderGraph failed during execution: SceneRenderFeatureHost::Prepare returned false"); if (executionSucceeded != nullptr) { *executionSucceeded = false; } @@ -106,7 +108,7 @@ bool BuiltinForwardMainSceneGraphBuilder::Record( if (!pipeline.BeginForwardScenePass(passContext, clearAttachments)) { Debug::Logger::Get().Error( Debug::LogCategory::Rendering, - "BuiltinForwardPipeline::RecordMainSceneRenderGraph failed during execution: BeginForwardScenePass returned false"); + "BuiltinForwardPipeline::RecordStageRenderGraph failed during execution: BeginForwardScenePass returned false"); if (executionSucceeded != nullptr) { *executionSucceeded = false; } @@ -124,7 +126,7 @@ bool BuiltinForwardMainSceneGraphBuilder::Record( for (const ForwardSceneStep& step : GetBuiltinForwardSceneSteps()) { if (step.type == ForwardSceneStepType::InjectionPoint) { bool recordedAnyPass = false; - if (!::XCEngine::Rendering::RecordRenderPipelineMainSceneFeaturePasses( + if (!::XCEngine::Rendering::RecordRenderPipelineStageFeaturePasses( graphContext, pipeline.m_forwardSceneFeatureHost, step.injectionPoint, @@ -150,7 +152,7 @@ bool BuiltinForwardMainSceneGraphBuilder::Record( mainDirectionalShadowTexture.IsValid() ? std::vector{ mainDirectionalShadowTexture } : std::vector{}; - if (!::XCEngine::Rendering::RecordRenderPipelineMainScenePhasePass( + if (!::XCEngine::Rendering::RecordRenderPipelineStagePhasePass( graphContext, step.scenePhase, [&pipeline, scenePhase = step.scenePhase](const RenderPassContext& passContext) { diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardMainSceneGraphBuilder.h b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardMainSceneGraphBuilder.h index c576eec5..21cf2a20 100644 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardMainSceneGraphBuilder.h +++ b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardMainSceneGraphBuilder.h @@ -3,7 +3,7 @@ namespace XCEngine { namespace Rendering { -struct RenderPipelineMainSceneRenderGraphContext; +struct RenderPipelineStageRenderGraphContext; namespace Pipelines { @@ -14,7 +14,7 @@ namespace Internal { struct BuiltinForwardMainSceneGraphBuilder { static bool Record( BuiltinForwardPipeline& pipeline, - const RenderPipelineMainSceneRenderGraphContext& context); + const RenderPipelineStageRenderGraphContext& context); }; } // namespace Internal diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineFrame.cpp b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineFrame.cpp index 70776207..24adf6d9 100644 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineFrame.cpp +++ b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineFrame.cpp @@ -59,13 +59,15 @@ bool BuiltinForwardPipeline::ShouldSampleMainDirectionalShadowMap(const RenderSc IsDepthFormat(sceneData.lighting.mainDirectionalShadow.shadowMap->GetFormat()); } -bool BuiltinForwardPipeline::SupportsMainSceneRenderGraph() const { - return true; +bool BuiltinForwardPipeline::SupportsStageRenderGraph( + CameraFrameStage stage) const { + return SupportsCameraFramePipelineGraphRecording(stage); } -bool BuiltinForwardPipeline::RecordMainSceneRenderGraph( - const RenderPipelineMainSceneRenderGraphContext& context) { - return Internal::BuiltinForwardMainSceneGraphBuilder::Record(*this, context); +bool BuiltinForwardPipeline::RecordStageRenderGraph( + const RenderPipelineStageRenderGraphContext& context) { + return context.stage == CameraFrameStage::MainScene && + Internal::BuiltinForwardMainSceneGraphBuilder::Record(*this, context); } bool BuiltinForwardPipeline::Render( diff --git a/engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp b/engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp index 3b76da18..11ccef06 100644 --- a/engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp +++ b/engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp @@ -99,15 +99,16 @@ void ScriptableRenderPipelineHost::Shutdown() { ShutdownCameraFrameStandalonePasses(); } -bool ScriptableRenderPipelineHost::SupportsMainSceneRenderGraph() const { +bool ScriptableRenderPipelineHost::SupportsStageRenderGraph( + CameraFrameStage stage) const { return m_mainSceneRenderer != nullptr && - m_mainSceneRenderer->SupportsMainSceneRenderGraph(); + m_mainSceneRenderer->SupportsStageRenderGraph(stage); } -bool ScriptableRenderPipelineHost::RecordMainSceneRenderGraph( - const RenderPipelineMainSceneRenderGraphContext& context) { +bool ScriptableRenderPipelineHost::RecordStageRenderGraph( + const RenderPipelineStageRenderGraphContext& context) { return m_mainSceneRenderer != nullptr && - m_mainSceneRenderer->RecordMainSceneRenderGraph(context); + m_mainSceneRenderer->RecordStageRenderGraph(context); } bool ScriptableRenderPipelineHost::Render( diff --git a/engine/src/Rendering/RenderPipelineMainSceneGraphContract.cpp b/engine/src/Rendering/RenderPipelineMainSceneGraphContract.cpp index 8e08db61..3d230bce 100644 --- a/engine/src/Rendering/RenderPipelineMainSceneGraphContract.cpp +++ b/engine/src/Rendering/RenderPipelineMainSceneGraphContract.cpp @@ -9,7 +9,7 @@ namespace XCEngine { namespace Rendering { -Containers::String BuildRenderPipelineMainScenePhasePassName( +Containers::String BuildRenderPipelineStagePhasePassName( const Containers::String& baseName, ScenePhase scenePhase) { std::string name = baseName.CStr(); @@ -21,8 +21,8 @@ Containers::String BuildRenderPipelineMainScenePhasePassName( return Containers::String(name.c_str()); } -bool RecordRenderPipelineMainSceneFeaturePasses( - const RenderPipelineMainSceneRenderGraphContext& context, +bool RecordRenderPipelineStageFeaturePasses( + const RenderPipelineStageRenderGraphContext& context, SceneRenderFeatureHost& featureHost, SceneRenderInjectionPoint injectionPoint, bool clearAttachments, @@ -41,8 +41,8 @@ bool RecordRenderPipelineMainSceneFeaturePasses( recordedAnyPass); } -bool RecordRenderPipelineMainScenePhasePass( - const RenderPipelineMainSceneRenderGraphContext& context, +bool RecordRenderPipelineStagePhasePass( + const RenderPipelineStageRenderGraphContext& context, ScenePhase scenePhase, RenderPassGraphExecutePassCallback executePassCallback, RenderPassGraphBeginCallback beginPassCallback, @@ -52,7 +52,7 @@ bool RecordRenderPipelineMainScenePhasePass( BuildRenderPassRenderGraphContext( CloneRenderGraphRecordingContext( BuildRenderGraphRecordingContext(context), - BuildRenderPipelineMainScenePhasePassName( + BuildRenderPipelineStagePhasePassName( context.passName, scenePhase)), beginPassCallback, diff --git a/tests/Rendering/unit/test_builtin_forward_pipeline.cpp b/tests/Rendering/unit/test_builtin_forward_pipeline.cpp index d073c93c..c9c4433c 100644 --- a/tests/Rendering/unit/test_builtin_forward_pipeline.cpp +++ b/tests/Rendering/unit/test_builtin_forward_pipeline.cpp @@ -577,7 +577,7 @@ TEST(BuiltinForwardPipeline_Test, UsesFloat3PositionInputLayoutForStaticMeshVert TEST(BuiltinForwardPipeline_Test, RecordsMainSceneGraphPassWithSampledShadowDependency) { BuiltinForwardPipeline pipeline; - EXPECT_TRUE(pipeline.SupportsMainSceneRenderGraph()); + EXPECT_TRUE(pipeline.SupportsStageRenderGraph(CameraFrameStage::MainScene)); RenderGraph graph = {}; RenderGraphBuilder graphBuilder(graph); @@ -634,9 +634,10 @@ TEST(BuiltinForwardPipeline_Test, RecordsMainSceneGraphPassWithSampledShadowDepe frameResources.mainScene.depth = depthTarget; frameResources.mainDirectionalShadow = shadowTarget; bool executionSucceeded = true; - const RenderPipelineMainSceneRenderGraphContext context = { + const RenderPipelineStageRenderGraphContext context = { graphBuilder, "MainScene", + CameraFrameStage::MainScene, renderContext, sceneData, surface, @@ -650,7 +651,7 @@ TEST(BuiltinForwardPipeline_Test, RecordsMainSceneGraphPassWithSampledShadowDepe &blackboard }; - ASSERT_TRUE(pipeline.RecordMainSceneRenderGraph(context)); + ASSERT_TRUE(pipeline.RecordStageRenderGraph(context)); CompiledRenderGraph compiledGraph = {}; String errorMessage; @@ -1173,9 +1174,10 @@ TEST(BuiltinForwardPipeline_Test, RecordsActiveFeatureInjectionPassesIntoMainSce frameResources.mainScene.color = colorTarget; frameResources.mainScene.depth = depthTarget; bool executionSucceeded = true; - const RenderPipelineMainSceneRenderGraphContext context = { + const RenderPipelineStageRenderGraphContext context = { graphBuilder, "MainScene", + CameraFrameStage::MainScene, renderContext, sceneData, surface, @@ -1189,7 +1191,7 @@ TEST(BuiltinForwardPipeline_Test, RecordsActiveFeatureInjectionPassesIntoMainSce &blackboard }; - ASSERT_TRUE(pipeline.RecordMainSceneRenderGraph(context)); + ASSERT_TRUE(pipeline.RecordStageRenderGraph(context)); CompiledRenderGraph compiledGraph = {}; String errorMessage; @@ -1272,9 +1274,10 @@ TEST(BuiltinForwardPipeline_Test, ForwardsSourceColorTextureIntoFeatureInjection RenderSceneData sceneData = {}; RenderGraphBlackboard blackboard = {}; bool executionSucceeded = true; - const RenderPipelineMainSceneRenderGraphContext context = { + const RenderPipelineStageRenderGraphContext context = { graphBuilder, "MainScene", + CameraFrameStage::MainScene, renderContext, sceneData, surface, @@ -1288,7 +1291,7 @@ TEST(BuiltinForwardPipeline_Test, ForwardsSourceColorTextureIntoFeatureInjection &blackboard }; - ASSERT_TRUE(pipeline.RecordMainSceneRenderGraph(context)); + ASSERT_TRUE(pipeline.RecordStageRenderGraph(context)); EXPECT_EQ(featureRaw->recordGraphCallCount, 1u); EXPECT_TRUE(featureRaw->lastReceivedSourceColorTextureValid); diff --git a/tests/Rendering/unit/test_camera_frame_graph_stage_contract.cpp b/tests/Rendering/unit/test_camera_frame_graph_stage_contract.cpp index da5905db..b289c80c 100644 --- a/tests/Rendering/unit/test_camera_frame_graph_stage_contract.cpp +++ b/tests/Rendering/unit/test_camera_frame_graph_stage_contract.cpp @@ -100,14 +100,15 @@ public: ShutdownCameraFrameStandalonePasses(); } - bool SupportsMainSceneRenderGraph() const override { - return true; + bool SupportsStageRenderGraph(CameraFrameStage stage) const override { + return SupportsCameraFramePipelineGraphRecording(stage); } - bool RecordMainSceneRenderGraph( - const RenderPipelineMainSceneRenderGraphContext& context) override { + bool RecordStageRenderGraph( + const RenderPipelineStageRenderGraphContext& context) override { ++recordCalls; lastPassName = context.passName.CStr(); + lastStage = context.stage; lastColorTargets = context.colorTargets; lastDepthTarget = context.depthTarget; lastExecutionSucceeded = context.executionSucceeded; @@ -139,6 +140,7 @@ public: int recordCalls = 0; int renderCalls = 0; std::string lastPassName = {}; + CameraFrameStage lastStage = CameraFrameStage::PreScenePasses; std::vector lastColorTargets = {}; RenderGraphTextureHandle lastDepthTarget = {}; bool* lastExecutionSucceeded = nullptr; @@ -813,12 +815,13 @@ TEST(CameraFrameRenderGraphStageContract_Test, RecordsMainSceneGraphPassFromStag stageState.outputSurface.depthTexture = RenderGraphTextureHandle{ 43u }; RecordingPipeline pipeline = {}; - ASSERT_TRUE(RecordCameraFrameMainSceneGraphPass( + ASSERT_TRUE(RecordCameraFramePipelineStageGraphPass( context, stageState, pipeline)); ASSERT_EQ(pipeline.recordCalls, 1); EXPECT_STREQ(pipeline.lastPassName.c_str(), "MainScene"); + EXPECT_EQ(pipeline.lastStage, CameraFrameStage::MainScene); ASSERT_EQ(pipeline.lastColorTargets.size(), 1u); EXPECT_EQ(pipeline.lastColorTargets[0].index, 41u); EXPECT_EQ(pipeline.lastDepthTarget.index, 43u); diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index 28f2bc2e..258fe9d4 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -432,12 +432,13 @@ public: ShutdownCameraFrameStandalonePasses(); } - bool SupportsMainSceneRenderGraph() const override { - return m_state->supportsMainSceneRenderGraph; + bool SupportsStageRenderGraph(CameraFrameStage stage) const override { + return SupportsCameraFramePipelineGraphRecording(stage) && + m_state->supportsMainSceneRenderGraph; } - bool RecordMainSceneRenderGraph( - const RenderPipelineMainSceneRenderGraphContext& context) override { + bool RecordStageRenderGraph( + const RenderPipelineStageRenderGraphContext& context) override { ++m_state->recordMainSceneCalls; m_state->lastReceivedRenderGraphBlackboard = context.blackboard != nullptr; if (const CameraFrameRenderGraphResources* frameResources = @@ -3729,9 +3730,10 @@ TEST(ScriptableRenderPipelineHost_Test, ForwardsRendererLifetimeAndFrameRenderin bool executionSucceeded = true; RenderSceneData graphSceneData = CreateSceneDataForCamera(scene, *camera, request.surface); - const RenderPipelineMainSceneRenderGraphContext graphContext = { + const RenderPipelineStageRenderGraphContext graphContext = { graphBuilder, "MainScene", + CameraFrameStage::MainScene, request.context, graphSceneData, request.surface, @@ -3744,8 +3746,8 @@ TEST(ScriptableRenderPipelineHost_Test, ForwardsRendererLifetimeAndFrameRenderin &executionSucceeded, &blackboard }; - EXPECT_TRUE(host.SupportsMainSceneRenderGraph()); - EXPECT_TRUE(host.RecordMainSceneRenderGraph(graphContext)); + EXPECT_TRUE(host.SupportsStageRenderGraph(CameraFrameStage::MainScene)); + EXPECT_TRUE(host.RecordStageRenderGraph(graphContext)); EXPECT_EQ(replacementState->recordMainSceneCalls, 1); } diff --git a/tests/Rendering/unit/test_render_graph_recording_context.cpp b/tests/Rendering/unit/test_render_graph_recording_context.cpp index 59419b5b..1bb284f8 100644 --- a/tests/Rendering/unit/test_render_graph_recording_context.cpp +++ b/tests/Rendering/unit/test_render_graph_recording_context.cpp @@ -295,7 +295,7 @@ TEST(RenderGraphRecordingContext_Test, BuildsFeaturePassContextAndCloneOverrides EXPECT_TRUE(endCalled); } -TEST(RenderGraphRecordingContext_Test, BuildsPipelineMainSceneContextFromSharedRecordingData) { +TEST(RenderGraphRecordingContext_Test, BuildsPipelineStageContextFromSharedRecordingData) { RenderGraph graph = {}; RenderGraphBuilder builder(graph); RenderGraphBlackboard blackboard = {}; @@ -314,11 +314,14 @@ TEST(RenderGraphRecordingContext_Test, BuildsPipelineMainSceneContextFromSharedR sourceSurface, executionSucceeded); - const RenderPipelineMainSceneRenderGraphContext pipelineContext = - BuildRenderPipelineMainSceneRenderGraphContext(commonContext); + const RenderPipelineStageRenderGraphContext pipelineContext = + BuildRenderPipelineStageRenderGraphContext( + commonContext, + CameraFrameStage::MainScene); EXPECT_EQ(&pipelineContext.graphBuilder, &builder); EXPECT_EQ(pipelineContext.passName, XCEngine::Containers::String("Recording.Pass")); + EXPECT_EQ(pipelineContext.stage, CameraFrameStage::MainScene); EXPECT_EQ(&pipelineContext.renderContext, &renderContext); EXPECT_EQ(&pipelineContext.sceneData, &sceneData); EXPECT_EQ(pipelineContext.surfaceTemplate.GetWidth(), 800u); @@ -390,7 +393,7 @@ TEST(RenderGraphRecordingContext_Test, CloneOverridesSelectedRecordingContextFie EXPECT_EQ(overriddenContext.blackboard, &blackboard); } -TEST(RenderGraphRecordingContext_Test, BuildsSharedRecordingDataFromPipelineMainSceneContext) { +TEST(RenderGraphRecordingContext_Test, BuildsSharedRecordingDataFromPipelineStageContext) { RenderGraph graph = {}; RenderGraphBuilder builder(graph); RenderGraphBlackboard blackboard = {}; @@ -408,8 +411,10 @@ TEST(RenderGraphRecordingContext_Test, BuildsSharedRecordingDataFromPipelineMain surface, sourceSurface, executionSucceeded); - const RenderPipelineMainSceneRenderGraphContext pipelineContext = - BuildRenderPipelineMainSceneRenderGraphContext(commonContext); + const RenderPipelineStageRenderGraphContext pipelineContext = + BuildRenderPipelineStageRenderGraphContext( + commonContext, + CameraFrameStage::MainScene); const RenderGraphRecordingContext rebuiltCommonContext = BuildRenderGraphRecordingContext(pipelineContext);