From 2409f479e90b0df3c46b006b015c064e1c1ce0ea Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sat, 18 Apr 2026 01:24:21 +0800 Subject: [PATCH] refactor(rendering): route managed scene recording through native scene renderer factory --- .../XCEngine/Rendering/NativeSceneRenderer.h | 1 + .../Internal/RenderPipelineFactory.cpp | 5 +++++ .../Rendering/Internal/RenderPipelineFactory.h | 2 ++ engine/src/Scripting/Mono/MonoScriptRuntime.cpp | 17 +++++++++++++---- .../unit/test_builtin_forward_pipeline.cpp | 5 +++++ 5 files changed, 26 insertions(+), 4 deletions(-) diff --git a/engine/include/XCEngine/Rendering/NativeSceneRenderer.h b/engine/include/XCEngine/Rendering/NativeSceneRenderer.h index baa03046..caed9951 100644 --- a/engine/include/XCEngine/Rendering/NativeSceneRenderer.h +++ b/engine/include/XCEngine/Rendering/NativeSceneRenderer.h @@ -12,6 +12,7 @@ public: virtual ~NativeSceneRenderer() = default; virtual bool Initialize(const RenderContext& context) = 0; + virtual void Shutdown() = 0; virtual bool PrepareScene(const FrameExecutionContext& executionContext) = 0; virtual SceneRenderFeatureHost* GetFeatureHost() = 0; virtual bool BeginScenePass( diff --git a/engine/src/Rendering/Internal/RenderPipelineFactory.cpp b/engine/src/Rendering/Internal/RenderPipelineFactory.cpp index 9377a582..560b490c 100644 --- a/engine/src/Rendering/Internal/RenderPipelineFactory.cpp +++ b/engine/src/Rendering/Internal/RenderPipelineFactory.cpp @@ -1,5 +1,6 @@ #include "Rendering/Internal/RenderPipelineFactory.h" +#include "Rendering/Pipelines/BuiltinForwardPipeline.h" #include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h" #include "Rendering/Pipelines/ScriptableRenderPipelineHost.h" @@ -55,6 +56,10 @@ std::unique_ptr CreateRenderPipelineOrDefault( return std::make_unique(); } +std::unique_ptr CreateDefaultNativeSceneRenderer() { + return std::make_unique(); +} + } // namespace Internal } // namespace Rendering } // namespace XCEngine diff --git a/engine/src/Rendering/Internal/RenderPipelineFactory.h b/engine/src/Rendering/Internal/RenderPipelineFactory.h index b6b649f9..ce3b937d 100644 --- a/engine/src/Rendering/Internal/RenderPipelineFactory.h +++ b/engine/src/Rendering/Internal/RenderPipelineFactory.h @@ -5,6 +5,7 @@ namespace XCEngine { namespace Rendering { +class NativeSceneRenderer; class RenderPipeline; class RenderPipelineAsset; @@ -18,6 +19,7 @@ std::shared_ptr ResolveRenderPipelineAssetOrDefault( std::unique_ptr CreateRenderPipelineOrDefault( const std::shared_ptr& preferredAsset, std::shared_ptr* outResolvedAsset = nullptr); +std::unique_ptr CreateDefaultNativeSceneRenderer(); } // namespace Internal } // namespace Rendering diff --git a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp index b5de0447..dee5fe77 100644 --- a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp +++ b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp @@ -11,8 +11,8 @@ #include "Input/InputManager.h" #include "Physics/PhysicsWorld.h" #include "Rendering/Execution/CameraFramePlan.h" +#include "Rendering/Internal/RenderPipelineFactory.h" #include "Rendering/Passes/BuiltinColorScalePostProcessPass.h" -#include "Rendering/Pipelines/BuiltinForwardPipeline.h" #include "Rendering/Pipelines/BuiltinForwardSceneRecorder.h" #include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h" #include "Rendering/RenderPipelineStageGraphContract.h" @@ -414,7 +414,9 @@ public: } } m_builtinColorScalePassPool.clear(); - m_builtinForwardPipeline.Shutdown(); + if (m_builtinSceneRenderer != nullptr) { + m_builtinSceneRenderer->Shutdown(); + } ReleaseManagedObjects(); m_supportsStageMethod = nullptr; m_recordStageMethod = nullptr; @@ -465,8 +467,15 @@ public: ManagedScriptableRenderContextState managedContextState = {}; managedContextState.stage = context.stage; managedContextState.graphContext = &context; + if (m_builtinSceneRenderer == nullptr) { + m_builtinSceneRenderer = + Rendering::Internal::CreateDefaultNativeSceneRenderer(); + } + if (m_builtinSceneRenderer == nullptr) { + return false; + } Rendering::Pipelines::BuiltinForwardSceneRecorder builtinForwardSceneRecorder( - m_builtinForwardPipeline, + *m_builtinSceneRenderer, context); managedContextState.builtinForwardSceneRecorder = &builtinForwardSceneRecorder; @@ -600,7 +609,7 @@ private: mutable bool m_pipelineCreationAttempted = false; std::vector> m_builtinColorScalePassPool = {}; - Rendering::Pipelines::BuiltinForwardPipeline m_builtinForwardPipeline; + std::unique_ptr m_builtinSceneRenderer = nullptr; }; std::unique_ptr diff --git a/tests/Rendering/unit/test_builtin_forward_pipeline.cpp b/tests/Rendering/unit/test_builtin_forward_pipeline.cpp index b205a11d..4e33a88a 100644 --- a/tests/Rendering/unit/test_builtin_forward_pipeline.cpp +++ b/tests/Rendering/unit/test_builtin_forward_pipeline.cpp @@ -526,6 +526,10 @@ public: return initializeResult; } + void Shutdown() override { + ++shutdownCallCount; + } + bool PrepareScene(const FrameExecutionContext& executionContext) override { ++prepareCallCount; if (!prepareResult) { @@ -565,6 +569,7 @@ public: bool beginScenePassResult = true; bool executeScenePhaseResult = true; size_t initializeCallCount = 0u; + size_t shutdownCallCount = 0u; size_t prepareCallCount = 0u; size_t beginScenePassCallCount = 0u; size_t endScenePassCallCount = 0u;