refactor(srp): formalize universal renderer selection and caching

This commit is contained in:
2026-04-20 00:16:32 +08:00
parent ad32d64269
commit cbc0ddbd42
6 changed files with 379 additions and 38 deletions

View File

@@ -2522,6 +2522,36 @@ TEST_F(
nullptr);
}
TEST_F(
MonoScriptRuntimeTest,
ManagedRenderPipelineBridgeFallsBackToFirstRendererWhenDefaultRendererIndexIsInvalid) {
const auto bridge =
XCEngine::Rendering::Pipelines::GetManagedRenderPipelineBridge();
ASSERT_NE(bridge, nullptr);
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = {
"GameScripts",
"Gameplay",
"ManagedInvalidDefaultRendererSelectionProbeAsset"
};
std::shared_ptr<const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetRuntime>
assetRuntime = bridge->CreateAssetRuntime(descriptor);
ASSERT_NE(assetRuntime, nullptr);
const std::shared_ptr<const XCEngine::Rendering::RenderPipelineAsset>
rendererAsset = assetRuntime->GetPipelineRendererAsset();
ASSERT_NE(rendererAsset, nullptr);
std::unique_ptr<XCEngine::Rendering::RenderPipeline> pipeline =
rendererAsset->CreatePipeline();
ASSERT_NE(pipeline, nullptr);
EXPECT_NE(
dynamic_cast<XCEngine::Rendering::Pipelines::BuiltinForwardPipeline*>(
pipeline.get()),
nullptr);
}
TEST_F(
MonoScriptRuntimeTest,
ManagedRenderPipelineBridgeFallsBackToDefaultSceneRecorderWhenBackendKeyIsUnknown) {
@@ -2613,6 +2643,66 @@ TEST_F(
recorder->Shutdown();
}
TEST_F(
MonoScriptRuntimeTest,
ManagedRenderPipelineBridgeReusesRendererInstanceAcrossManagedPipelineCreations) {
const auto bridge =
XCEngine::Rendering::Pipelines::GetManagedRenderPipelineBridge();
ASSERT_NE(bridge, nullptr);
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = {
"GameScripts",
"Gameplay",
"ManagedRendererReuseProbeAsset"
};
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));
ASSERT_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));
ASSERT_TRUE(
secondRecorder->SupportsStageRenderGraph(
XCEngine::Rendering::CameraFrameStage::MainScene));
Scene* runtimeScene =
CreateScene("ManagedRendererReuseObservationScene");
GameObject* scriptObject =
runtimeScene->CreateGameObject("ManagedRendererReuseObservationProbe");
ScriptComponent* script =
AddScript(
scriptObject,
"Gameplay",
"ManagedRendererReuseObservationProbe");
ASSERT_NE(script, nullptr);
engine->OnRuntimeStart(runtimeScene);
engine->OnUpdate(0.016f);
int observedCreateRendererCallCount = 0;
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedCreateRendererCallCount",
observedCreateRendererCallCount));
EXPECT_EQ(observedCreateRendererCallCount, 1);
firstRecorder->Shutdown();
secondRecorder->Shutdown();
}
TEST_F(
MonoScriptRuntimeTest,
ManagedStageRecorderRecordsMainSceneThroughScriptableRenderContext) {