From 40bf945cefb75deaea08fcc8d6788ef96108366e Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Tue, 21 Apr 2026 13:12:43 +0800 Subject: [PATCH] refactor(srp): clear legacy fullscreen stages before managed planning --- ...anningOwnershipPlan_完成归档_2026-04-21.md | 51 +++++++++++++++++++ .../RendererBackedRenderPipelineAsset.cs | 15 ++++++ 2 files changed, 66 insertions(+) create mode 100644 docs/used/SRP_UniversalManagedFullscreenPlanningOwnershipPlan_完成归档_2026-04-21.md diff --git a/docs/used/SRP_UniversalManagedFullscreenPlanningOwnershipPlan_完成归档_2026-04-21.md b/docs/used/SRP_UniversalManagedFullscreenPlanningOwnershipPlan_完成归档_2026-04-21.md new file mode 100644 index 00000000..6fd46159 --- /dev/null +++ b/docs/used/SRP_UniversalManagedFullscreenPlanningOwnershipPlan_完成归档_2026-04-21.md @@ -0,0 +1,51 @@ +# SRP Universal Managed Fullscreen Planning Ownership Plan 2026-04-21 + +## Goal + +Make renderer-backed managed pipelines explicitly own fullscreen stage planning by clearing native legacy fullscreen stage state before managed renderer planning runs. + +## Why This Stage + +The previous stage removed renderer-level fullscreen heuristics, but one legacy seam is still present: + +1. native camera-frame policy can prebuild post-process and final-output fullscreen state; +2. managed URP then reshapes or replaces that state later; +3. ownership is therefore still mixed during plan construction. + +For a Unity-style SRP/URP direction, renderer-backed managed assets should start from a clean fullscreen-stage slate and let managed renderer data/features re-declare the stages they need. + +## Scope + +Included: + +1. clear legacy `PostProcess` and `FinalOutput` stage state at the start of renderer-backed managed planning; +2. keep this behavior overridable in the renderer-backed asset base; +3. rebuild `XCEditor` and run old editor smoke. + +Not included: + +1. removing native final-color policy resolution; +2. deleting native fullscreen pass implementations; +3. deleting legacy fullscreen planning for non-managed pipelines; +4. deferred renderer work. + +## Acceptance + +This stage is complete when: + +1. renderer-backed managed pipelines begin planning with cleared legacy fullscreen stage state; +2. managed URP still reconstructs the required fullscreen stages through renderer features; +3. `XCEditor` build passes; +4. 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:11:41] [INFO] [General] [SceneLoadTrace] SceneReady elapsed_ms=6597 first_frame_ms=757 peak_pending_async=9` diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs index 262208d9..12c4b56c 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/RendererBackedRenderPipelineAsset.cs @@ -51,6 +51,16 @@ namespace XCEngine.Rendering.Universal protected override void ConfigureCameraFramePlan( ScriptableRenderPipelinePlanningContext context) { + if (UsesExplicitFullscreenStagePlanning() && + context != null) + { + // Renderer-backed SRP owns fullscreen stage planning explicitly. + context.ClearFullscreenStage( + CameraFrameStage.PostProcess); + context.ClearFullscreenStage( + CameraFrameStage.FinalOutput); + } + ScriptableRendererData resolvedRendererData = ResolveRendererData(context); if (resolvedRendererData != null) @@ -220,6 +230,11 @@ namespace XCEngine.Rendering.Universal return null; } + protected virtual bool UsesExplicitFullscreenStagePlanning() + { + return true; + } + internal ScriptableRendererData GetDefaultRendererData() { return ResolveSelectedRendererData();