refactor(srp): remove managed frame planning hook

- derive fullscreen stage planning from pipeline render-graph support
- trim planning-only APIs from the managed SRP bridge and public surface
- update probes and tests to lock the slimmer SRP API boundary
This commit is contained in:
2026-04-19 13:47:20 +08:00
parent 08e2b38df2
commit 537d7d99fc
19 changed files with 179 additions and 517 deletions

View File

@@ -775,7 +775,6 @@ private:
struct MockManagedRenderPipelineAssetRuntimeState {
int createStageRecorderCalls = 0;
int configureCameraRenderRequestCalls = 0;
int configureCameraFramePlanCalls = 0;
int getDefaultFinalColorSettingsCalls = 0;
bool hasDefaultFinalColorSettings = false;
FinalColorSettings defaultFinalColorSettings = {};
@@ -787,7 +786,6 @@ struct MockManagedRenderPipelineAssetRuntimeState {
size_t,
size_t,
const DirectionalShadowPlanningSettings&)> configureCameraRenderRequest = {};
std::function<void(CameraFramePlan&)> configureCameraFramePlan = {};
};
class MockManagedRenderPipelineAssetRuntime final
@@ -824,13 +822,6 @@ public:
}
}
void ConfigureCameraFramePlan(CameraFramePlan& plan) const override {
++m_state->configureCameraFramePlanCalls;
if (m_state->configureCameraFramePlan) {
m_state->configureCameraFramePlan(plan);
}
}
bool TryGetDefaultFinalColorSettings(
FinalColorSettings& settings) const override {
++m_state->getDefaultFinalColorSettingsCalls;
@@ -857,7 +848,6 @@ struct MockManagedRenderPipelineBridgeState {
size_t,
size_t,
const DirectionalShadowPlanningSettings&)> configureCameraRenderRequest = {};
std::function<void(CameraFramePlan&)> configureCameraFramePlan = {};
};
class MockManagedRenderPipelineBridge final
@@ -881,8 +871,6 @@ public:
m_state->defaultFinalColorSettings;
m_state->lastCreatedRuntimeState->configureCameraRenderRequest =
m_state->configureCameraRenderRequest;
m_state->lastCreatedRuntimeState->configureCameraFramePlan =
m_state->configureCameraFramePlan;
return std::make_shared<MockManagedRenderPipelineAssetRuntime>(
m_state->lastCreatedRuntimeState);
}
@@ -4184,6 +4172,51 @@ TEST(RenderPipelineHost_Test, BuildsFramePlansFromRequestsUsingPipelineAssetDefa
EXPECT_FLOAT_EQ(plan.finalColorPolicy.exposureValue, 1.8f);
}
TEST(RenderPipelineHost_Test, PlansFullscreenStagesFromPipelineRenderGraphSupport) {
auto state = std::make_shared<MockPipelineState>();
state->supportsPostProcessRenderGraph = true;
state->supportsFinalOutputRenderGraph = true;
auto allocationState = std::make_shared<MockShadowAllocationState>();
MockShadowView colorView(
allocationState,
XCEngine::RHI::ResourceViewType::RenderTarget,
XCEngine::RHI::Format::R8G8B8A8_UNorm,
XCEngine::RHI::ResourceViewDimension::Texture2D);
MockShadowView depthView(
allocationState,
XCEngine::RHI::ResourceViewType::DepthStencil,
XCEngine::RHI::Format::D24_UNorm_S8_UInt,
XCEngine::RHI::ResourceViewDimension::Texture2D);
CameraRenderRequest request = {};
request.context = CreateValidContext();
request.surface = RenderSurface(320, 180);
request.surface.SetColorAttachment(&colorView);
request.surface.SetDepthAttachment(&depthView);
RenderPipelineHost host(std::make_unique<MockPipeline>(state));
const std::vector<CameraFramePlan> plans =
host.BuildFramePlans({ request });
ASSERT_EQ(plans.size(), 1u);
const CameraFramePlan& plan = plans[0];
EXPECT_TRUE(plan.IsFullscreenStageRequested(CameraFrameStage::PostProcess));
EXPECT_TRUE(plan.IsFullscreenStageRequested(CameraFrameStage::FinalOutput));
EXPECT_EQ(plan.postProcess.passes, nullptr);
EXPECT_EQ(plan.finalOutput.passes, nullptr);
EXPECT_TRUE(plan.UsesGraphManagedSceneColor());
EXPECT_TRUE(plan.UsesGraphManagedOutputColor(CameraFrameStage::PostProcess));
EXPECT_EQ(
plan.ResolveStageColorSource(CameraFrameStage::PostProcess),
CameraFrameColorSource::MainSceneColor);
EXPECT_EQ(
plan.ResolveStageColorSource(CameraFrameStage::FinalOutput),
CameraFrameColorSource::PostProcessColor);
EXPECT_TRUE(plan.IsPostProcessStageValid());
EXPECT_TRUE(plan.IsFinalOutputStageValid());
}
TEST(RenderPipelineHost_Test, ForwardsPipelineLifetimeAndRenderCallsToCameraRenderer) {
Scene scene("RenderPipelineHostScene");
@@ -4569,80 +4602,6 @@ TEST(ManagedScriptableRenderPipelineAsset_Test, CreatesHostWithStageRecorderFrom
Pipelines::ClearManagedRenderPipelineBridge();
}
TEST(ManagedScriptableRenderPipelineAsset_Test, LetsManagedBridgeRequestFullscreenStagesDuringPlanConfiguration) {
Pipelines::ClearManagedRenderPipelineBridge();
const Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = {
"GameScripts",
"Gameplay",
"ManagedPlannedFullscreenRenderPipelineProbeAsset"
};
auto bridgeState = std::make_shared<MockManagedRenderPipelineBridgeState>();
bridgeState->configureCameraFramePlan = [](
CameraFramePlan& plan) {
plan.ClearFullscreenStage(CameraFrameStage::PostProcess);
plan.ClearFullscreenStage(CameraFrameStage::FinalOutput);
EXPECT_TRUE(
plan.RequestFullscreenStage(
CameraFrameStage::PostProcess,
CameraFrameColorSource::MainSceneColor,
true));
EXPECT_TRUE(
plan.RequestFullscreenStage(
CameraFrameStage::FinalOutput,
CameraFrameColorSource::PostProcessColor));
};
Pipelines::SetManagedRenderPipelineBridge(
std::make_shared<MockManagedRenderPipelineBridge>(bridgeState));
auto allocationState = std::make_shared<MockShadowAllocationState>();
MockShadowView colorView(
allocationState,
XCEngine::RHI::ResourceViewType::RenderTarget,
XCEngine::RHI::Format::R8G8B8A8_UNorm,
XCEngine::RHI::ResourceViewDimension::Texture2D);
MockShadowView depthView(
allocationState,
XCEngine::RHI::ResourceViewType::DepthStencil,
XCEngine::RHI::Format::D24_UNorm_S8_UInt,
XCEngine::RHI::ResourceViewDimension::Texture2D);
CameraRenderRequest request = {};
request.context = CreateValidContext();
request.surface = RenderSurface(320, 180);
request.surface.SetColorAttachment(&colorView);
request.surface.SetDepthAttachment(&depthView);
CameraFramePlan plan = CameraFramePlan::FromRequest(request);
Pipelines::ManagedScriptableRenderPipelineAsset asset(descriptor);
asset.ConfigureCameraFramePlan(plan);
EXPECT_EQ(bridgeState->createAssetRuntimeCalls, 1);
ASSERT_NE(bridgeState->lastCreatedRuntimeState, nullptr);
EXPECT_EQ(
bridgeState->lastCreatedRuntimeState->configureCameraFramePlanCalls,
1);
EXPECT_EQ(bridgeState->lastDescriptor.assemblyName, "GameScripts");
EXPECT_EQ(bridgeState->lastDescriptor.namespaceName, "Gameplay");
EXPECT_EQ(bridgeState->lastDescriptor.className, "ManagedPlannedFullscreenRenderPipelineProbeAsset");
EXPECT_TRUE(plan.IsFullscreenStageRequested(CameraFrameStage::PostProcess));
EXPECT_TRUE(plan.IsFullscreenStageRequested(CameraFrameStage::FinalOutput));
EXPECT_EQ(plan.postProcess.passes, nullptr);
EXPECT_EQ(plan.finalOutput.passes, nullptr);
EXPECT_TRUE(plan.UsesGraphManagedSceneColor());
EXPECT_TRUE(plan.UsesGraphManagedOutputColor(CameraFrameStage::PostProcess));
EXPECT_EQ(
plan.ResolveStageColorSource(CameraFrameStage::PostProcess),
CameraFrameColorSource::MainSceneColor);
EXPECT_EQ(
plan.ResolveStageColorSource(CameraFrameStage::FinalOutput),
CameraFrameColorSource::PostProcessColor);
EXPECT_TRUE(plan.IsPostProcessStageValid());
EXPECT_TRUE(plan.IsFinalOutputStageValid());
Pipelines::ClearManagedRenderPipelineBridge();
}
TEST(ManagedScriptableRenderPipelineAsset_Test, LetsManagedBridgeConfigureCameraRenderRequests) {
Pipelines::ClearManagedRenderPipelineBridge();
@@ -4755,7 +4714,7 @@ TEST(ManagedScriptableRenderPipelineAsset_Test, LetsManagedBridgeProvideDefaultF
Pipelines::ClearManagedRenderPipelineBridge();
}
TEST(ManagedScriptableRenderPipelineAsset_Test, ReusesManagedAssetRuntimeAcrossPipelineRequestAndPlanRequests) {
TEST(ManagedScriptableRenderPipelineAsset_Test, ReusesManagedAssetRuntimeAcrossPipelineAndRequestCalls) {
Pipelines::ClearManagedRenderPipelineBridge();
const Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = {
@@ -4796,16 +4755,11 @@ TEST(ManagedScriptableRenderPipelineAsset_Test, ReusesManagedAssetRuntimeAcrossP
1u,
2u,
DirectionalShadowPlanningSettings{});
CameraFramePlan firstPlan = CameraFramePlan::FromRequest(request);
CameraFramePlan secondPlan = CameraFramePlan::FromRequest(request);
asset.ConfigureCameraFramePlan(firstPlan);
asset.ConfigureCameraFramePlan(secondPlan);
EXPECT_EQ(bridgeState->createAssetRuntimeCalls, 1);
EXPECT_EQ(runtimeState->configureCameraRenderRequestCalls, 1);
EXPECT_EQ(runtimeState->lastRenderedBaseCameraCount, 1u);
EXPECT_EQ(runtimeState->lastRenderedRequestCount, 2u);
EXPECT_EQ(runtimeState->configureCameraFramePlanCalls, 2);
Pipelines::ClearManagedRenderPipelineBridge();
}