Align URP render graph frame data scope
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user