From 215c353ace41aef0911f0a585b3efe1733d7740e Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Wed, 15 Apr 2026 21:22:29 +0800 Subject: [PATCH] refactor(rendering): move frame plan defaults behind pipeline assets --- engine/CMakeLists.txt | 1 + .../XCEngine/Rendering/RenderPipelineAsset.h | 6 +++ .../Planning/CameraFramePlanBuilder.cpp | 27 +++------- .../Planning/CameraFramePlanBuilder.h | 3 +- engine/src/Rendering/RenderPipelineAsset.cpp | 29 ++++++++++ .../unit/test_camera_scene_renderer.cpp | 54 +++++++++++++++++++ 6 files changed, 97 insertions(+), 23 deletions(-) create mode 100644 engine/src/Rendering/RenderPipelineAsset.cpp diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index c66fb5cd..af6cdbeb 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -600,6 +600,7 @@ add_library(XCEngine STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Features/BuiltinGaussianSplatPass.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Features/BuiltinVolumetricPass.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Features/Internal/BuiltinGaussianSplatPassResources.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/RenderPipelineAsset.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/RenderSurface.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/SceneRenderFeaturePass.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/SceneRenderFeatureHost.cpp diff --git a/engine/include/XCEngine/Rendering/RenderPipelineAsset.h b/engine/include/XCEngine/Rendering/RenderPipelineAsset.h index 10cc3f4d..f5ce413f 100644 --- a/engine/include/XCEngine/Rendering/RenderPipelineAsset.h +++ b/engine/include/XCEngine/Rendering/RenderPipelineAsset.h @@ -7,14 +7,20 @@ namespace XCEngine { namespace Rendering { +struct CameraFramePlan; class RenderPipeline; +void ApplyDefaultRenderPipelineAssetCameraFramePlanPolicy( + CameraFramePlan& plan, + const FinalColorSettings& pipelineDefaults = FinalColorSettings{}); + class RenderPipelineAsset { public: virtual ~RenderPipelineAsset() = default; virtual std::unique_ptr CreatePipeline() const = 0; virtual FinalColorSettings GetDefaultFinalColorSettings() const { return {}; } + virtual void ConfigureCameraFramePlan(CameraFramePlan& plan) const; }; } // namespace Rendering diff --git a/engine/src/Rendering/Planning/CameraFramePlanBuilder.cpp b/engine/src/Rendering/Planning/CameraFramePlanBuilder.cpp index 20fa0c5f..1feb3033 100644 --- a/engine/src/Rendering/Planning/CameraFramePlanBuilder.cpp +++ b/engine/src/Rendering/Planning/CameraFramePlanBuilder.cpp @@ -1,7 +1,5 @@ #include "Rendering/Planning/CameraFramePlanBuilder.h" -#include "Components/CameraComponent.h" -#include "Rendering/Planning/Internal/CameraFrameFullscreenStagePlanner.h" #include "Rendering/RenderPipelineAsset.h" namespace XCEngine { @@ -11,8 +9,7 @@ std::vector CameraFramePlanBuilder::BuildPlans( const std::vector& requests, const RenderPipelineAsset* pipelineAsset) { std::vector plans = CreatePlansFromRequests(requests); - ResolveCameraFinalColorPolicies(plans, pipelineAsset); - AttachFullscreenStageRequests(plans); + ConfigurePlans(plans, pipelineAsset); return plans; } @@ -27,27 +24,15 @@ std::vector CameraFramePlanBuilder::CreatePlansFromRequests( return plans; } -void CameraFramePlanBuilder::ResolveCameraFinalColorPolicies( +void CameraFramePlanBuilder::ConfigurePlans( std::vector& plans, const RenderPipelineAsset* pipelineAsset) const { - const FinalColorSettings pipelineDefaults = - pipelineAsset != nullptr ? pipelineAsset->GetDefaultFinalColorSettings() : FinalColorSettings(); - for (CameraFramePlan& plan : plans) { - if (plan.request.camera == nullptr) { - continue; + if (pipelineAsset != nullptr) { + pipelineAsset->ConfigureCameraFramePlan(plan); + } else { + ApplyDefaultRenderPipelineAssetCameraFramePlanPolicy(plan); } - - plan.finalColorPolicy = ResolveFinalColorPolicy( - pipelineDefaults, - &plan.request.camera->GetFinalColorOverrides()); - } -} - -void CameraFramePlanBuilder::AttachFullscreenStageRequests( - std::vector& plans) { - for (CameraFramePlan& plan : plans) { - Internal::PlanCameraFrameFullscreenStages(plan); } } diff --git a/engine/src/Rendering/Planning/CameraFramePlanBuilder.h b/engine/src/Rendering/Planning/CameraFramePlanBuilder.h index fa88be9f..28a2515c 100644 --- a/engine/src/Rendering/Planning/CameraFramePlanBuilder.h +++ b/engine/src/Rendering/Planning/CameraFramePlanBuilder.h @@ -23,10 +23,9 @@ public: private: std::vector CreatePlansFromRequests( const std::vector& requests) const; - void ResolveCameraFinalColorPolicies( + void ConfigurePlans( std::vector& plans, const RenderPipelineAsset* pipelineAsset) const; - void AttachFullscreenStageRequests(std::vector& plans); }; } // namespace Rendering diff --git a/engine/src/Rendering/RenderPipelineAsset.cpp b/engine/src/Rendering/RenderPipelineAsset.cpp new file mode 100644 index 00000000..61eb0435 --- /dev/null +++ b/engine/src/Rendering/RenderPipelineAsset.cpp @@ -0,0 +1,29 @@ +#include + +#include "Components/CameraComponent.h" +#include "Rendering/Execution/CameraFramePlan.h" +#include "Rendering/Planning/Internal/CameraFrameFullscreenStagePlanner.h" + +namespace XCEngine { +namespace Rendering { + +void ApplyDefaultRenderPipelineAssetCameraFramePlanPolicy( + CameraFramePlan& plan, + const FinalColorSettings& pipelineDefaults) { + if (plan.request.camera != nullptr) { + plan.finalColorPolicy = ResolveFinalColorPolicy( + pipelineDefaults, + &plan.request.camera->GetFinalColorOverrides()); + } + + Internal::PlanCameraFrameFullscreenStages(plan); +} + +void RenderPipelineAsset::ConfigureCameraFramePlan(CameraFramePlan& plan) const { + ApplyDefaultRenderPipelineAssetCameraFramePlanPolicy( + plan, + GetDefaultFinalColorSettings()); +} + +} // namespace Rendering +} // namespace XCEngine diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index 631ffd98..33d9f821 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -21,6 +21,7 @@ #include #include "Rendering/Execution/Internal/CameraFrameGraph/SurfaceResolver.h" +#include #include #include #include @@ -412,8 +413,10 @@ public: struct MockPipelineAssetState { int createCalls = 0; + int configureCameraFramePlanCalls = 0; std::shared_ptr lastCreatedPipelineState; FinalColorSettings defaultFinalColorSettings = {}; + std::function configureCameraFramePlan = {}; }; struct MockStageRecorderState { @@ -659,6 +662,16 @@ public: return m_state->defaultFinalColorSettings; } + void ConfigureCameraFramePlan(CameraFramePlan& plan) const override { + ++m_state->configureCameraFramePlanCalls; + if (m_state->configureCameraFramePlan) { + m_state->configureCameraFramePlan(plan); + return; + } + + RenderPipelineAsset::ConfigureCameraFramePlan(plan); + } + private: std::shared_ptr m_state; }; @@ -3109,6 +3122,47 @@ TEST(SceneRenderer_Test, ResolvesFinalColorPolicyFromPipelineDefaultsAndCameraOv EXPECT_FALSE(plan.finalOutput.IsRequested()); } +TEST(SceneRenderer_Test, UsesPipelineAssetCameraFramePlanConfigurationHook) { + Scene scene("SceneRendererPlanConfigurationHookScene"); + + GameObject* cameraObject = scene.CreateGameObject("Camera"); + auto* camera = cameraObject->AddComponent(); + camera->SetPrimary(true); + camera->SetDepth(2.0f); + camera->SetPostProcessPasses({ + XCEngine::Rendering::CameraPostProcessPassDesc::MakeColorScale( + XCEngine::Math::Vector4(1.0f, 0.75f, 0.75f, 1.0f)) + }); + + FinalColorOverrideSettings cameraOverrides = {}; + cameraOverrides.overrideOutputTransferMode = true; + cameraOverrides.outputTransferMode = FinalColorOutputTransferMode::LinearToSRGB; + camera->SetFinalColorOverrides(cameraOverrides); + + auto assetState = std::make_shared(); + assetState->configureCameraFramePlan = []( + CameraFramePlan& plan) { + plan.ClearOwnedPostProcessSequence(); + plan.ClearOwnedFinalOutputSequence(); + plan.finalColorPolicy = {}; + plan.postProcess = {}; + plan.finalOutput = {}; + plan.colorChain = {}; + }; + + SceneRenderer renderer(std::make_shared(assetState)); + const std::vector plans = + renderer.BuildFramePlans(scene, nullptr, CreateValidContext(), RenderSurface(640, 360)); + + ASSERT_EQ(plans.size(), 1u); + EXPECT_EQ(assetState->configureCameraFramePlanCalls, 1); + const CameraFramePlan& plan = plans[0]; + EXPECT_FALSE(plan.finalColorPolicy.hasPipelineDefaults); + EXPECT_FALSE(plan.finalColorPolicy.hasCameraOverrides); + EXPECT_FALSE(plan.postProcess.IsRequested()); + EXPECT_FALSE(plan.finalOutput.IsRequested()); +} + TEST(SceneRenderer_Test, BuildsFinalOutputRequestFromResolvedFinalColorPolicy) { Scene scene("SceneRendererFinalOutputScene");