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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user