Freeze URP renderer frame plans

This commit is contained in:
2026-04-27 23:12:36 +08:00
parent 45fede0b76
commit 87df14f47b
5 changed files with 342 additions and 61 deletions

View File

@@ -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) {