Freeze URP renderer frame plans
This commit is contained in:
@@ -5229,6 +5229,135 @@ TEST_F(
|
||||
pipelineHost->Shutdown();
|
||||
}
|
||||
|
||||
TEST_F(
|
||||
MonoScriptRuntimeTest,
|
||||
ManagedRendererFramePlanFreezesMutablePassStatePerCamera) {
|
||||
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = {
|
||||
"GameScripts",
|
||||
"Gameplay",
|
||||
"ManagedPassQueueIsolationProbeAsset"
|
||||
};
|
||||
|
||||
auto asset =
|
||||
std::make_shared<
|
||||
XCEngine::Rendering::Pipelines::ManagedScriptableRenderPipelineAsset>(
|
||||
descriptor);
|
||||
|
||||
TestRenderDevice device;
|
||||
TestRenderCommandList commandList;
|
||||
TestRenderCommandQueue commandQueue;
|
||||
const XCEngine::Rendering::RenderContext renderContext =
|
||||
CreateRenderContext(
|
||||
device,
|
||||
commandList,
|
||||
commandQueue);
|
||||
|
||||
XCEngine::Rendering::CameraRenderRequest request = {};
|
||||
request.context = renderContext;
|
||||
request.surface = XCEngine::Rendering::RenderSurface(64u, 64u);
|
||||
TestRenderResourceView colorAttachmentView(
|
||||
XCEngine::RHI::ResourceViewType::RenderTarget,
|
||||
XCEngine::RHI::ResourceViewDimension::Texture2D,
|
||||
XCEngine::RHI::Format::R8G8B8A8_UNorm);
|
||||
TestRenderResourceView depthAttachmentView(
|
||||
XCEngine::RHI::ResourceViewType::DepthStencil,
|
||||
XCEngine::RHI::ResourceViewDimension::Texture2D,
|
||||
XCEngine::RHI::Format::D32_Float);
|
||||
request.surface.SetColorAttachment(
|
||||
&colorAttachmentView);
|
||||
request.surface.SetDepthAttachment(
|
||||
&depthAttachmentView);
|
||||
|
||||
XCEngine::Rendering::RenderPipelineHost host(asset);
|
||||
const std::vector<XCEngine::Rendering::CameraFramePlan> plans =
|
||||
host.BuildFramePlans({ request, request });
|
||||
|
||||
ASSERT_EQ(plans.size(), 2u);
|
||||
const XCEngine::Rendering::CameraFramePlan& firstPlan = plans[0];
|
||||
ASSERT_NE(firstPlan.framePlanId, 0u);
|
||||
ASSERT_TRUE(
|
||||
firstPlan.IsFullscreenStageRequested(
|
||||
XCEngine::Rendering::CameraFrameStage::PostProcess));
|
||||
|
||||
auto* pipelineHost =
|
||||
dynamic_cast<XCEngine::Rendering::Pipelines::ScriptableRenderPipelineHost*>(
|
||||
host.GetPipeline());
|
||||
ASSERT_NE(pipelineHost, nullptr);
|
||||
ASSERT_TRUE(
|
||||
pipelineHost->Initialize(
|
||||
renderContext))
|
||||
<< runtime->GetLastError();
|
||||
|
||||
XCEngine::Rendering::RenderGraph graph;
|
||||
XCEngine::Rendering::RenderGraphBuilder graphBuilder(graph);
|
||||
XCEngine::Rendering::RenderGraphTextureDesc colorDesc = {};
|
||||
colorDesc.width = 64u;
|
||||
colorDesc.height = 64u;
|
||||
colorDesc.format =
|
||||
static_cast<XCEngine::Core::uint32>(
|
||||
XCEngine::RHI::Format::R8G8B8A8_UNorm);
|
||||
TestRenderResourceView sourceColorView(
|
||||
XCEngine::RHI::ResourceViewType::ShaderResource,
|
||||
XCEngine::RHI::ResourceViewDimension::Texture2D,
|
||||
XCEngine::RHI::Format::R8G8B8A8_UNorm);
|
||||
const XCEngine::Rendering::RenderGraphTextureHandle sourceColor =
|
||||
graphBuilder.ImportTexture(
|
||||
"ManagedPassQueueIsolationSource",
|
||||
colorDesc,
|
||||
&sourceColorView,
|
||||
{});
|
||||
const XCEngine::Rendering::RenderGraphTextureHandle outputColor =
|
||||
graphBuilder.CreateTransientTexture(
|
||||
"ManagedPassQueueIsolationOutput",
|
||||
colorDesc);
|
||||
|
||||
const XCEngine::Rendering::RenderSceneData sceneData = {};
|
||||
const XCEngine::Rendering::RenderSurface surface(64u, 64u);
|
||||
bool executionSucceeded = true;
|
||||
XCEngine::Rendering::RenderGraphBlackboard blackboard = {};
|
||||
XCEngine::Rendering::EmplaceCameraFrameRenderGraphFrameData(blackboard)
|
||||
.resources.mainScene.color = sourceColor;
|
||||
XCEngine::Rendering::RenderPipelineStageRenderGraphContext graphContext = {
|
||||
graphBuilder,
|
||||
"ManagedPassQueueIsolation",
|
||||
XCEngine::Rendering::CameraFrameStage::PostProcess,
|
||||
renderContext,
|
||||
sceneData,
|
||||
surface,
|
||||
nullptr,
|
||||
nullptr,
|
||||
XCEngine::RHI::ResourceStates::Common,
|
||||
{},
|
||||
{ outputColor },
|
||||
{},
|
||||
{},
|
||||
&executionSucceeded,
|
||||
&blackboard
|
||||
};
|
||||
graphContext.rendererIndex = firstPlan.request.rendererIndex;
|
||||
graphContext.framePlanId = firstPlan.framePlanId;
|
||||
|
||||
EXPECT_TRUE(
|
||||
pipelineHost->RecordStageRenderGraph(
|
||||
graphContext))
|
||||
<< runtime->GetLastError();
|
||||
|
||||
XCEngine::Rendering::CompiledRenderGraph compiledGraph = {};
|
||||
XCEngine::Containers::String errorMessage;
|
||||
ASSERT_TRUE(
|
||||
XCEngine::Rendering::RenderGraphCompiler::Compile(
|
||||
graph,
|
||||
compiledGraph,
|
||||
&errorMessage))
|
||||
<< errorMessage.CStr();
|
||||
ASSERT_EQ(compiledGraph.GetPassCount(), 1u);
|
||||
EXPECT_STREQ(
|
||||
compiledGraph.GetPassName(0).CStr(),
|
||||
"ManagedPassQueueIsolation.First");
|
||||
|
||||
pipelineHost->Shutdown();
|
||||
}
|
||||
|
||||
TEST_F(
|
||||
MonoScriptRuntimeTest,
|
||||
ManagedPlanningContextRejectsNonFullscreenStageRequests) {
|
||||
|
||||
Reference in New Issue
Block a user