refactor(srp): add asset runtime invalidation seam

This commit is contained in:
2026-04-20 03:06:04 +08:00
parent d196ec9264
commit 59f2249e07
6 changed files with 554 additions and 14 deletions

View File

@@ -1171,6 +1171,8 @@ TEST_F(
bool hasUniversalRequestContextHasDirectionalShadowExtension = false;
bool hasUniversalRequestContextClearDirectionalShadowExtension = false;
bool hasPublicPipelineAssetConfigureCameraFramePlan = false;
bool hasPipelineAssetSetDirty = false;
bool hasPipelineAssetGetRuntimeResourceVersion = false;
bool hasPlanningContextType = false;
bool hasRendererFeatureConfigureCameraFramePlan = false;
bool hasRendererRecordingContextType = false;
@@ -1262,6 +1264,14 @@ TEST_F(
selectionScript,
"HasPublicPipelineAssetConfigureCameraFramePlan",
hasPublicPipelineAssetConfigureCameraFramePlan));
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
"HasPipelineAssetSetDirty",
hasPipelineAssetSetDirty));
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
"HasPipelineAssetGetRuntimeResourceVersion",
hasPipelineAssetGetRuntimeResourceVersion));
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
"HasPlanningContextType",
@@ -1338,6 +1348,8 @@ TEST_F(
EXPECT_FALSE(hasUniversalRequestContextHasDirectionalShadowExtension);
EXPECT_FALSE(hasUniversalRequestContextClearDirectionalShadowExtension);
EXPECT_TRUE(hasPublicPipelineAssetConfigureCameraFramePlan);
EXPECT_TRUE(hasPipelineAssetSetDirty);
EXPECT_TRUE(hasPipelineAssetGetRuntimeResourceVersion);
EXPECT_TRUE(hasPlanningContextType);
EXPECT_TRUE(hasRendererFeatureConfigureCameraFramePlan);
EXPECT_TRUE(hasRendererRecordingContextType);
@@ -3258,6 +3270,107 @@ TEST_F(
recorder->Shutdown();
}
TEST_F(
MonoScriptRuntimeTest,
ManagedRenderPipelineBridgeRebuildsPipelineAfterAssetInvalidation) {
Scene* runtimeScene =
CreateScene("ManagedAssetInvalidationScene");
GameObject* selectionObject =
runtimeScene->CreateGameObject(
"ManagedAssetInvalidationSelection");
ScriptComponent* selectionScript =
AddScript(
selectionObject,
"Gameplay",
"ManagedAssetInvalidationRuntimeSelectionProbe");
ASSERT_NE(selectionScript, nullptr);
GameObject* observationObject =
runtimeScene->CreateGameObject(
"ManagedAssetInvalidationObservation");
ScriptComponent* observationScript =
AddScript(
observationObject,
"Gameplay",
"ManagedAssetInvalidationObservationProbe");
ASSERT_NE(observationScript, nullptr);
engine->OnRuntimeStart(runtimeScene);
engine->OnUpdate(0.016f);
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor
descriptor =
XCEngine::Rendering::Pipelines::GetConfiguredManagedRenderPipelineAssetDescriptor();
ASSERT_TRUE(descriptor.IsValid());
ASSERT_NE(descriptor.managedAssetHandle, 0u);
EXPECT_EQ(descriptor.assemblyName, "GameScripts");
EXPECT_EQ(descriptor.namespaceName, "Gameplay");
EXPECT_EQ(descriptor.className, "ManagedAssetInvalidationProbeAsset");
const auto bridge =
XCEngine::Rendering::Pipelines::GetManagedRenderPipelineBridge();
ASSERT_NE(bridge, nullptr);
std::shared_ptr<const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetRuntime>
assetRuntime = bridge->CreateAssetRuntime(descriptor);
ASSERT_NE(assetRuntime, nullptr);
std::unique_ptr<XCEngine::Rendering::RenderPipelineStageRecorder>
recorder = assetRuntime->CreateStageRecorder();
ASSERT_NE(recorder, nullptr);
const XCEngine::Rendering::RenderContext context = {};
ASSERT_TRUE(recorder->Initialize(context));
ASSERT_TRUE(
recorder->SupportsStageRenderGraph(
XCEngine::Rendering::CameraFrameStage::MainScene));
ASSERT_FALSE(
recorder->SupportsStageRenderGraph(
XCEngine::Rendering::CameraFrameStage::PostProcess));
engine->OnUpdate(0.016f);
ASSERT_FALSE(
recorder->SupportsStageRenderGraph(
XCEngine::Rendering::CameraFrameStage::MainScene));
ASSERT_TRUE(
recorder->SupportsStageRenderGraph(
XCEngine::Rendering::CameraFrameStage::PostProcess));
engine->OnUpdate(0.016f);
EXPECT_TRUE(runtime->GetLastError().empty()) << runtime->GetLastError();
int observedCreatePipelineCallCount = 0;
int observedDisposePipelineCallCount = 0;
int observedInvalidateAssetCallCount = 0;
int observedLastCreatedSupportedStage = 0;
EXPECT_TRUE(runtime->TryGetFieldValue(
observationScript,
"ObservedCreatePipelineCallCount",
observedCreatePipelineCallCount));
EXPECT_TRUE(runtime->TryGetFieldValue(
observationScript,
"ObservedDisposePipelineCallCount",
observedDisposePipelineCallCount));
EXPECT_TRUE(runtime->TryGetFieldValue(
observationScript,
"ObservedInvalidateAssetCallCount",
observedInvalidateAssetCallCount));
EXPECT_TRUE(runtime->TryGetFieldValue(
observationScript,
"ObservedLastCreatedSupportedStage",
observedLastCreatedSupportedStage));
EXPECT_EQ(observedCreatePipelineCallCount, 2);
EXPECT_EQ(observedDisposePipelineCallCount, 1);
EXPECT_EQ(observedInvalidateAssetCallCount, 1);
EXPECT_EQ(
observedLastCreatedSupportedStage,
static_cast<int>(
XCEngine::Rendering::CameraFrameStage::PostProcess));
recorder->Shutdown();
}
TEST_F(
MonoScriptRuntimeTest,
ManagedStageRecorderRecordsMainSceneThroughScriptableRenderContext) {