Serialize managed SRP asset graphs

This commit is contained in:
2026-04-27 19:35:17 +08:00
parent 8353da05e5
commit c0b670b052
10 changed files with 1568 additions and 25 deletions

View File

@@ -529,6 +529,156 @@ TEST_F(
"Gameplay.RenderPipelineApiProbeAsset");
}
TEST_F(
MonoScriptRuntimeTest,
ManagedGraphicsSettingsMaterializesSerializedUniversalAssetGraphWithoutExistingHandle) {
Scene* runtimeScene =
CreateScene("SerializedUniversalRenderPipelineAssetGraphScene");
GameObject* scriptObject =
runtimeScene->CreateGameObject(
"SerializedUniversalRenderPipelineAssetGraphProbe");
ScriptComponent* script =
AddScript(
scriptObject,
"Gameplay",
"SerializedUniversalRenderPipelineAssetGraphProbe");
ASSERT_NE(script, nullptr);
engine->OnRuntimeStart(runtimeScene);
engine->OnUpdate(0.016f);
XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor
descriptor =
XCEngine::Rendering::Pipelines::
GetConfiguredManagedRenderPipelineAssetDescriptor();
ASSERT_TRUE(descriptor.IsValid());
ASSERT_EQ(
descriptor.assemblyName,
"XCEngine.RenderPipelines.Universal");
ASSERT_EQ(
descriptor.namespaceName,
"XCEngine.Rendering.Universal");
ASSERT_EQ(
descriptor.className,
"UniversalRenderPipelineAsset");
ASSERT_NE(descriptor.managedAssetHandle, 0u);
ASSERT_FALSE(descriptor.serializedAssetGraph.empty());
runtime->ReleaseExternalManagedObject(descriptor.managedAssetHandle);
descriptor.managedAssetHandle = 0u;
XCEngine::Rendering::Pipelines::
SetConfiguredManagedRenderPipelineAssetDescriptor(descriptor);
{
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);
XCEngine::Rendering::FinalColorSettings settings = {};
ASSERT_TRUE(assetRuntime->TryGetDefaultFinalColorSettings(settings));
EXPECT_FLOAT_EQ(settings.finalColorScale.x, 0.90f);
EXPECT_FLOAT_EQ(settings.finalColorScale.y, 1.10f);
EXPECT_FLOAT_EQ(settings.finalColorScale.z, 1.20f);
EXPECT_FLOAT_EQ(settings.finalColorScale.w, 1.0f);
std::unique_ptr<XCEngine::Rendering::RenderPipelineStageRecorder>
recorder = assetRuntime->CreateStageRecorder();
ASSERT_NE(recorder, nullptr);
const XCEngine::Rendering::RenderContext context = {};
ASSERT_TRUE(recorder->Initialize(context));
EXPECT_TRUE(
recorder->SupportsStageRenderGraph(
XCEngine::Rendering::CameraFrameStage::MainScene));
EXPECT_FALSE(
recorder->SupportsStageRenderGraph(
XCEngine::Rendering::CameraFrameStage::PostProcess));
recorder->Shutdown();
}
engine->OnUpdate(0.016f);
engine->OnUpdate(0.016f);
EXPECT_TRUE(runtime->GetLastError().empty()) << runtime->GetLastError();
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor
resolvedDescriptor =
XCEngine::Rendering::Pipelines::
GetConfiguredManagedRenderPipelineAssetDescriptor();
EXPECT_NE(resolvedDescriptor.managedAssetHandle, 0u);
EXPECT_FALSE(resolvedDescriptor.serializedAssetGraph.empty());
int updateCount = 0;
bool observedAssetWasNull = true;
int observedDefaultRendererIndex = -1;
int observedRendererDataCount = 0;
int observedRendererFeatureCount = 0;
bool observedFeatureActive = true;
std::string observedFeatureTypeName;
XCEngine::Math::Vector4 observedColorScale = {};
bool observedShadowsSupportMainLight = true;
XCEngine::Math::Vector4 observedFinalColorScale = {};
EXPECT_TRUE(runtime->TryGetFieldValue(script, "UpdateCount", updateCount));
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedAssetWasNull",
observedAssetWasNull));
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedDefaultRendererIndex",
observedDefaultRendererIndex));
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedRendererDataCount",
observedRendererDataCount));
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedRendererFeatureCount",
observedRendererFeatureCount));
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedFeatureActive",
observedFeatureActive));
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedFeatureTypeName",
observedFeatureTypeName));
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedColorScale",
observedColorScale));
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedShadowsSupportMainLight",
observedShadowsSupportMainLight));
EXPECT_TRUE(runtime->TryGetFieldValue(
script,
"ObservedFinalColorScale",
observedFinalColorScale));
EXPECT_GE(updateCount, 2);
EXPECT_FALSE(observedAssetWasNull);
EXPECT_EQ(observedDefaultRendererIndex, 0);
EXPECT_EQ(observedRendererDataCount, 1);
EXPECT_EQ(observedRendererFeatureCount, 1);
EXPECT_FALSE(observedFeatureActive);
EXPECT_EQ(
observedFeatureTypeName,
"XCEngine.Rendering.Universal.ColorScalePostProcessRendererFeature");
EXPECT_FLOAT_EQ(observedColorScale.x, 0.42f);
EXPECT_FLOAT_EQ(observedColorScale.y, 0.51f);
EXPECT_FLOAT_EQ(observedColorScale.z, 0.63f);
EXPECT_FLOAT_EQ(observedColorScale.w, 1.0f);
EXPECT_FALSE(observedShadowsSupportMainLight);
EXPECT_FLOAT_EQ(observedFinalColorScale.x, 0.90f);
EXPECT_FLOAT_EQ(observedFinalColorScale.y, 1.10f);
EXPECT_FLOAT_EQ(observedFinalColorScale.z, 1.20f);
EXPECT_FLOAT_EQ(observedFinalColorScale.w, 1.0f);
}
TEST_F(
MonoScriptRuntimeTest,
RuntimeStopClearsManagedGraphicsSettingsSelection) {