diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index d6443437..62acc692 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -642,8 +642,6 @@ add_library(XCEngine STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineFrame.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Pipelines/Internal/BuiltinForwardStageGraphBuilder.h - ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Pipelines/Internal/BuiltinForwardStageGraphBuilder.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineLifecycle.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineScenePhases.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineSkybox.cpp diff --git a/engine/include/XCEngine/Rendering/AGENTS.md b/engine/include/XCEngine/Rendering/AGENTS.md index ece2b098..fb58d568 100644 --- a/engine/include/XCEngine/Rendering/AGENTS.md +++ b/engine/include/XCEngine/Rendering/AGENTS.md @@ -8,9 +8,9 @@ - 这个渲染模块的方向是对齐 Unity SRP/URP:C# 负责上层管线组织、renderer / feature / pass 排队和 per-camera 策略,C++ 保留 RHI、RenderGraph 内核、scene extraction、native draw backend 和资源状态执行。 - 当前主链已经是 `CameraRenderRequest -> CameraFramePlan -> CameraFrameStage -> RenderGraph`,不要把新功能退回到“在一个大 render 函数里顺手画掉”的旧模型。 -- 当前默认无 managed 选择时走 `BuiltinForwardPipelineAsset -> BuiltinForwardPipeline`;存在 managed render pipeline selection 时,`CameraRenderer` 会通过 `GraphicsSettingsState` 切到 `ManagedScriptableRenderPipelineAsset -> ScriptableRenderPipelineHost`。 +- 当前默认无 managed 选择时走 `BuiltinForwardPipelineAsset -> ScriptableRenderPipelineHost -> BuiltinForwardStageRecorder + 默认 native scene draw backend`;存在 managed render pipeline selection 时,`CameraRenderer` 会通过 `GraphicsSettingsState` 切到 `ManagedScriptableRenderPipelineAsset -> ScriptableRenderPipelineHost`。 - `ScriptableRenderPipelineHost` 是 SRP native 边界。它把 authoritative stage recorder 和 native pipeline backend 分开。managed SRP 存在时,不应偷偷 fallback 到 backend 来掩盖 stage 没录制的问题。 -- `BuiltinForwardPipeline` 现在应被理解为 native scene draw backend / 默认 forward backend,不应继续承载越来越多 URP 上层策略。 +- `BuiltinForwardPipeline` 现在只应被理解为 native scene draw backend / 默认 forward backend,不再是顶层 `RenderPipeline`,不应继续承载越来越多 URP 上层策略。 - `RenderGraph` 是 native 核心。managed 侧通过 `ScriptableRenderContext` / `RenderGraph` wrapper 参与录图和提交命令,不直接拥有 RHI resource / barrier / view lifetime。 - editor object-id、grid、outline、overlay 这类工具输出要接入 request / pass / viewport render plan,不要把 engine rendering 逻辑写回 editor panel 或 ImGui overlay。 @@ -148,18 +148,18 @@ native RenderGraph 当前支持: ## 6. Builtin Forward -`BuiltinForwardPipeline` 当前同时实现 `RenderPipeline` 和 `SceneDrawBackend`。它负责: +`BuiltinForwardPipeline` 当前只实现 `SceneDrawBackend`。顶层 builtin forward 管线由 `BuiltinForwardPipelineAsset` 创建 `ScriptableRenderPipelineHost`,再通过 builtin stage recorder 调度默认 native scene draw backend。`CreateDefaultSceneDrawBackendAsset()` 会创建一个内部 `RenderPipeline`/`SceneDrawBackend` 适配器,目的只是满足现有 pipeline backend asset 合约,不应把它当成新的上层渲染管线。`BuiltinForwardPipeline` 负责: - forward opaque / skybox / transparent scene phase 执行 - shader pass / material / descriptor / pipeline state cache - `SceneRenderFeatureHost` 注入 -- native `NativeSceneRecorder` 调度默认场景阶段 +- 被 native `NativeSceneRecorder` / builtin stage recorder 调度默认场景阶段 - builtin forward fallback shader、texture、sampler 等资源 约束: - 不要把 URP asset policy、renderer feature 排队、render pass event 解释继续塞进 `BuiltinForwardPipeline`。 -- 与 Unity 对齐时,`BuiltinForwardPipeline` 更像 URP 内部 native renderer backend,而不是最终用户直接改的 `UniversalRenderPipelineAsset`。 +- 与 Unity 对齐时,`BuiltinForwardPipeline` 更像 URP 内部 native renderer backend,而不是最终用户直接改的 `UniversalRenderPipelineAsset` 或顶层 SRP 实例。 - 新 draw 能力如果是底层能力,放在 `SceneDrawBackend` / `NativeSceneRecorder` / draw settings contract 上;如果是上层策略,优先放 managed URP-like 层。 - shader pass 资源契约继续走 `BuiltinPassLayoutUtils` / `BuiltinPassMetadataUtils`,不要引入 ad-hoc descriptor 绑定。 @@ -411,6 +411,6 @@ cmake --build build --config Debug --target rendering_phase_regression 2. 让 managed SRP runtime 持有真实 asset / pipeline / renderer runtime。 3. 扩大 `ScriptableRenderContext` 和 managed RenderGraph 的受控能力面。 4. 把 URP-like 的 asset policy、renderer data、feature queue、render pass event、post/final/shadow policy 逐步上移到 managed。 -5. 让 `BuiltinForwardPipeline` 退回为可被 SRP 调度的 native backend,而不是继续当唯一上层管线。 +5. 保持 `BuiltinForwardPipeline` 作为可被 SRP 调度的 native backend,而不是重新变回唯一上层管线。 一句话:XCEngine Rendering 的对齐目标是 Unity SRP/URP 的分层模型,不是复制 Unity 某个版本的源码细节。C++ 做执行内核,C# 做可编排管线,RenderGraph 做中间契约。 diff --git a/engine/include/XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h b/engine/include/XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h index d2fa2af7..8442fe27 100644 --- a/engine/include/XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h +++ b/engine/include/XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h @@ -41,19 +41,11 @@ namespace Rendering { class RenderSurface; namespace Pipelines { -namespace Internal { -struct BuiltinForwardStageGraphBuilder; -} // namespace Internal -} // namespace Pipelines -namespace Pipelines { - -class BuiltinForwardPipeline : public RenderPipeline, public SceneDrawBackend { +class BuiltinForwardPipeline : public SceneDrawBackend { public: BuiltinForwardPipeline(); - ~BuiltinForwardPipeline() override; - - using RenderPipeline::Render; + ~BuiltinForwardPipeline(); static RHI::InputLayoutDesc BuildInputLayout(); @@ -75,14 +67,11 @@ public: const RenderPassContext& context, const DrawSettings& drawSettings) override; void Shutdown() override; - bool SupportsStageRenderGraph(CameraFrameStage stage) const override; - bool RecordStageRenderGraph( - const RenderPipelineStageRenderGraphContext& context) override; - bool Render(const FrameExecutionContext& executionContext) override; + bool Render(const FrameExecutionContext& executionContext); bool Render( const RenderContext& context, const RenderSurface& surface, - const RenderSceneData& sceneData) override; + const RenderSceneData& sceneData); private: struct OwnedDescriptorSet { @@ -412,9 +401,9 @@ private: class BuiltinForwardPipelineAsset final : public RenderPipelineAsset { public: - // Explicit builtin-forward pipeline selection. The default native backend - // is resolved through Internal::CreateDefaultPipelineBackendAsset() so the - // host/backend policy can evolve independently from this asset type. + // Explicit builtin-forward pipeline selection now materializes the same + // host/stage-recorder shape used by managed SRP, with builtin forward kept + // as the native scene backend behind that host. std::unique_ptr CreatePipeline() const override; FinalColorSettings GetDefaultFinalColorSettings() const override { return {}; } }; diff --git a/engine/src/Rendering/Internal/RenderPipelineFactory.cpp b/engine/src/Rendering/Internal/RenderPipelineFactory.cpp index dfcadcac..c1448d55 100644 --- a/engine/src/Rendering/Internal/RenderPipelineFactory.cpp +++ b/engine/src/Rendering/Internal/RenderPipelineFactory.cpp @@ -18,7 +18,7 @@ namespace { class DefaultNativeSceneDrawBackendAsset final : public RenderPipelineAsset { public: std::unique_ptr CreatePipeline() const override { - return Pipelines::Internal::CreateConfiguredBuiltinForwardSceneDrawBackend(); + return Pipelines::Internal::CreateConfiguredBuiltinForwardSceneDrawBackendPipeline(); } FinalColorSettings GetDefaultFinalColorSettings() const override { @@ -187,7 +187,7 @@ std::unique_ptr CreatePipelineBackendFromAsset( } const std::shared_ptr defaultAsset = - CreateDefaultPipelineBackendAsset(); + CreateDefaultSceneDrawBackendAsset(); if (defaultAsset != nullptr && defaultAsset != preferredAsset) { if (std::unique_ptr pipelineBackend = @@ -205,7 +205,7 @@ std::unique_ptr CreatePipelineBackendFromAsset( ? defaultAsset : preferredAsset; } - return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline(); + return Pipelines::Internal::CreateConfiguredBuiltinForwardSceneDrawBackendPipeline(); } std::unique_ptr CreateSceneDrawBackendFromAsset( diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineFrame.cpp b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineFrame.cpp index 66638491..e7dd40e7 100644 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineFrame.cpp +++ b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineFrame.cpp @@ -1,7 +1,6 @@ #include "Rendering/Pipelines/BuiltinForwardPipeline.h" #include "Debug/Logger.h" -#include "Rendering/Pipelines/Internal/BuiltinForwardStageGraphBuilder.h" #include "Rendering/Internal/RenderSurfacePipelineUtils.h" #include "Rendering/RenderSurface.h" #include "RHI/RHICommandList.h" @@ -68,17 +67,6 @@ SceneRenderFeatureHost* BuiltinForwardPipeline::GetSceneFeatureHost() { return &m_forwardSceneFeatureHost; } -bool BuiltinForwardPipeline::SupportsStageRenderGraph( - CameraFrameStage stage) const { - return SupportsCameraFramePipelineGraphRecording(stage); -} - -bool BuiltinForwardPipeline::RecordStageRenderGraph( - const RenderPipelineStageRenderGraphContext& context) { - return context.stage == CameraFrameStage::MainScene && - Internal::BuiltinForwardStageGraphBuilder::Record(*this, context); -} - bool BuiltinForwardPipeline::Render( const FrameExecutionContext& executionContext) { return ExecuteForwardSceneFrame(executionContext, true); diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineLifecycle.cpp b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineLifecycle.cpp index dea2eeaa..bc0c6bc3 100644 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineLifecycle.cpp +++ b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardPipelineLifecycle.cpp @@ -16,7 +16,6 @@ bool BuiltinForwardPipeline::Initialize(const RenderContext& context) { void BuiltinForwardPipeline::Shutdown() { m_forwardSceneFeatureHost.Shutdown(); DestroyPipelineResources(); - ShutdownCameraFrameStandalonePasses(); } bool BuiltinForwardPipeline::EnsureInitialized(const RenderContext& context) { diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.cpp b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.cpp index b3a8536b..0422c959 100644 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.cpp +++ b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.cpp @@ -2,11 +2,15 @@ #include "Rendering/Features/BuiltinGaussianSplatPass.h" #include "Rendering/Features/BuiltinVolumetricPass.h" -#include "Rendering/Passes/BuiltinDepthOnlyPass.h" -#include "Rendering/Passes/BuiltinShadowCasterPass.h" #include "Rendering/Pipelines/BuiltinForwardPipeline.h" +#include "Rendering/Internal/RenderPipelineFactory.h" +#include "Rendering/Pipelines/NativeSceneRecorder.h" +#include "Rendering/Pipelines/ScriptableRenderPipelineHost.h" +#include "Rendering/RenderPipeline.h" +#include "Rendering/SceneDrawBackend.h" #include +#include namespace XCEngine { namespace Rendering { @@ -15,15 +19,118 @@ namespace Internal { namespace { -void ConfigureBuiltinForwardStandalonePasses( - BuiltinForwardPipeline& pipeline) { - pipeline.SetCameraFrameStandalonePass( - CameraFrameStage::DepthOnly, - std::make_unique()); - pipeline.SetCameraFrameStandalonePass( - CameraFrameStage::ShadowCaster, - std::make_unique()); -} +class BuiltinForwardSceneDrawPipelineBackend final + : public RenderPipeline + , public SceneDrawBackend { +public: + BuiltinForwardSceneDrawPipelineBackend() { + ConfigureBuiltinForwardSceneDrawBackend(m_sceneBackend); + } + + bool Initialize(const RenderContext& context) override { + return m_sceneBackend.Initialize(context); + } + + void Shutdown() override { + m_sceneBackend.Shutdown(); + } + + bool PrepareSceneDraw( + const FrameExecutionContext& executionContext) override { + return m_sceneBackend.PrepareSceneDraw(executionContext); + } + + SceneRenderFeatureHost* GetSceneFeatureHost() override { + return m_sceneBackend.GetSceneFeatureHost(); + } + + bool BeginSceneDrawPass( + const RenderPassContext& context, + bool clearAttachments = true) override { + return m_sceneBackend.BeginSceneDrawPass( + context, + clearAttachments); + } + + void EndSceneDrawPass( + const RenderPassContext& context) override { + m_sceneBackend.EndSceneDrawPass(context); + } + + bool DrawScenePhase( + const RenderPassContext& context, + ScenePhase scenePhase) override { + return m_sceneBackend.DrawScenePhase( + context, + scenePhase); + } + + bool DrawSceneRenderers( + const RenderPassContext& context, + const DrawSettings& drawSettings) override { + return m_sceneBackend.DrawSceneRenderers( + context, + drawSettings); + } + + bool Render(const FrameExecutionContext& executionContext) override { + return m_sceneBackend.Render(executionContext); + } + + bool Render( + const RenderContext& context, + const RenderSurface& surface, + const RenderSceneData& sceneData) override { + return m_sceneBackend.Render( + context, + surface, + sceneData); + } + +private: + BuiltinForwardPipeline m_sceneBackend; +}; + +class BuiltinForwardStageRecorder final + : public RenderPipelineStageRecorder { +public: + void SetPipelineBackend(RenderPipelineBackend* pipelineBackend) override { + m_sceneDrawBackend = dynamic_cast(pipelineBackend); + } + + bool Initialize(const RenderContext&) override { + return m_sceneDrawBackend != nullptr; + } + + void Shutdown() override { + m_sceneDrawBackend = nullptr; + } + + bool SupportsStageRenderGraph(CameraFrameStage stage) const override { + return stage == CameraFrameStage::MainScene || + stage == CameraFrameStage::ShadowCaster || + stage == CameraFrameStage::DepthOnly; + } + + bool RecordStageRenderGraph( + const RenderPipelineStageRenderGraphContext& context) override { + if (m_sceneDrawBackend == nullptr || + !SupportsStageRenderGraph(context.stage)) { + return false; + } + + NativeSceneRecorder recorder(*m_sceneDrawBackend, context); + if (context.stage == CameraFrameStage::MainScene) { + return recorder.RecordDefaultScene(); + } + + return recorder.RecordScenePhase(ScenePhase::Opaque) && + recorder.RecordScenePhase(ScenePhase::Transparent); + } + +private: + SceneDrawBackend* m_sceneDrawBackend = nullptr; +}; } // namespace @@ -35,7 +142,7 @@ void ConfigureBuiltinForwardSceneDrawBackend( std::make_unique()); } -std::unique_ptr +std::unique_ptr CreateConfiguredBuiltinForwardSceneDrawBackend() { std::unique_ptr pipeline = std::make_unique(); @@ -43,18 +150,22 @@ CreateConfiguredBuiltinForwardSceneDrawBackend() { return pipeline; } -void ConfigureBuiltinForwardPipeline( - BuiltinForwardPipeline& pipeline) { - ConfigureBuiltinForwardStandalonePasses(pipeline); - ConfigureBuiltinForwardSceneDrawBackend(pipeline); +std::unique_ptr +CreateConfiguredBuiltinForwardSceneDrawBackendPipeline() { + return std::make_unique(); } -std::unique_ptr +std::unique_ptr +CreateConfiguredBuiltinForwardStageRecorder() { + return std::make_unique(); +} + +std::unique_ptr CreateConfiguredBuiltinForwardPipeline() { - std::unique_ptr pipeline = - std::make_unique(); - ConfigureBuiltinForwardPipeline(*pipeline); - return pipeline; + auto host = std::make_unique( + Rendering::Internal::CreateDefaultSceneDrawBackendAsset()); + host->SetStageRecorder(CreateConfiguredBuiltinForwardStageRecorder()); + return host; } } // namespace Internal diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.h b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.h index 2d4550cc..5dff5176 100644 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.h +++ b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.h @@ -5,6 +5,10 @@ namespace XCEngine { namespace Rendering { +class RenderPipeline; +class RenderPipelineStageRecorder; +class SceneDrawBackend; + namespace Pipelines { class BuiltinForwardPipeline; @@ -12,12 +16,14 @@ namespace Internal { void ConfigureBuiltinForwardSceneDrawBackend( BuiltinForwardPipeline& pipeline); -std::unique_ptr +std::unique_ptr CreateConfiguredBuiltinForwardSceneDrawBackend(); +std::unique_ptr +CreateConfiguredBuiltinForwardSceneDrawBackendPipeline(); -void ConfigureBuiltinForwardPipeline( - BuiltinForwardPipeline& pipeline); -std::unique_ptr +std::unique_ptr +CreateConfiguredBuiltinForwardStageRecorder(); +std::unique_ptr CreateConfiguredBuiltinForwardPipeline(); } // namespace Internal diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardStageGraphBuilder.cpp b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardStageGraphBuilder.cpp deleted file mode 100644 index 18865bcc..00000000 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardStageGraphBuilder.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "Rendering/Pipelines/Internal/BuiltinForwardStageGraphBuilder.h" - -#include "Rendering/Pipelines/BuiltinForwardPipeline.h" -#include - -namespace XCEngine { -namespace Rendering { -namespace Pipelines { -namespace Internal { - -bool BuiltinForwardStageGraphBuilder::Record( - BuiltinForwardPipeline& pipeline, - const RenderPipelineStageRenderGraphContext& context) { - NativeSceneRecorder recorder(pipeline, context); - return recorder.RecordDefaultScene(); -} - -} // namespace Internal -} // namespace Pipelines -} // namespace Rendering -} // namespace XCEngine diff --git a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardStageGraphBuilder.h b/engine/src/Rendering/Pipelines/Internal/BuiltinForwardStageGraphBuilder.h deleted file mode 100644 index f904cd0b..00000000 --- a/engine/src/Rendering/Pipelines/Internal/BuiltinForwardStageGraphBuilder.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -namespace XCEngine { -namespace Rendering { - -struct RenderPipelineStageRenderGraphContext; - -namespace Pipelines { - -class BuiltinForwardPipeline; - -namespace Internal { - -struct BuiltinForwardStageGraphBuilder { - static bool Record( - BuiltinForwardPipeline& pipeline, - const RenderPipelineStageRenderGraphContext& context); -}; - -} // namespace Internal -} // namespace Pipelines -} // namespace Rendering -} // namespace XCEngine diff --git a/engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp b/engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp index d1be5778..41ad552b 100644 --- a/engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp +++ b/engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp @@ -11,7 +11,7 @@ namespace Pipelines { namespace { std::shared_ptr CreateDefaultPipelineBackendAsset() { - return Rendering::Internal::CreateDefaultPipelineBackendAsset(); + return Rendering::Internal::CreateDefaultSceneDrawBackendAsset(); } bool UsesAuthoritativeStageRecorder( diff --git a/tests/Rendering/unit/test_builtin_forward_pipeline.cpp b/tests/Rendering/unit/test_builtin_forward_pipeline.cpp index dd90e18f..e3db0b74 100644 --- a/tests/Rendering/unit/test_builtin_forward_pipeline.cpp +++ b/tests/Rendering/unit/test_builtin_forward_pipeline.cpp @@ -682,7 +682,6 @@ TEST(BuiltinForwardPipeline_Test, UsesFloat3PositionInputLayoutForStaticMeshVert TEST(BuiltinForwardPipeline_Test, RecordsMainSceneGraphPassWithSampledShadowDependency) { BuiltinForwardPipeline pipeline; - EXPECT_TRUE(pipeline.SupportsStageRenderGraph(CameraFrameStage::MainScene)); RenderGraph graph = {}; RenderGraphBuilder graphBuilder(graph); @@ -757,7 +756,8 @@ TEST(BuiltinForwardPipeline_Test, RecordsMainSceneGraphPassWithSampledShadowDepe &blackboard }; - ASSERT_TRUE(pipeline.RecordStageRenderGraph(context)); + NativeSceneRecorder recorder(pipeline, context); + ASSERT_TRUE(recorder.RecordDefaultScene()); CompiledRenderGraph compiledGraph = {}; String errorMessage; @@ -1524,7 +1524,8 @@ TEST(BuiltinForwardPipeline_Test, RecordsActiveFeatureInjectionPassesIntoMainSce &blackboard }; - ASSERT_TRUE(pipeline.RecordStageRenderGraph(context)); + NativeSceneRecorder recorder(pipeline, context); + ASSERT_TRUE(recorder.RecordDefaultScene()); CompiledRenderGraph compiledGraph = {}; String errorMessage; @@ -1625,7 +1626,8 @@ TEST(BuiltinForwardPipeline_Test, ForwardsSourceColorTextureIntoFeatureInjection &blackboard }; - ASSERT_TRUE(pipeline.RecordStageRenderGraph(context)); + NativeSceneRecorder recorder(pipeline, context); + ASSERT_TRUE(recorder.RecordDefaultScene()); EXPECT_EQ(featureRaw->recordGraphCallCount, 1u); EXPECT_TRUE(featureRaw->lastReceivedSourceColorTextureValid); diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index 96b3d6b1..6321932c 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -4900,9 +4900,9 @@ TEST( TEST( RenderPipelineFactory_Test, - ExplicitPipelineBackendAssetCreatesSceneDrawBackend) { + ExplicitSceneDrawBackendAssetCreatesSceneDrawBackend) { std::shared_ptr backendAsset = - std::make_shared(); + Internal::CreateDefaultSceneDrawBackendAsset(); ASSERT_NE(backendAsset, nullptr); std::shared_ptr resolvedAsset = nullptr; @@ -4914,8 +4914,12 @@ TEST( ASSERT_NE(sceneDrawBackend, nullptr); EXPECT_EQ(resolvedAsset, backendAsset); EXPECT_NE( - dynamic_cast(sceneDrawBackend.get()), + dynamic_cast(sceneDrawBackend.get()), nullptr); + SceneRenderFeatureHost* const featureHost = + sceneDrawBackend->GetSceneFeatureHost(); + ASSERT_NE(featureHost, nullptr); + EXPECT_EQ(featureHost->GetFeaturePassCount(), 2u); } TEST( @@ -5187,20 +5191,17 @@ TEST( ASSERT_NE(featureHost, nullptr); EXPECT_EQ(featureHost->GetFeaturePassCount(), 2u); - auto* pipeline = - dynamic_cast(sceneDrawBackend.get()); - ASSERT_NE(pipeline, nullptr); EXPECT_EQ( - pipeline->GetCameraFrameStandalonePass(CameraFrameStage::DepthOnly), + dynamic_cast(sceneDrawBackend.get()), nullptr); - EXPECT_EQ( - pipeline->GetCameraFrameStandalonePass(CameraFrameStage::ShadowCaster), + EXPECT_NE( + dynamic_cast(sceneDrawBackend.get()), nullptr); } TEST( DefaultPipelineBackendAsset_Test, - CreatesFallbackPipelineWithSameDefaultNativeFeatureHost) { + CreatesBuiltinForwardHostWithDefaultNativeSceneBackend) { const std::shared_ptr backendAsset = Internal::CreateDefaultPipelineBackendAsset(); ASSERT_NE(backendAsset, nullptr); @@ -5208,18 +5209,25 @@ TEST( std::unique_ptr pipeline = backendAsset->CreatePipeline(); ASSERT_NE(pipeline, nullptr); + auto* host = + dynamic_cast(pipeline.get()); + ASSERT_NE(host, nullptr); + EXPECT_NE(host->GetStageRecorder(), nullptr); + auto* sceneDrawBackend = - dynamic_cast(pipeline.get()); + dynamic_cast(host->GetPipelineBackend()); ASSERT_NE(sceneDrawBackend, nullptr); SceneRenderFeatureHost* const featureHost = sceneDrawBackend->GetSceneFeatureHost(); ASSERT_NE(featureHost, nullptr); EXPECT_EQ(featureHost->GetFeaturePassCount(), 2u); - EXPECT_NE( + EXPECT_TRUE(host->SupportsStageRenderGraph(CameraFrameStage::MainScene)); + EXPECT_TRUE(host->SupportsStageRenderGraph(CameraFrameStage::DepthOnly)); + EXPECT_EQ( pipeline->GetCameraFrameStandalonePass(CameraFrameStage::DepthOnly), nullptr); - EXPECT_NE( + EXPECT_EQ( pipeline->GetCameraFrameStandalonePass(CameraFrameStage::ShadowCaster), nullptr); } @@ -5640,7 +5648,7 @@ TEST(CameraRenderer_Test, DefaultPipelineAssetUsesManagedSelectionWhenPresent) { TEST( CameraRenderer_Test, - DefaultPipelineAssetUsesBuiltinPipelineWhenManagedSelectionIsAbsent) { + DefaultPipelineAssetUsesBuiltinForwardHostWhenManagedSelectionIsAbsent) { Pipelines::ClearConfiguredManagedRenderPipelineAssetDescriptor(); CameraRenderer renderer; @@ -5652,13 +5660,12 @@ TEST( dynamic_cast( renderer.GetPipelineAsset()), nullptr); - EXPECT_NE( - dynamic_cast( - renderer.GetPipeline()), - nullptr); - EXPECT_EQ( + auto* host = dynamic_cast( - renderer.GetPipeline()), + renderer.GetPipeline()); + ASSERT_NE(host, nullptr); + EXPECT_NE( + dynamic_cast(host->GetPipelineBackend()), nullptr); } @@ -5675,13 +5682,12 @@ TEST(CameraRenderer_Test, DefaultPipelineAssetRefreshesWhenManagedSelectionChang dynamic_cast( renderer.GetPipelineAsset()), nullptr); - EXPECT_NE( - dynamic_cast( - renderer.GetPipeline()), - nullptr); - EXPECT_EQ( + auto* initialHost = dynamic_cast( - renderer.GetPipeline()), + renderer.GetPipeline()); + ASSERT_NE(initialHost, nullptr); + EXPECT_NE( + dynamic_cast(initialHost->GetPipelineBackend()), nullptr); const Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = { @@ -5716,13 +5722,12 @@ TEST(CameraRenderer_Test, DefaultPipelineAssetRefreshesWhenManagedSelectionChang dynamic_cast( renderer.GetPipelineAsset()), nullptr); - EXPECT_NE( - dynamic_cast( - renderer.GetPipeline()), - nullptr); - EXPECT_EQ( + auto* restoredHost = dynamic_cast( - renderer.GetPipeline()), + renderer.GetPipeline()); + ASSERT_NE(restoredHost, nullptr); + EXPECT_NE( + dynamic_cast(restoredHost->GetPipelineBackend()), nullptr); } diff --git a/tests/scripting/test_mono_script_runtime.cpp b/tests/scripting/test_mono_script_runtime.cpp index c9c621b8..de00826b 100644 --- a/tests/scripting/test_mono_script_runtime.cpp +++ b/tests/scripting/test_mono_script_runtime.cpp @@ -784,10 +784,6 @@ TEST_F( nullptr); EXPECT_NE( - dynamic_cast( - renderer.GetPipeline()), - nullptr); - EXPECT_EQ( dynamic_cast( renderer.GetPipeline()), nullptr);