Align URP render graph frame data scope

This commit is contained in:
2026-04-26 20:51:16 +08:00
parent ee05558f86
commit db2d3eb414
13 changed files with 918 additions and 73 deletions

View File

@@ -758,6 +758,271 @@ TEST_F(
host->GetStageRecorder()->Shutdown();
}
TEST_F(
MonoScriptRuntimeTest,
PublicRecordRenderGraphReceivesUniversalFrameDataContextItems) {
Scene* runtimeScene =
CreateScene("ManagedPublicRenderGraphFrameDataScene");
GameObject* selectionObject =
runtimeScene->CreateGameObject(
"ManagedPublicRenderGraphFrameDataSelection");
ScriptComponent* selectionScript =
AddScript(
selectionObject,
"Gameplay",
"ManagedPublicRenderGraphFrameDataRuntimeSelectionProbe");
ASSERT_NE(selectionScript, nullptr);
engine->OnRuntimeStart(runtimeScene);
engine->OnUpdate(0.016f);
XCEngine::Rendering::CameraRenderer renderer;
const auto* asset =
dynamic_cast<
const XCEngine::Rendering::Pipelines::ManagedScriptableRenderPipelineAsset*>(
renderer.GetPipelineAsset());
ASSERT_NE(asset, nullptr);
EXPECT_EQ(asset->GetDescriptor().assemblyName, "GameScripts");
EXPECT_EQ(asset->GetDescriptor().namespaceName, "Gameplay");
EXPECT_EQ(
asset->GetDescriptor().className,
"ManagedPublicRenderGraphFrameDataProbeAsset");
auto* host =
dynamic_cast<XCEngine::Rendering::Pipelines::ScriptableRenderPipelineHost*>(
renderer.GetPipeline());
ASSERT_NE(host, nullptr);
ASSERT_NE(host->GetStageRecorder(), nullptr);
ASSERT_TRUE(
host->GetStageRecorder()->Initialize(
XCEngine::Rendering::RenderContext{}))
<< runtime->GetLastError();
ASSERT_TRUE(
host->SupportsStageRenderGraph(
XCEngine::Rendering::RenderPipelineStageSupportContext{
XCEngine::Rendering::CameraFrameStage::MainScene,
0 }))
<< runtime->GetLastError();
XCEngine::Rendering::RenderGraph graph;
XCEngine::Rendering::RenderGraphBuilder graphBuilder(graph);
XCEngine::Rendering::RenderGraphTextureDesc colorDesc = {};
colorDesc.width = 16u;
colorDesc.height = 16u;
colorDesc.format =
static_cast<XCEngine::Core::uint32>(
XCEngine::RHI::Format::R8G8B8A8_UNorm);
XCEngine::Rendering::RenderGraphTextureDesc depthDesc = colorDesc;
depthDesc.format =
static_cast<XCEngine::Core::uint32>(
XCEngine::RHI::Format::D32_Float);
const XCEngine::Rendering::RenderGraphTextureHandle colorTarget =
graphBuilder.CreateTransientTexture(
"ManagedPublicFrameDataColor",
colorDesc);
const XCEngine::Rendering::RenderGraphTextureHandle depthTarget =
graphBuilder.CreateTransientTexture(
"ManagedPublicFrameDataDepth",
depthDesc);
const XCEngine::Rendering::RenderSceneData sceneData = {};
const XCEngine::Rendering::RenderSurface surface(16u, 16u);
bool executionSucceeded = true;
XCEngine::Rendering::RenderGraphBlackboard blackboard = {};
const XCEngine::Rendering::RenderPipelineStageRenderGraphContext graphContext = {
graphBuilder,
"ManagedPublicFrameData",
XCEngine::Rendering::CameraFrameStage::MainScene,
{},
sceneData,
surface,
nullptr,
nullptr,
XCEngine::RHI::ResourceStates::Common,
{},
{ colorTarget },
depthTarget,
{},
&executionSucceeded,
&blackboard,
XCEngine::Rendering::CameraFrameColorSource::ExplicitSurface,
false,
{},
0
};
EXPECT_TRUE(
host->GetStageRecorder()->RecordStageRenderGraph(graphContext))
<< runtime->GetLastError();
engine->OnUpdate(0.016f);
const auto expectBoolField =
[&](const char* fieldName) {
bool value = false;
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
fieldName,
value));
EXPECT_TRUE(value) << fieldName;
};
expectBoolField("ObservedHasRenderingData");
expectBoolField("ObservedHasCameraData");
expectBoolField("ObservedHasLightingData");
expectBoolField("ObservedHasShadowData");
expectBoolField("ObservedHasEnvironmentData");
expectBoolField("ObservedHasFinalColorData");
expectBoolField("ObservedHasStageColorData");
expectBoolField("ObservedRenderingDataMatchesItems");
int observedStage = -1;
int observedRendererIndex = -1;
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
"ObservedStage",
observedStage));
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
"ObservedRendererIndex",
observedRendererIndex));
EXPECT_EQ(
observedStage,
static_cast<int>(
XCEngine::Rendering::CameraFrameStage::MainScene));
EXPECT_EQ(observedRendererIndex, 0);
host->GetStageRecorder()->Shutdown();
}
TEST_F(
MonoScriptRuntimeTest,
PublicRecordRenderGraphSharesFrameDataAcrossRendererPasses) {
Scene* runtimeScene =
CreateScene("ManagedPublicRenderGraphSharedFrameDataScene");
GameObject* selectionObject =
runtimeScene->CreateGameObject(
"ManagedPublicRenderGraphSharedFrameDataSelection");
ScriptComponent* selectionScript =
AddScript(
selectionObject,
"Gameplay",
"ManagedPublicRenderGraphSharedFrameDataRuntimeSelectionProbe");
ASSERT_NE(selectionScript, nullptr);
engine->OnRuntimeStart(runtimeScene);
engine->OnUpdate(0.016f);
XCEngine::Rendering::CameraRenderer renderer;
const auto* asset =
dynamic_cast<
const XCEngine::Rendering::Pipelines::ManagedScriptableRenderPipelineAsset*>(
renderer.GetPipelineAsset());
ASSERT_NE(asset, nullptr);
EXPECT_EQ(asset->GetDescriptor().assemblyName, "GameScripts");
EXPECT_EQ(asset->GetDescriptor().namespaceName, "Gameplay");
EXPECT_EQ(
asset->GetDescriptor().className,
"ManagedPublicRenderGraphSharedFrameDataProbeAsset");
auto* host =
dynamic_cast<XCEngine::Rendering::Pipelines::ScriptableRenderPipelineHost*>(
renderer.GetPipeline());
ASSERT_NE(host, nullptr);
ASSERT_NE(host->GetStageRecorder(), nullptr);
ASSERT_TRUE(
host->GetStageRecorder()->Initialize(
XCEngine::Rendering::RenderContext{}))
<< runtime->GetLastError();
ASSERT_TRUE(
host->SupportsStageRenderGraph(
XCEngine::Rendering::RenderPipelineStageSupportContext{
XCEngine::Rendering::CameraFrameStage::MainScene,
0 }))
<< runtime->GetLastError();
XCEngine::Rendering::RenderGraph graph;
XCEngine::Rendering::RenderGraphBuilder graphBuilder(graph);
XCEngine::Rendering::RenderGraphTextureDesc colorDesc = {};
colorDesc.width = 16u;
colorDesc.height = 16u;
colorDesc.format =
static_cast<XCEngine::Core::uint32>(
XCEngine::RHI::Format::R8G8B8A8_UNorm);
XCEngine::Rendering::RenderGraphTextureDesc depthDesc = colorDesc;
depthDesc.format =
static_cast<XCEngine::Core::uint32>(
XCEngine::RHI::Format::D32_Float);
const XCEngine::Rendering::RenderGraphTextureHandle colorTarget =
graphBuilder.CreateTransientTexture(
"ManagedPublicSharedFrameDataColor",
colorDesc);
const XCEngine::Rendering::RenderGraphTextureHandle depthTarget =
graphBuilder.CreateTransientTexture(
"ManagedPublicSharedFrameDataDepth",
depthDesc);
const XCEngine::Rendering::RenderSceneData sceneData = {};
const XCEngine::Rendering::RenderSurface surface(16u, 16u);
bool executionSucceeded = true;
XCEngine::Rendering::RenderGraphBlackboard blackboard = {};
const XCEngine::Rendering::RenderPipelineStageRenderGraphContext graphContext = {
graphBuilder,
"ManagedPublicSharedFrameData",
XCEngine::Rendering::CameraFrameStage::MainScene,
{},
sceneData,
surface,
nullptr,
nullptr,
XCEngine::RHI::ResourceStates::Common,
{},
{ colorTarget },
depthTarget,
{},
&executionSucceeded,
&blackboard,
XCEngine::Rendering::CameraFrameColorSource::ExplicitSurface,
false,
{},
0
};
EXPECT_TRUE(
host->GetStageRecorder()->RecordStageRenderGraph(graphContext))
<< runtime->GetLastError();
engine->OnUpdate(0.016f);
const auto expectBoolField =
[&](const char* fieldName) {
bool value = false;
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
fieldName,
value));
EXPECT_TRUE(value) << fieldName;
};
expectBoolField("ObservedWriterVisited");
expectBoolField("ObservedReaderVisited");
expectBoolField("ObservedReaderSawWriterItem");
expectBoolField("ObservedSameFrameData");
expectBoolField("ObservedSameRenderingData");
int observedValue = 0;
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
"ObservedValue",
observedValue));
EXPECT_EQ(observedValue, 73);
int observedReaderOrder = 0;
EXPECT_TRUE(runtime->TryGetFieldValue(
selectionScript,
"ObservedReaderOrder",
observedReaderOrder));
EXPECT_GT(observedReaderOrder, 1);
host->GetStageRecorder()->Shutdown();
}
TEST_F(
MonoScriptRuntimeTest,
DefaultCameraRendererUsesScriptCoreUniversalPipelineAssetAndRespectsRendererData) {