From 20e727e88284c26199d50b3dbe5cc3dab0f05aa9 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sun, 19 Apr 2026 17:00:48 +0800 Subject: [PATCH] refactor(srp): close universal recording composition seam --- ...录制组合边界收口计划_完成归档_2026-04-19.md | 139 +++++++++++ ...SRP_核心层与首方渲染管线拆层计划_完成归档_2026-04-19.md} | 0 managed/GameScripts/RenderPipelineApiProbe.cs | 236 ++++++++++-------- .../ScriptableRenderContextApiSurfaceProbe.cs | 12 + .../Rendering/Universal/ScriptableRenderer.cs | 4 +- .../Universal/UniversalRenderPipelineAsset.cs | 2 +- tests/scripting/test_mono_script_runtime.cpp | 24 +- 7 files changed, 305 insertions(+), 112 deletions(-) create mode 100644 docs/used/SRP_Universal阶段录制组合边界收口计划_完成归档_2026-04-19.md rename docs/{plan/SRP_核心层与首方渲染管线拆层计划_2026-04-19.md => used/SRP_核心层与首方渲染管线拆层计划_完成归档_2026-04-19.md} (100%) diff --git a/docs/used/SRP_Universal阶段录制组合边界收口计划_完成归档_2026-04-19.md b/docs/used/SRP_Universal阶段录制组合边界收口计划_完成归档_2026-04-19.md new file mode 100644 index 00000000..a187fd0c --- /dev/null +++ b/docs/used/SRP_Universal阶段录制组合边界收口计划_完成归档_2026-04-19.md @@ -0,0 +1,139 @@ +# SRP Universal 阶段录制组合边界收口计划 2026-04-19 + +## 1. 阶段目标 + +上一阶段已经完成: + +1. `Universal` 的 raw context/request extension surface 收口 +2. 录制 helper 回收到 `ScriptableRenderPass` / `ScriptableRendererFeature` / `ScriptableRendererData` +3. `XCEditor`、脚本测试、渲染测试、编辑器测试和 10s 冒烟通过 + +这一阶段不新增渲染特性,继续收口 `Universal` 包里的 stage recording seam。 + +本阶段目标是把当前这条链: + +`ScriptableRenderPipeline -> ScriptableRenderer -> PassQueue` + +从“外部也能直接拿来拼装”的状态, +收成更明确的“包层内部组合点”。 + +--- + +## 2. 当前问题 + +### 2.1 `UniversalRenderPipeline` 目前只是一个很薄的 wrapper + +当前 `UniversalRenderPipeline` 的核心只是: + +1. 创建 `ScriptableRenderer` +2. 把 `SupportsStageRenderGraph` +3. 把 `RecordStageRenderGraph` + +直接转发到 renderer。 + +这能工作,但包层组合点还不够正式。 + +### 2.2 `ScriptableRenderer` 目前暴露的是“可直接录制 stage graph” + +当前 `ScriptableRenderer` 直接公开: + +1. `SupportsStageRenderGraph` +2. `RecordStageRenderGraph` + +这意味着: + +1. 外部脚本可以直接把 renderer 当成 stage recorder 来拼 +2. probe 也在复制 `UniversalRenderPipeline` 的这层包装逻辑 +3. `ScriptableRenderer` 更像“native host 需要的录制协议对象”,而不只是首方包里的 renderer authoring 抽象 + +### 2.3 这条 seam 还没有真正变成 package-local contract + +Unity 风格里,用户面对的应该是: + +1. pipeline asset +2. pipeline +3. renderer / feature / pass + +而不是把“stage recorder protocol”直接作为一层显式对外表面长期固化。 + +--- + +## 3. 收口方向 + +本阶段采用的方向是: + +1. 保持 `ScriptableRenderPipeline` core 继续薄 +2. 保持 `UniversalRenderPipelineAsset -> UniversalRenderPipeline` 这条首方包层链 +3. 把 `ScriptableRenderer` 的 stage recording 组合点收成更明确的包内/受保护 API +4. 避免外部 probe 再复制一套“renderer-backed pipeline wrapper”形态 + +原则: + +1. 不回退到旧 wrapper 体系 +2. 不重新引入兼容层 +3. 不把新的 prototype seam 继续公开给用户脚本 + +--- + +## 4. 实施步骤 + +### Step 1:整理 seam 的真实职责 + +目标: + +1. 明确 `ScriptableRenderer` 负责的是 pass queue build + stage record +2. 明确 `UniversalRenderPipeline` 负责的是 renderer lifetime 和 pipeline-level delegation +3. 明确哪些方法应当保留 public,哪些应当降到 `internal/protected` + +### Step 2:重构 `UniversalRenderPipeline` 与 `ScriptableRenderer` 组合边界 + +目标: + +1. 避免外部脚本直接把 renderer 当成 stage recorder 使用 +2. 让 `UniversalRenderPipeline` 通过更明确的 package-local seam 驱动 renderer +3. 保持现有 probe/test 行为不回退 + +### Step 3:收 probe 和 API surface + +目标: + +1. 修改 `RenderPipelineApiProbe.cs` +2. 修改 `ScriptableRenderContextApiSurfaceProbe.cs` +3. 修改 `test_mono_script_runtime.cpp` +4. 固定“用户能看到什么,不能看到什么” + +### Step 4:完整验证 + +目标: + +1. 编译 `XCEditor` +2. 运行相关 `scripting_tests` +3. 运行相关 `rendering_unit_tests` +4. 运行相关 `editor_tests` +5. 做 `editor/bin/Debug/XCEngine.exe` 10s 冒烟并检查 `editor.log` 的 `SceneReady` + +--- + +## 5. 验收标准 + +本阶段完成后应满足: + +1. `Universal` 不再保留“外部可直接复用的 stage recorder seam” +2. `UniversalRenderPipeline` 和 `ScriptableRenderer` 的职责更清楚 +3. probe 不再复制一套长期存在的 renderer-backed pipeline 形态 +4. 现有 SRP/Universal 主链行为不回退 +5. 编译、测试、冒烟全部通过 + +--- + +## 6. 本阶段不做的内容 + +这一阶段明确不做: + +1. deferred pipeline +2. lightmap / baking +3. 阴影/体积/高斯 ownership 迁移 +4. RenderGraph 对用户脚本直接暴露 +5. editor 侧 renderer asset 工作流 + +这一步只处理 `Universal` 的录制组合边界。 diff --git a/docs/plan/SRP_核心层与首方渲染管线拆层计划_2026-04-19.md b/docs/used/SRP_核心层与首方渲染管线拆层计划_完成归档_2026-04-19.md similarity index 100% rename from docs/plan/SRP_核心层与首方渲染管线拆层计划_2026-04-19.md rename to docs/used/SRP_核心层与首方渲染管线拆层计划_完成归档_2026-04-19.md diff --git a/managed/GameScripts/RenderPipelineApiProbe.cs b/managed/GameScripts/RenderPipelineApiProbe.cs index b2d233bf..815416a0 100644 --- a/managed/GameScripts/RenderPipelineApiProbe.cs +++ b/managed/GameScripts/RenderPipelineApiProbe.cs @@ -318,7 +318,7 @@ namespace Gameplay } } - internal sealed class ProbeSceneRenderer : ScriptableRenderer + internal class ProbeSceneRenderer : ScriptableRenderer { public ProbeSceneRenderer( Action onOpaqueRecorded = null) @@ -327,7 +327,7 @@ namespace Gameplay } } - internal sealed class ProbePostProcessRenderer : ScriptableRenderer + internal class ProbePostProcessRenderer : ScriptableRenderer { public ProbePostProcessRenderer( Vector4 firstVectorPayload, @@ -348,7 +348,7 @@ namespace Gameplay } } - internal sealed class ProbeUniversalRenderer : ScriptableRenderer + internal class ProbeUniversalRenderer : ScriptableRenderer { public ProbeUniversalRenderer( Vector4 postProcessScale, @@ -363,7 +363,7 @@ namespace Gameplay } } - internal sealed class ProbePlannedFullscreenRenderer : ScriptableRenderer + internal class ProbePlannedFullscreenRenderer : ScriptableRenderer { public ProbePlannedFullscreenRenderer() { @@ -709,7 +709,7 @@ namespace Gameplay } } - internal sealed class CameraDataObservationRenderer + internal class CameraDataObservationRenderer : ScriptableRenderer { public CameraDataObservationRenderer() @@ -801,7 +801,7 @@ namespace Gameplay } } - internal sealed class StageColorObservationRenderer + internal class StageColorObservationRenderer : ScriptableRenderer { public StageColorObservationRenderer() @@ -817,37 +817,77 @@ namespace Gameplay } } - public abstract class ProbeRendererPipeline - : ScriptableRenderPipeline + internal abstract class ProbeRendererData + : ScriptableRendererData { - private ScriptableRenderer m_renderer; - - protected abstract ScriptableRenderer CreateRenderer(); - - protected override bool SupportsStageRenderGraph( - CameraFrameStage stage) + protected sealed override ScriptableRenderer CreateRenderer() { - ScriptableRenderer renderer = GetOrCreateRenderer(); - return renderer != null && - renderer.SupportsStageRenderGraph(stage); + return CreateProbeRenderer(); } - protected override bool RecordStageRenderGraph( - ScriptableRenderContext context) + protected abstract ScriptableRenderer CreateProbeRenderer(); + } + + internal sealed class ManagedRenderPipelineProbeRendererData + : ProbeRendererData + { + protected override ScriptableRenderer CreateProbeRenderer() { - ScriptableRenderer renderer = GetOrCreateRenderer(); - return renderer != null && - renderer.RecordStageRenderGraph(context); + return new ManagedRenderPipelineProbe(); + } + } + + internal sealed class ManagedPostProcessRenderPipelineProbeRendererData + : ProbeRendererData + { + protected override ScriptableRenderer CreateProbeRenderer() + { + return new ManagedPostProcessRenderPipelineProbe(); + } + } + + internal sealed class ManagedUniversalRenderPipelineProbeRendererData + : ProbeRendererData + { + private readonly Vector4 m_postProcessScale; + + public ManagedUniversalRenderPipelineProbeRendererData( + Vector4 postProcessScale) + { + m_postProcessScale = postProcessScale; } - private ScriptableRenderer GetOrCreateRenderer() + protected override ScriptableRenderer CreateProbeRenderer() { - if (m_renderer == null) - { - m_renderer = CreateRenderer(); - } + return new ManagedUniversalRenderPipelineProbe( + m_postProcessScale); + } + } - return m_renderer; + internal sealed class ManagedPlannedFullscreenRenderPipelineProbeRendererData + : ProbeRendererData + { + protected override ScriptableRenderer CreateProbeRenderer() + { + return new ManagedPlannedFullscreenRenderPipelineProbe(); + } + } + + internal sealed class ManagedRenderContextCameraDataProbeRendererData + : ProbeRendererData + { + protected override ScriptableRenderer CreateProbeRenderer() + { + return new ManagedRenderContextCameraDataProbe(); + } + } + + internal sealed class ManagedRenderContextStageColorDataProbeRendererData + : ProbeRendererData + { + protected override ScriptableRenderer CreateProbeRenderer() + { + return new ManagedRenderContextStageColorDataProbe(); } } @@ -859,48 +899,66 @@ namespace Gameplay { } - public sealed class ManagedRenderPipelineProbeAsset : ScriptableRenderPipelineAsset + public sealed class ManagedRenderPipelineProbeAsset + : UniversalRenderPipelineAsset { public static int CreatePipelineCallCount; + public ManagedRenderPipelineProbeAsset() + { + rendererData = new ManagedRenderPipelineProbeRendererData(); + } + protected override ScriptableRenderPipeline CreatePipeline() { CreatePipelineCallCount++; - return new ManagedRenderPipelineProbe(); + return base.CreatePipeline(); } } - public sealed class ManagedPostProcessRenderPipelineProbeAsset : ScriptableRenderPipelineAsset + public sealed class ManagedPostProcessRenderPipelineProbeAsset + : UniversalRenderPipelineAsset { - protected override ScriptableRenderPipeline CreatePipeline() + public ManagedPostProcessRenderPipelineProbeAsset() { - return new ManagedPostProcessRenderPipelineProbe(); + rendererData = + new ManagedPostProcessRenderPipelineProbeRendererData(); } } public sealed class ManagedUniversalRenderPipelineProbeAsset - : ScriptableRenderPipelineAsset + : UniversalRenderPipelineAsset { public static int CreatePipelineCallCount; public Vector4 postProcessScale = new Vector4(1.03f, 0.98f, 0.94f, 1.0f); + public ManagedUniversalRenderPipelineProbeAsset() + { + rendererData = CreateRendererData(); + } + protected override ScriptableRenderPipeline CreatePipeline() { CreatePipelineCallCount++; - return new ManagedUniversalRenderPipelineProbe( - postProcessScale); + rendererData = CreateRendererData(); + return base.CreatePipeline(); } + private ScriptableRendererData CreateRendererData() + { + return new ManagedUniversalRenderPipelineProbeRendererData( + postProcessScale); + } } public sealed class ManagedPlannedFullscreenRenderPipelineProbeAsset - : ScriptableRenderPipelineAsset + : UniversalRenderPipelineAsset { - protected override ScriptableRenderPipeline CreatePipeline() + public ManagedPlannedFullscreenRenderPipelineProbeAsset() { - return new ManagedPlannedFullscreenRenderPipelineProbe(); + rendererData = + new ManagedPlannedFullscreenRenderPipelineProbeRendererData(); } - } internal sealed class ManagedCameraRequestConfiguredRendererData @@ -921,15 +979,6 @@ namespace Gameplay } } - internal sealed class ManagedCameraRequestConfiguredRenderPipelineProbe - : ProbeRendererPipeline - { - protected override ScriptableRenderer CreateRenderer() - { - return new ProbeSceneRenderer(); - } - } - public sealed class ManagedCameraRequestConfiguredRenderPipelineProbeAsset : UniversalRenderPipelineAsset { @@ -940,20 +989,21 @@ namespace Gameplay } public sealed class ManagedRenderContextCameraDataProbeAsset - : ScriptableRenderPipelineAsset + : UniversalRenderPipelineAsset { - protected override ScriptableRenderPipeline CreatePipeline() + public ManagedRenderContextCameraDataProbeAsset() { - return new ManagedRenderContextCameraDataProbe(); + rendererData = + new ManagedRenderContextCameraDataProbeRendererData(); } } public sealed class ManagedFinalColorRenderPipelineProbeAsset - : ScriptableRenderPipelineAsset + : UniversalRenderPipelineAsset { - protected override ScriptableRenderPipeline CreatePipeline() + public ManagedFinalColorRenderPipelineProbeAsset() { - return new ManagedRenderPipelineProbe(); + rendererData = new ManagedRenderPipelineProbeRendererData(); } protected override FinalColorSettings GetDefaultFinalColorSettings() @@ -963,11 +1013,12 @@ namespace Gameplay } public sealed class ManagedRenderContextFinalColorDataProbeAsset - : ScriptableRenderPipelineAsset + : UniversalRenderPipelineAsset { - protected override ScriptableRenderPipeline CreatePipeline() + public ManagedRenderContextFinalColorDataProbeAsset() { - return new ManagedRenderContextCameraDataProbe(); + rendererData = + new ManagedRenderContextCameraDataProbeRendererData(); } protected override FinalColorSettings GetDefaultFinalColorSettings() @@ -977,26 +1028,21 @@ namespace Gameplay } public sealed class ManagedRenderContextStageColorDataProbeAsset - : ScriptableRenderPipelineAsset + : UniversalRenderPipelineAsset { - protected override ScriptableRenderPipeline CreatePipeline() + public ManagedRenderContextStageColorDataProbeAsset() { - return new ManagedRenderContextStageColorDataProbe(); + rendererData = + new ManagedRenderContextStageColorDataProbeRendererData(); } - } - public sealed class ManagedRenderPipelineProbe - : ProbeRendererPipeline + internal sealed class ManagedRenderPipelineProbe + : ProbeSceneRenderer { public static int SupportsStageCallCount; public static int RecordStageCallCount; - protected override ScriptableRenderer CreateRenderer() - { - return new ProbeSceneRenderer(); - } - protected override bool SupportsStageRenderGraph( CameraFrameStage stage) { @@ -1012,19 +1058,19 @@ namespace Gameplay } } - public sealed class ManagedPostProcessRenderPipelineProbe - : ProbeRendererPipeline + internal sealed class ManagedPostProcessRenderPipelineProbe + : ProbePostProcessRenderer { - protected override ScriptableRenderer CreateRenderer() - { - return new ProbePostProcessRenderer( + public ManagedPostProcessRenderPipelineProbe() + : base( new Vector4(1.10f, 0.95f, 0.90f, 1.0f), - new Vector4(0.95f, 1.05f, 1.10f, 1.0f)); + new Vector4(0.95f, 1.05f, 1.10f, 1.0f)) + { } } - public sealed class ManagedUniversalRenderPipelineProbe - : ProbeRendererPipeline + internal sealed class ManagedUniversalRenderPipelineProbe + : ProbeUniversalRenderer { public static int SupportsMainSceneCallCount; public static int SupportsPostProcessCallCount; @@ -1037,17 +1083,13 @@ namespace Gameplay public ManagedUniversalRenderPipelineProbe( Vector4 postProcessScale) + : base( + postProcessScale, + OnOpaqueRecorded) { m_postProcessScale = postProcessScale; } - protected override ScriptableRenderer CreateRenderer() - { - return new ProbeUniversalRenderer( - m_postProcessScale, - OnOpaqueRecorded); - } - protected override bool SupportsStageRenderGraph( CameraFrameStage stage) { @@ -1084,37 +1126,25 @@ namespace Gameplay return base.RecordStageRenderGraph(context); } - private void OnOpaqueRecorded() + private static void OnOpaqueRecorded() { RecordSceneCallCount++; } } - public sealed class ManagedPlannedFullscreenRenderPipelineProbe - : ProbeRendererPipeline + internal sealed class ManagedPlannedFullscreenRenderPipelineProbe + : ProbePlannedFullscreenRenderer { - protected override ScriptableRenderer CreateRenderer() - { - return new ProbePlannedFullscreenRenderer(); - } } - public sealed class ManagedRenderContextCameraDataProbe - : ProbeRendererPipeline + internal sealed class ManagedRenderContextCameraDataProbe + : CameraDataObservationRenderer { - protected override ScriptableRenderer CreateRenderer() - { - return new CameraDataObservationRenderer(); - } } - public sealed class ManagedRenderContextStageColorDataProbe - : ProbeRendererPipeline + internal sealed class ManagedRenderContextStageColorDataProbe + : StageColorObservationRenderer { - protected override ScriptableRenderer CreateRenderer() - { - return new StageColorObservationRenderer(); - } } public sealed class RenderPipelineApiProbe : MonoBehaviour diff --git a/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs b/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs index a769601d..c0058519 100644 --- a/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs +++ b/managed/GameScripts/ScriptableRenderContextApiSurfaceProbe.cs @@ -34,6 +34,8 @@ namespace Gameplay public bool HasRendererBackedRenderPipelineAssetType; public bool HasRendererBackedRenderPipelineType; public bool HasRendererDrivenRenderPipelineType; + public bool HasPublicRendererSupportsStageRenderGraph; + public bool HasPublicRendererRecordStageRenderGraph; public void Start() { @@ -47,6 +49,8 @@ namespace Gameplay typeof(ScriptableRenderPipelineAsset); System.Type rendererFeatureType = typeof(ScriptableRendererFeature); + System.Type rendererType = + typeof(ScriptableRenderer); System.Type universalAssemblyType = typeof(ScriptableRendererFeature); System.Reflection.Assembly universalAssembly = @@ -166,6 +170,14 @@ namespace Gameplay HasRendererDrivenRenderPipelineType = System.Type.GetType( "XCEngine.Rendering.Universal.RendererDrivenRenderPipeline, XCEngine.RenderPipelines.Universal") != null; + HasPublicRendererSupportsStageRenderGraph = + rendererType.GetMethod( + "SupportsStageRenderGraph", + PublicInstanceMethodFlags) != null; + HasPublicRendererRecordStageRenderGraph = + rendererType.GetMethod( + "RecordStageRenderGraph", + PublicInstanceMethodFlags) != null; } } } diff --git a/managed/XCEngine.ScriptCore/Rendering/Universal/ScriptableRenderer.cs b/managed/XCEngine.ScriptCore/Rendering/Universal/ScriptableRenderer.cs index 5e6b9824..07e44411 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Universal/ScriptableRenderer.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Universal/ScriptableRenderer.cs @@ -53,7 +53,7 @@ namespace XCEngine.Rendering.Universal { } - public bool SupportsStageRenderGraph( + protected internal virtual bool SupportsStageRenderGraph( CameraFrameStage stage) { RenderingData renderingData = new RenderingData(stage); @@ -71,7 +71,7 @@ namespace XCEngine.Rendering.Universal return false; } - public bool RecordStageRenderGraph( + protected internal virtual bool RecordStageRenderGraph( ScriptableRenderContext context) { if (context == null) diff --git a/managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipelineAsset.cs b/managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipelineAsset.cs index 409b4c03..40b31075 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipelineAsset.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Universal/UniversalRenderPipelineAsset.cs @@ -6,7 +6,7 @@ namespace XCEngine.Rendering.Universal public class UniversalRenderPipelineAsset : ScriptableRenderPipelineAsset { - public UniversalRendererData rendererData = + public ScriptableRendererData rendererData = new UniversalRendererData(); protected override ScriptableRenderPipeline CreatePipeline() diff --git a/tests/scripting/test_mono_script_runtime.cpp b/tests/scripting/test_mono_script_runtime.cpp index 4eeb658e..a37cf6ab 100644 --- a/tests/scripting/test_mono_script_runtime.cpp +++ b/tests/scripting/test_mono_script_runtime.cpp @@ -1177,6 +1177,8 @@ TEST_F( bool hasRendererBackedRenderPipelineAssetType = false; bool hasRendererBackedRenderPipelineType = false; bool hasRendererDrivenRenderPipelineType = false; + bool hasPublicRendererSupportsStageRenderGraph = false; + bool hasPublicRendererRecordStageRenderGraph = false; EXPECT_TRUE(runtime->TryGetFieldValue( selectionScript, @@ -1282,6 +1284,14 @@ TEST_F( selectionScript, "HasRendererDrivenRenderPipelineType", hasRendererDrivenRenderPipelineType)); + EXPECT_TRUE(runtime->TryGetFieldValue( + selectionScript, + "HasPublicRendererSupportsStageRenderGraph", + hasPublicRendererSupportsStageRenderGraph)); + EXPECT_TRUE(runtime->TryGetFieldValue( + selectionScript, + "HasPublicRendererRecordStageRenderGraph", + hasPublicRendererRecordStageRenderGraph)); EXPECT_FALSE(hasPublicContextRecordScene); EXPECT_FALSE(hasPublicContextRecordOpaqueScenePhase); @@ -1295,12 +1305,12 @@ TEST_F( EXPECT_FALSE(hasPublicContextStageColorData); EXPECT_FALSE(hasPublicRequestContextHasDirectionalShadow); EXPECT_FALSE(hasPublicRequestContextClearDirectionalShadow); - EXPECT_TRUE(hasUniversalContextRecordSceneExtension); - EXPECT_TRUE(hasUniversalContextRecordOpaqueScenePhaseExtension); - EXPECT_TRUE(hasUniversalContextRecordBeforeOpaqueInjectionExtension); - EXPECT_TRUE(hasUniversalContextRecordShaderVectorFullscreenPassExtension); - EXPECT_TRUE(hasUniversalRequestContextHasDirectionalShadowExtension); - EXPECT_TRUE(hasUniversalRequestContextClearDirectionalShadowExtension); + EXPECT_FALSE(hasUniversalContextRecordSceneExtension); + EXPECT_FALSE(hasUniversalContextRecordOpaqueScenePhaseExtension); + EXPECT_FALSE(hasUniversalContextRecordBeforeOpaqueInjectionExtension); + EXPECT_FALSE(hasUniversalContextRecordShaderVectorFullscreenPassExtension); + EXPECT_FALSE(hasUniversalRequestContextHasDirectionalShadowExtension); + EXPECT_FALSE(hasUniversalRequestContextClearDirectionalShadowExtension); EXPECT_FALSE(hasPublicPipelineAssetConfigureCameraFramePlan); EXPECT_FALSE(hasPlanningContextType); EXPECT_FALSE(hasRendererFeatureConfigureCameraFramePlan); @@ -1309,6 +1319,8 @@ TEST_F( EXPECT_FALSE(hasRendererBackedRenderPipelineAssetType); EXPECT_FALSE(hasRendererBackedRenderPipelineType); EXPECT_FALSE(hasRendererDrivenRenderPipelineType); + EXPECT_FALSE(hasPublicRendererSupportsStageRenderGraph); + EXPECT_FALSE(hasPublicRendererRecordStageRenderGraph); } TEST_F(