diff --git a/docs/used/SRP_UniversalManagedCameraFramePlanBaselineOwnershipPlan_完成归档_2026-04-21.md b/docs/used/SRP_UniversalManagedCameraFramePlanBaselineOwnershipPlan_完成归档_2026-04-21.md new file mode 100644 index 00000000..0bba6262 --- /dev/null +++ b/docs/used/SRP_UniversalManagedCameraFramePlanBaselineOwnershipPlan_完成归档_2026-04-21.md @@ -0,0 +1,55 @@ +# SRP Universal Managed Camera Frame Plan Baseline Ownership Plan 2026-04-21 + +## Goal + +Detach managed URP from the native `BuiltinDefaultCameraFramePlan` policy and replace it with a minimal native baseline policy that only resolves the data still required before managed planning runs. + +## Why This Stage + +Current SRP work already moved fullscreen stage ownership into managed URP features, but managed URP still references the old native default camera-frame plan policy. + +That default policy still bundles two responsibilities: + +1. resolve final-color policy from pipeline defaults and camera overrides; +2. build native fullscreen stage state and owned fullscreen pass sequences. + +For renderer-backed managed pipelines, responsibility `2` is no longer the right owner. We already clear that legacy state before managed renderer planning runs, so the remaining native need is only the baseline final-color policy resolution. + +## Scope + +Included: + +1. split native camera-frame plan baseline policy from the old default fullscreen-planning policy; +2. register a builtin managed baseline camera-frame policy key; +3. make renderer-backed managed pipelines default to that baseline policy when they own fullscreen stage planning explicitly; +4. remove the explicit `BuiltinDefaultCameraFramePlan` dependency from URP renderer data; +5. rebuild `XCEditor` and run old editor smoke. + +Not included: + +1. deleting the old `BuiltinDefaultCameraFramePlan` policy for non-managed paths; +2. moving final-color policy resolution fully into managed code; +3. deleting native fullscreen pass implementations; +4. deferred renderer work. + +## Acceptance + +This stage is complete when: + +1. managed URP no longer selects `BuiltinDefaultCameraFramePlan`; +2. a dedicated builtin managed baseline policy resolves the native data that managed planning still needs; +3. renderer-backed managed pipelines use that baseline by default when explicit fullscreen stage planning is enabled; +4. `XCEditor` build passes; +5. old editor smoke passes and `editor.log` contains a fresh `SceneReady`. + +## Validation + +Validated on 2026-04-21: + +1. built old editor target with `cmake --build . --config Debug --target XCEditor` from `build/`; +2. launched `editor/bin/Debug/XCEngine.exe` for about 12 seconds; +3. verified fresh `editor/bin/Debug/editor.log` contains `SceneReady`. + +Observed log line: + +`[2026-04-21 13:21:42] [INFO] [General] [SceneLoadTrace] SceneReady elapsed_ms=5834 first_frame_ms=593 peak_pending_async=9` diff --git a/engine/include/XCEngine/Rendering/RenderPipelineAsset.h b/engine/include/XCEngine/Rendering/RenderPipelineAsset.h index 25ebdfa5..3e2b432d 100644 --- a/engine/include/XCEngine/Rendering/RenderPipelineAsset.h +++ b/engine/include/XCEngine/Rendering/RenderPipelineAsset.h @@ -25,6 +25,9 @@ void ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy( void ApplyDefaultRenderPipelineAssetCameraFramePlanPolicy( CameraFramePlan& plan, const FinalColorSettings& pipelineDefaults = FinalColorSettings{}); +void ApplyDefaultRenderPipelineAssetCameraFramePlanBaselinePolicy( + CameraFramePlan& plan, + const FinalColorSettings& pipelineDefaults = FinalColorSettings{}); class RenderPipelineAsset { public: diff --git a/engine/src/Rendering/Internal/RenderPipelineFactory.cpp b/engine/src/Rendering/Internal/RenderPipelineFactory.cpp index b906ce84..2aee2666 100644 --- a/engine/src/Rendering/Internal/RenderPipelineFactory.cpp +++ b/engine/src/Rendering/Internal/RenderPipelineFactory.cpp @@ -220,8 +220,18 @@ void EnsureBuiltinCameraFramePlanPolicyRegistryInitialized() { plan, defaultFinalColorSettings); }); + registry.emplace( + "BuiltinManagedCameraFramePlanBaseline", + [](CameraFramePlan& plan, + const FinalColorSettings& defaultFinalColorSettings) { + ApplyDefaultRenderPipelineAssetCameraFramePlanBaselinePolicy( + plan, + defaultFinalColorSettings); + }); GetBuiltinCameraFramePlanPolicyKeys().insert( "BuiltinDefaultCameraFramePlan"); + GetBuiltinCameraFramePlanPolicyKeys().insert( + "BuiltinManagedCameraFramePlanBaseline"); return true; }(); (void)initialized; diff --git a/engine/src/Rendering/RenderPipelineAsset.cpp b/engine/src/Rendering/RenderPipelineAsset.cpp index 05931a69..44c2a177 100644 --- a/engine/src/Rendering/RenderPipelineAsset.cpp +++ b/engine/src/Rendering/RenderPipelineAsset.cpp @@ -61,15 +61,25 @@ void ApplyDefaultRenderPipelineAssetCameraRenderRequestPolicy( viewportAspect); } -void ApplyDefaultRenderPipelineAssetCameraFramePlanPolicy( +void ApplyDefaultRenderPipelineAssetCameraFramePlanBaselinePolicy( CameraFramePlan& plan, const FinalColorSettings& pipelineDefaults) { if (plan.request.camera != nullptr) { plan.finalColorPolicy = ResolveFinalColorPolicy( pipelineDefaults, &plan.request.camera->GetFinalColorOverrides()); + return; } + plan.finalColorPolicy = {}; +} + +void ApplyDefaultRenderPipelineAssetCameraFramePlanPolicy( + CameraFramePlan& plan, + const FinalColorSettings& pipelineDefaults) { + ApplyDefaultRenderPipelineAssetCameraFramePlanBaselinePolicy( + plan, + pipelineDefaults); Internal::PlanCameraFrameFullscreenStages(plan); } diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs index 12c4b56c..f8876854 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs @@ -104,7 +104,15 @@ namespace XCEngine.Rendering.Universal } } - return base.GetCameraFramePlanPolicyAssetKeyContextual( + string contextualAssetKey = + base.GetCameraFramePlanPolicyAssetKeyContextual( + rendererIndex); + if (!string.IsNullOrEmpty(contextualAssetKey)) + { + return contextualAssetKey; + } + + return GetRendererBackedCameraFramePlanPolicyAssetKey( rendererIndex); } @@ -230,6 +238,15 @@ namespace XCEngine.Rendering.Universal return null; } + protected virtual string + GetRendererBackedCameraFramePlanPolicyAssetKey( + int rendererIndex) + { + return UsesExplicitFullscreenStagePlanning() + ? "BuiltinManagedCameraFramePlanBaseline" + : string.Empty; + } + protected virtual bool UsesExplicitFullscreenStagePlanning() { return true; diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRendererData.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRendererData.cs index be090a42..4a329555 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRendererData.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalRendererData.cs @@ -32,11 +32,6 @@ namespace XCEngine.Rendering.Universal return "BuiltinForward"; } - protected override string GetCameraFramePlanPolicyAssetKey() - { - return "BuiltinDefaultCameraFramePlan"; - } - protected override string GetRenderSceneSetupPolicyAssetKey() { return "BuiltinDefaultSceneSetup";