refactor(srp): unify managed pipeline instance ownership

Move shared managed ScriptableRenderPipeline instance ownership into MonoManagedRenderPipelineAssetRuntime.

Make stage recorders borrow the runtime-owned pipeline instead of creating and destroying private handles.

Add a regression test that locks one CreatePipeline call across multiple stage recorders.
This commit is contained in:
2026-04-20 00:44:09 +08:00
parent cbc0ddbd42
commit beaf5809d5
4 changed files with 272 additions and 37 deletions

View File

@@ -2432,6 +2432,73 @@ TEST_F(
recorder->Shutdown();
}
TEST_F(
MonoScriptRuntimeTest,
ManagedRenderPipelineBridgeSharesManagedPipelineInstanceAcrossStageRecorders) {
Scene* runtimeScene =
CreateScene("ManagedPipelineCreateCountObservationScene");
GameObject* scriptObject =
runtimeScene->CreateGameObject("ManagedPipelineCreateCountObservationProbe");
ScriptComponent* script =
AddScript(
scriptObject,
"Gameplay",
"ManagedRenderPipelineCreateCountObservationProbe");
ASSERT_NE(script, nullptr);
engine->OnRuntimeStart(runtimeScene);
engine->OnUpdate(0.016f);
const auto bridge =
XCEngine::Rendering::Pipelines::GetManagedRenderPipelineBridge();
ASSERT_NE(bridge, nullptr);
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = {
"GameScripts",
"Gameplay",
"ManagedRenderPipelineProbeAsset"
};
std::shared_ptr<const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetRuntime>
assetRuntime = bridge->CreateAssetRuntime(descriptor);
ASSERT_NE(assetRuntime, nullptr);
const XCEngine::Rendering::RenderContext context = {};
std::unique_ptr<XCEngine::Rendering::RenderPipelineStageRecorder>
firstRecorder = assetRuntime->CreateStageRecorder();
ASSERT_NE(firstRecorder, nullptr);
ASSERT_TRUE(firstRecorder->Initialize(context));
EXPECT_TRUE(
firstRecorder->SupportsStageRenderGraph(
XCEngine::Rendering::CameraFrameStage::MainScene));
std::unique_ptr<XCEngine::Rendering::RenderPipelineStageRecorder>
secondRecorder = assetRuntime->CreateStageRecorder();
ASSERT_NE(secondRecorder, nullptr);
ASSERT_TRUE(secondRecorder->Initialize(context));
EXPECT_TRUE(
secondRecorder->SupportsStageRenderGraph(
XCEngine::Rendering::CameraFrameStage::MainScene));
firstRecorder->Shutdown();
EXPECT_TRUE(
secondRecorder->SupportsStageRenderGraph(
XCEngine::Rendering::CameraFrameStage::MainScene));
engine->OnUpdate(0.016f);
int observedCreatePipelineCallCount = 0;
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedCreatePipelineCallCount",
observedCreatePipelineCallCount));
EXPECT_EQ(observedCreatePipelineCallCount, 1);
secondRecorder->Shutdown();
}
TEST_F(
MonoScriptRuntimeTest,
ManagedRenderPipelineBridgeRuntimeExposesBuiltinForwardRendererAsset) {