refactor(srp): add asset runtime invalidation seam
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user