fix(rendering): refresh managed pipelines on srp environment changes

This commit is contained in:
2026-04-18 01:10:45 +08:00
parent e388b6fbe3
commit df02a4e741
5 changed files with 140 additions and 3 deletions

View File

@@ -4912,6 +4912,37 @@ TEST(CameraRenderer_Test, DefaultPipelineAssetUsesManagedSelectionWhenPresent) {
Pipelines::ClearManagedRenderPipelineAssetDescriptor();
}
TEST(CameraRenderer_Test, DefaultPipelineAssetRefreshesWhenManagedSelectionChanges) {
Pipelines::ClearManagedRenderPipelineAssetDescriptor();
CameraRenderer renderer;
EXPECT_EQ(
dynamic_cast<const Pipelines::ManagedScriptableRenderPipelineAsset*>(
renderer.GetPipelineAsset()),
nullptr);
const Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = {
"GameScripts",
"Gameplay",
"ManagedRenderPipelineProbeAsset"
};
Pipelines::SetManagedRenderPipelineAssetDescriptor(descriptor);
auto* managedAsset =
dynamic_cast<const Pipelines::ManagedScriptableRenderPipelineAsset*>(
renderer.GetPipelineAsset());
ASSERT_NE(managedAsset, nullptr);
EXPECT_EQ(managedAsset->GetDescriptor().assemblyName, "GameScripts");
EXPECT_EQ(managedAsset->GetDescriptor().namespaceName, "Gameplay");
EXPECT_EQ(managedAsset->GetDescriptor().className, "ManagedRenderPipelineProbeAsset");
Pipelines::ClearManagedRenderPipelineAssetDescriptor();
EXPECT_EQ(
dynamic_cast<const Pipelines::ManagedScriptableRenderPipelineAsset*>(
renderer.GetPipelineAsset()),
nullptr);
}
TEST(CameraRenderer_Test, RebindsToResolvedDefaultAssetWhenPreferredAssetCannotCreatePipeline) {
const Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = {
"GameScripts",
@@ -4941,6 +4972,40 @@ TEST(CameraRenderer_Test, RebindsToResolvedDefaultAssetWhenPreferredAssetCannotC
Pipelines::ClearManagedRenderPipelineAssetDescriptor();
}
TEST(CameraRenderer_Test, RecreatesManagedPipelineWhenBridgeChanges) {
Pipelines::ClearManagedRenderPipelineBridge();
const Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = {
"GameScripts",
"Gameplay",
"ManagedRenderPipelineProbeAsset"
};
auto firstBridgeState = std::make_shared<MockManagedRenderPipelineBridgeState>();
Pipelines::SetManagedRenderPipelineBridge(
std::make_shared<MockManagedRenderPipelineBridge>(firstBridgeState));
CameraRenderer renderer(
std::make_shared<Pipelines::ManagedScriptableRenderPipelineAsset>(
descriptor));
ASSERT_NE(
dynamic_cast<Pipelines::ScriptableRenderPipelineHost*>(renderer.GetPipeline()),
nullptr);
EXPECT_EQ(firstBridgeState->createAssetRuntimeCalls, 1);
auto secondBridgeState = std::make_shared<MockManagedRenderPipelineBridgeState>();
Pipelines::SetManagedRenderPipelineBridge(
std::make_shared<MockManagedRenderPipelineBridge>(secondBridgeState));
auto* host =
dynamic_cast<Pipelines::ScriptableRenderPipelineHost*>(renderer.GetPipeline());
ASSERT_NE(host, nullptr);
EXPECT_NE(host->GetStageRecorder(), nullptr);
EXPECT_EQ(secondBridgeState->createAssetRuntimeCalls, 1);
Pipelines::ClearManagedRenderPipelineBridge();
}
TEST(SceneRenderer_Test, CreatesPipelineInstancesFromPipelineAssetsAndShutsDownReplacedPipelines) {
Scene scene("SceneRendererAssetScene");