diff --git a/engine/include/XCEngine/Rendering/AGENTS.md b/engine/include/XCEngine/Rendering/AGENTS.md index 1c415039..f1a8d383 100644 --- a/engine/include/XCEngine/Rendering/AGENTS.md +++ b/engine/include/XCEngine/Rendering/AGENTS.md @@ -1,9 +1,9 @@ -# Rendering 模块说明(在建) +# Rendering 模块说明 ## 1. 目的 -- 本文只描述当前已落地的渲染主线和后续收口方向。 -- 这里优先记录真实代码职责,不按理想状态脑补。 -- 如果实现与本文冲突,以代码为准,再更新本文。 +- 本文记录当前渲染模块已经落地的真实边界,以及后续改动必须遵守的约束。 +- 本文优先描述代码现状和明确目标,不替代码补脑。 +- 如果实现与本文冲突,以代码为准;修完代码后同步更新本文。 ## 2. 当前主链 ```text @@ -18,46 +18,75 @@ SceneRenderer -> RenderGraph Record / Compile / Execute ``` -## 3. 当前架构判断 -- 这套系统已经不是“一个 forward pipeline 直接画完整帧”。 -- 当前主模型是:`SRP host + renderer backend + per-camera plan + render graph execution`。 -- `ScriptableRenderPipelineHost` 是 native 侧最重要的 SRP 接缝。 -- `CameraRenderRequest` 和 `CameraFramePlan` 已经承担了每相机规划职责。 -- `RenderSceneExtractor` 负责从 `Scene` 生成 `RenderSceneData`。 -- `CameraFrameGraph` 和 `RenderGraph` 已经是执行内核的一部分,不是附属实验层。 +## 3. 当前顶层切换语义 +- 顶层切换目标向 Unity 对齐。 +- `GraphicsSettings.renderPipelineAsset == null`:走内置管线。 +- `GraphicsSettings.renderPipelineAsset != null`:走可编程渲染管线。 +- 当前内置管线默认直连 `BuiltinForwardPipelineAsset -> BuiltinForwardPipeline`。 +- 当前可编程管线默认直连 `ManagedScriptableRenderPipelineAsset -> ScriptableRenderPipelineHost`。 +- 运行时启动不得再偷偷自动选择 `ProjectDefaultRenderPipelineAsset`。 +- “当前项目里存在某个默认 SRP asset” 不是切换条件;唯一切换条件是 `GraphicsSettings.renderPipelineAsset`。 -## 4. 和 Unity SRP / URP 的关系 +## 4. 和 Unity SRP / URP 的对齐方式 - `RenderPipelineAsset` 对应 Unity 的 `RenderPipelineAsset`。 -- `ScriptableRenderPipelineHost` 接近 Unity 的 `RenderPipeline` 宿主。 -- managed 侧已经有 `ScriptableRenderPipelineAsset -> ScriptableRendererData -> ScriptableRenderer -> ScriptableRendererFeature/Pass` 这条产品层骨架。 -- 因此当前问题不是“SRP 没打通”,而是“URP 风格上层还没彻底收口”。 +- `ScriptableRenderPipelineHost` 对应 native 侧承接托管 SRP 的 `RenderPipeline` 宿主。 +- managed 侧产品骨架仍是: + `ScriptableRenderPipelineAsset -> ScriptableRendererData -> ScriptableRenderer -> ScriptableRendererFeature/Pass` +- builtin 和 SRP 现在都必须是显式可切换的顶层路径,而不是“SRP 隐式优先,builtin 只是兜底”。 -## 5. 当前未收口点 -- managed runtime 目前仍复用默认 native forward backend 作为共享绘制后端。 -- 这意味着 `BuiltinForwardPipeline` 还同时带着“默认产品层”和“native 执行后端”两种身份。 -- 一些本该属于 URP asset / renderer / feature 的组织策略,仍可能滑回 native backend。 -- 所以现在更准确的名字是“SRP 已通、URP 主产品线未收口”。 +## 5. 当前硬边界 +- `RenderPipelineFactory` 在无显式 asset、无托管配置、创建失败回退时,都必须先回 builtin,而不是回 `ScriptableRenderPipelineHost`。 +- `MonoScriptRuntime::OnRuntimeStart()` 不得隐式写入 render pipeline 选择。 +- builtin 私有 native feature 通道只能留在 native 内部使用。 +- 下列能力不得再暴露给 managed / URP 公开层: + `NativeSceneFeaturePassId` + `ScriptableRenderContext.RecordNativeSceneFeaturePass(...)` + 依赖上述接口的 managed wrapper feature / controller +- URP 默认 renderer feature 工厂不得自动注入 builtin 私有 feature wrapper。 -## 6. 在这个模块里应怎样继续演进 -- 把 camera request policy、renderer 选择、stage planning、scene setup、shadow execution config、pass/feature 排序继续上移到 managed `URP`。 -- 把 scene extraction、renderer list 绘制、native scene feature、fullscreen primitive 执行保留在 native。 -- 非通用策略不要继续直接塞进 `BuiltinForwardPipeline`。 -- 如果新增的是“绘制能力”或“native backend contract”,可以放 C++。 -- 如果新增的是“渲染组织策略”或“URP 行为差异”,优先放 managed。 +## 6. native / managed 分层 +- 放在 native 的内容: + scene extraction + renderer list 绘制 + render graph 执行 + fullscreen primitive 执行 + builtin 私有 scene feature 执行内核 +- 放在 managed URP 的内容: + renderer 选择 + stage planning + renderer feature / pass 组织 + camera 级策略 + 产品层行为差异 +- 判断原则: + 如果新增的是“绘制能力”或“后端 contract”,优先放 C++。 + 如果新增的是“渲染组织策略”或“URP 行为”,优先放 managed。 -## 7. 关键文件 -- `engine/src/Rendering/Execution/SceneRenderer.cpp` +## 7. 禁止回退的实现方式 +- 不要再引入“项目默认 SRP asset 自动生效”的隐式逻辑。 +- 不要再把 builtin 私有 native feature 包成 public managed API 方便调用。 +- 不要再让 “null 选择” 默认落到 `ScriptableRenderPipelineHost`。 +- 不要把非通用产品层策略继续直接塞回 `BuiltinForwardPipeline`。 + +## 8. 关键文件 +- `engine/src/Rendering/Internal/RenderPipelineFactory.cpp` - `engine/src/Rendering/Execution/RenderPipelineHost.cpp` - `engine/src/Rendering/Execution/CameraRenderer.cpp` - `engine/src/Rendering/Extraction/RenderSceneExtractor.cpp` -- `engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp` - `engine/src/Rendering/Pipelines/BuiltinForwardPipeline.cpp` +- `engine/src/Rendering/Pipelines/ScriptableRenderPipelineHost.cpp` +- `engine/src/Scripting/Mono/MonoScriptRuntime.cpp` +- `managed/XCEngine.ScriptCore/Rendering/Core/GraphicsSettings.cs` - `managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderPipeline*.cs` - `managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/*.cs` -## 8. 长期目标 -- 形成唯一默认主线:`UniversalRenderPipelineAsset -> UniversalRendererData -> UniversalRenderer -> ScriptableRendererFeature/Pass`。 -- `ShadowCaster / DepthOnly / MainScene / PostProcess / FinalOutput` 的组织权由 managed `URP` 持有。 -- `BuiltinForwardPipeline` 或其后继应退回为 native scene draw backend,而不是继续充当上层产品语义。 -- native 侧最终保留“执行内核”和“通用后端 contract”,managed 侧负责“渲染策略”和“产品层组织”。 -- 简单说:目标不是继续堆更多 URP 外形,而是把 URP 真正收口成唯一上层组织者。 +## 9. 当前验证点 +- `tests/scripting/test_project_script_assembly.cpp` + 运行时启动不会自动配置 `ProjectDefaultRenderPipelineAsset`。 +- `tests/Rendering/unit/test_camera_scene_renderer.cpp` + 无 managed 选择时默认走 builtin。 + 设置 managed descriptor 后切到 `ScriptableRenderPipelineHost`。 + 清空 managed descriptor 后退回 builtin。 + +## 10. 后续演进方向 +- 继续补齐 URP 上层组织能力,但不能破坏 builtin / programmable 的显式切换语义。 +- 如果未来继续向 Unity 收口,优先收口“入口语义”和“分层边界”,不要靠隐式 fallback 和私有桥接维持表面形似。 diff --git a/engine/include/XCEngine/Scripting/Mono/MonoScriptRuntime.h b/engine/include/XCEngine/Scripting/Mono/MonoScriptRuntime.h index 1a566cef..c435dd1c 100644 --- a/engine/include/XCEngine/Scripting/Mono/MonoScriptRuntime.h +++ b/engine/include/XCEngine/Scripting/Mono/MonoScriptRuntime.h @@ -215,7 +215,6 @@ private: void DiscoverRenderPipelineAssetClassesInImage( const std::string& assemblyName, MonoImage* image); - bool TryConfigureDefaultProjectRenderPipelineAsset(); bool IsMonoBehaviourSubclass(MonoClass* monoClass) const; bool IsSupportedComponentFieldClass(MonoClass* monoClass) const; bool IsScriptComponentFieldClass(MonoClass* monoClass) const; diff --git a/engine/src/Rendering/Internal/RenderPipelineFactory.cpp b/engine/src/Rendering/Internal/RenderPipelineFactory.cpp index 97d111b0..c03a875a 100644 --- a/engine/src/Rendering/Internal/RenderPipelineFactory.cpp +++ b/engine/src/Rendering/Internal/RenderPipelineFactory.cpp @@ -26,17 +26,6 @@ public: } }; -class DefaultNativePipelineBackendAsset final : public RenderPipelineAsset { -public: - std::unique_ptr CreatePipeline() const override { - return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline(); - } - - FinalColorSettings GetDefaultFinalColorSettings() const override { - return {}; - } -}; - std::shared_ptr CreateDefaultNativeSceneDrawBackendAsset() { static const std::shared_ptr @@ -49,7 +38,7 @@ std::shared_ptr CreateDefaultNativePipelineBackendAsset() { static const std::shared_ptr s_defaultNativePipelineBackendAsset = - std::make_shared(); + std::make_shared(); return s_defaultNativePipelineBackendAsset; } @@ -87,7 +76,7 @@ std::shared_ptr CreateConfiguredRenderPipelineAsset() } std::shared_ptr CreateFallbackRenderPipelineAsset() { - return std::make_shared(); + return CreateDefaultPipelineBackendAsset(); } std::shared_ptr CreateDefaultSceneDrawBackendAsset() { @@ -114,7 +103,7 @@ std::shared_ptr ResolveRenderPipelineAssetOrDefault( return configuredAsset; } - return CreateFallbackRenderPipelineAsset(); + return CreateDefaultPipelineBackendAsset(); } std::unique_ptr CreateRenderPipelineOrDefault( @@ -167,7 +156,7 @@ std::unique_ptr CreateRenderPipelineOrDefault( ? defaultAsset : resolvedAsset); } - return std::make_unique(); + return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline(); } std::unique_ptr CreatePipelineBackendFromAsset( diff --git a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp index 6d1dc4b5..699389b5 100644 --- a/engine/src/Scripting/Mono/MonoScriptRuntime.cpp +++ b/engine/src/Scripting/Mono/MonoScriptRuntime.cpp @@ -62,10 +62,6 @@ namespace Scripting { namespace { constexpr const char* kManagedRenderingNamespace = "XCEngine.Rendering"; -constexpr const char* kProjectDefaultRenderPipelineAssetNamespace = - "ProjectScripts"; -constexpr const char* kProjectDefaultRenderPipelineAssetClassName = - "ProjectDefaultRenderPipelineAsset"; struct MonoRootState { MonoDomain* rootDomain = nullptr; @@ -5617,34 +5613,6 @@ InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint( : 0; } -mono_bool -InternalCall_Rendering_ScriptableRenderContext_RecordNativeSceneFeaturePass( - uint64_t nativeHandle, - int32_t featurePassId) { - ManagedScriptableRenderContextState* const state = - FindManagedScriptableRenderContextState(nativeHandle); - if (state == nullptr || - state->graphContext == nullptr || - state->sceneRecorder == nullptr || - state->stage != Rendering::CameraFrameStage::MainScene) { - return 0; - } - - const Rendering::NativeSceneFeaturePassId - resolvedFeaturePassId = - static_cast( - featurePassId); - if (resolvedFeaturePassId == - Rendering::NativeSceneFeaturePassId::Invalid) { - return 0; - } - - return state->sceneRecorder->RecordFeaturePass( - resolvedFeaturePassId) - ? 1 - : 0; -} - mono_bool InternalCall_Rendering_ScriptableRenderContext_DrawRenderersByDesc( uint64_t nativeHandle, @@ -6609,7 +6577,6 @@ void RegisterInternalCalls() { mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordScenePhase", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderContext_RecordScenePhase)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_DrawRenderersByDesc", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderContext_DrawRenderersByDesc)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordSceneInjectionPoint", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderContext_RecordSceneInjectionPoint)); - mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordNativeSceneFeaturePass", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderContext_RecordNativeSceneFeaturePass)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested)); mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource", reinterpret_cast(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource)); @@ -6823,41 +6790,6 @@ bool MonoScriptRuntime::TryGetAvailableRenderPipelineAssetClasses( return true; } -bool MonoScriptRuntime::TryConfigureDefaultProjectRenderPipelineAsset() { - if (!m_initialized) { - return false; - } - - Rendering::GraphicsSettingsState& graphicsSettings = - Rendering::GetGraphicsSettingsState(); - if (graphicsSettings - .GetConfiguredRenderPipelineAssetDescriptor() - .IsValid()) { - return false; - } - - const ScriptClassDescriptor defaultAssetClass = { - m_settings.appAssemblyName, - kProjectDefaultRenderPipelineAssetNamespace, - kProjectDefaultRenderPipelineAssetClassName - }; - const auto defaultAssetIt = std::find( - m_renderPipelineAssetClasses.begin(), - m_renderPipelineAssetClasses.end(), - defaultAssetClass); - if (defaultAssetIt == m_renderPipelineAssetClasses.end()) { - return false; - } - - graphicsSettings.SetConfiguredRenderPipelineAssetDescriptor( - Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor{ - defaultAssetIt->assemblyName, - defaultAssetIt->namespaceName, - defaultAssetIt->className, - 0u}); - return true; -} - std::vector MonoScriptRuntime::GetScriptClassNames(const std::string& assemblyName) const { std::vector classes; if (!TryGetAvailableScriptClasses(classes)) { @@ -6981,7 +6913,6 @@ void MonoScriptRuntime::OnRuntimeStart(Components::Scene* scene) { m_activeScene = nullptr; GetInternalCallDeltaTime() = 0.0f; if (Initialize()) { - TryConfigureDefaultProjectRenderPipelineAsset(); m_activeScene = scene; GetInternalCallScene() = scene; } diff --git a/managed/CMakeLists.txt b/managed/CMakeLists.txt index 776e7b03..c95a283b 100644 --- a/managed/CMakeLists.txt +++ b/managed/CMakeLists.txt @@ -189,7 +189,6 @@ set(XCENGINE_SCRIPT_CORE_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/FinalColorToneMappingMode.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/FilteringSettings.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/GraphicsSettings.cs - ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/NativeSceneFeaturePassId.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderSceneSetupContext.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderPipelineAsset.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.ScriptCore/Rendering/Core/RenderClearFlags.cs @@ -226,15 +225,12 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/ColorScalePostProcessSettings.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/ColorScalePostProcessRendererFeature.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/BuiltinFinalColorPass.cs - ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/BuiltinGaussianSplatRendererFeature.cs - ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/BuiltinVolumetricRendererFeature.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/DirectionalLightData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/DirectionalShadowData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/DepthPrepassBlockData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/DisableDirectionalShadowRendererFeature.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/DrawObjectsPass.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/DrawSkyboxPass.cs - ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/NativeSceneFeaturePass.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/EnvironmentData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/FinalColorData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/LightingData.cs @@ -270,7 +266,6 @@ set(XCENGINE_RENDER_PIPELINES_UNIVERSAL_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalMainSceneData.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalMainSceneBlock.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalMainSceneFeatureUtility.cs - ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalNativeSceneFeatureController.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalColorScalePostProcessController.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDepthPrepassBlock.cs ${CMAKE_CURRENT_SOURCE_DIR}/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalPostProcessBlock.cs diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/BuiltinGaussianSplatRendererFeature.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/BuiltinGaussianSplatRendererFeature.cs deleted file mode 100644 index 370244bf..00000000 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/BuiltinGaussianSplatRendererFeature.cs +++ /dev/null @@ -1,48 +0,0 @@ -using XCEngine; -using XCEngine.Rendering; - -namespace XCEngine.Rendering.Universal -{ - public sealed class BuiltinGaussianSplatRendererFeature - : ScriptableRendererFeature - { - public RenderPassEvent passEvent = - RenderPassEvent.BeforeRenderingTransparents; - private readonly UniversalNativeSceneFeatureController m_controller = - new UniversalNativeSceneFeatureController( - NativeSceneFeaturePassId - .BuiltinGaussianSplat); - - protected override int ComputeRuntimeStateHash() - { - int hash = - base.ComputeRuntimeStateHash(); - return m_controller.AppendRuntimeStateHash( - hash, - passEvent); - } - - public override void Create() - { - m_controller.Create(passEvent); - } - - public override void AddRenderPasses( - ScriptableRenderer renderer, - RenderingData renderingData) - { - if (renderer == null || - renderingData == null || - !renderingData.isMainSceneStage) - { - return; - } - - CreateInstance(); - m_controller.EnqueuePass( - renderer, - renderingData, - passEvent); - } - } -} diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/BuiltinVolumetricRendererFeature.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/BuiltinVolumetricRendererFeature.cs deleted file mode 100644 index 40c844f6..00000000 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/BuiltinVolumetricRendererFeature.cs +++ /dev/null @@ -1,48 +0,0 @@ -using XCEngine; -using XCEngine.Rendering; - -namespace XCEngine.Rendering.Universal -{ - public sealed class BuiltinVolumetricRendererFeature - : ScriptableRendererFeature - { - public RenderPassEvent passEvent = - RenderPassEvent.BeforeRenderingTransparents; - private readonly UniversalNativeSceneFeatureController m_controller = - new UniversalNativeSceneFeatureController( - NativeSceneFeaturePassId - .BuiltinVolumetric); - - protected override int ComputeRuntimeStateHash() - { - int hash = - base.ComputeRuntimeStateHash(); - return m_controller.AppendRuntimeStateHash( - hash, - passEvent); - } - - public override void Create() - { - m_controller.Create(passEvent); - } - - public override void AddRenderPasses( - ScriptableRenderer renderer, - RenderingData renderingData) - { - if (renderer == null || - renderingData == null || - !renderingData.isMainSceneStage) - { - return; - } - - CreateInstance(); - m_controller.EnqueuePass( - renderer, - renderingData, - passEvent); - } - } -} diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/NativeSceneFeaturePass.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/NativeSceneFeaturePass.cs deleted file mode 100644 index 4d2ff2c9..00000000 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/NativeSceneFeaturePass.cs +++ /dev/null @@ -1,37 +0,0 @@ -using XCEngine; -using XCEngine.Rendering; - -namespace XCEngine.Rendering.Universal -{ - internal sealed class NativeSceneFeaturePass - : ScriptableRenderPass - { - private readonly NativeSceneFeaturePassId m_featurePassId; - - public NativeSceneFeaturePass( - NativeSceneFeaturePassId featurePassId, - RenderPassEvent passEvent) - { - m_featurePassId = - featurePassId; - renderPassEvent = passEvent; - } - - public void Configure( - RenderPassEvent passEvent) - { - renderPassEvent = passEvent; - } - - protected override bool RecordRenderGraph( - ScriptableRenderContext context, - RenderingData renderingData) - { - return context != null && - renderingData != null && - renderingData.isMainSceneStage && - context.RecordNativeSceneFeaturePass( - m_featurePassId); - } - } -} diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererFeatureFactory.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererFeatureFactory.cs index f3ca317c..65d13acb 100644 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererFeatureFactory.cs +++ b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalDefaultRendererFeatureFactory.cs @@ -1,5 +1,3 @@ -using XCEngine; - namespace XCEngine.Rendering.Universal { internal static class UniversalDefaultRendererFeatureFactory @@ -7,19 +5,7 @@ namespace XCEngine.Rendering.Universal public static ScriptableRendererFeature[] CreateDefaultRendererFeatures() { - BuiltinGaussianSplatRendererFeature gaussianSplatFeature = - ScriptableObject - .CreateInstance() ?? - new BuiltinGaussianSplatRendererFeature(); - BuiltinVolumetricRendererFeature volumetricFeature = - ScriptableObject - .CreateInstance() ?? - new BuiltinVolumetricRendererFeature(); - return new ScriptableRendererFeature[] - { - gaussianSplatFeature, - volumetricFeature - }; + return System.Array.Empty(); } } } diff --git a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalNativeSceneFeatureController.cs b/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalNativeSceneFeatureController.cs deleted file mode 100644 index 1cb79dee..00000000 --- a/managed/XCEngine.RenderPipelines.Universal/Rendering/Universal/UniversalNativeSceneFeatureController.cs +++ /dev/null @@ -1,53 +0,0 @@ -using XCEngine; -using XCEngine.Rendering; - -namespace XCEngine.Rendering.Universal -{ - internal sealed class UniversalNativeSceneFeatureController - { - private readonly NativeSceneFeaturePassId m_featurePassId; - private NativeSceneFeaturePass m_pass; - - public UniversalNativeSceneFeatureController( - NativeSceneFeaturePassId featurePassId) - { - m_featurePassId = - featurePassId; - } - - public int AppendRuntimeStateHash( - int hash, - RenderPassEvent passEvent) - { - return RuntimeStateHashUtility.Combine( - hash, - (int)passEvent); - } - - public void Create( - RenderPassEvent passEvent) - { - if (m_pass == null) - { - m_pass = new NativeSceneFeaturePass( - m_featurePassId, - passEvent); - return; - } - - m_pass.Configure(passEvent); - } - - public void EnqueuePass( - ScriptableRenderer renderer, - RenderingData renderingData, - RenderPassEvent passEvent) - { - Create(passEvent); - UniversalMainSceneFeatureUtility.EnqueuePass( - renderer, - renderingData, - m_pass); - } - } -} diff --git a/managed/XCEngine.ScriptCore/InternalCalls.cs b/managed/XCEngine.ScriptCore/InternalCalls.cs index c80752b7..adb43d03 100644 --- a/managed/XCEngine.ScriptCore/InternalCalls.cs +++ b/managed/XCEngine.ScriptCore/InternalCalls.cs @@ -910,12 +910,6 @@ namespace XCEngine ulong nativeHandle, int injectionPoint); - [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern bool - Rendering_ScriptableRenderContext_RecordNativeSceneFeaturePass( - ulong nativeHandle, - int featurePassId); - [MethodImpl(MethodImplOptions.InternalCall)] internal static extern int Rendering_CameraRenderRequestContext_GetRenderedBaseCameraCount( diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/NativeSceneFeaturePassId.cs b/managed/XCEngine.ScriptCore/Rendering/Core/NativeSceneFeaturePassId.cs deleted file mode 100644 index a0b6c29d..00000000 --- a/managed/XCEngine.ScriptCore/Rendering/Core/NativeSceneFeaturePassId.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace XCEngine.Rendering -{ - public enum NativeSceneFeaturePassId - { - Invalid = 0, - BuiltinGaussianSplat = 1, - BuiltinVolumetric = 2 - } -} diff --git a/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs b/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs index d5612b34..90dc9fd9 100644 --- a/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs +++ b/managed/XCEngine.ScriptCore/Rendering/Core/ScriptableRenderContext.cs @@ -75,17 +75,6 @@ namespace XCEngine.Rendering (int)injectionPoint); } - public bool RecordNativeSceneFeaturePass( - NativeSceneFeaturePassId featurePassId) - { - return featurePassId != - NativeSceneFeaturePassId.Invalid && - InternalCalls - .Rendering_ScriptableRenderContext_RecordNativeSceneFeaturePass( - m_nativeHandle, - (int)featurePassId); - } - public bool DrawRenderers( SceneRenderPhase scenePhase, RendererListType rendererListType) diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index bda33de8..97f5f7ec 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -5300,14 +5300,50 @@ TEST(CameraRenderer_Test, DefaultPipelineAssetUsesManagedSelectionWhenPresent) { Pipelines::ClearConfiguredManagedRenderPipelineAssetDescriptor(); } +TEST( + CameraRenderer_Test, + DefaultPipelineAssetUsesBuiltinPipelineWhenManagedSelectionIsAbsent) { + Pipelines::ClearConfiguredManagedRenderPipelineAssetDescriptor(); + + CameraRenderer renderer; + EXPECT_NE( + dynamic_cast( + renderer.GetPipelineAsset()), + nullptr); + EXPECT_EQ( + dynamic_cast( + renderer.GetPipelineAsset()), + nullptr); + EXPECT_NE( + dynamic_cast( + renderer.GetPipeline()), + nullptr); + EXPECT_EQ( + dynamic_cast( + renderer.GetPipeline()), + nullptr); +} + TEST(CameraRenderer_Test, DefaultPipelineAssetRefreshesWhenManagedSelectionChanges) { Pipelines::ClearConfiguredManagedRenderPipelineAssetDescriptor(); CameraRenderer renderer; + EXPECT_NE( + dynamic_cast( + renderer.GetPipelineAsset()), + nullptr); EXPECT_EQ( dynamic_cast( renderer.GetPipelineAsset()), nullptr); + EXPECT_NE( + dynamic_cast( + renderer.GetPipeline()), + nullptr); + EXPECT_EQ( + dynamic_cast( + renderer.GetPipeline()), + nullptr); const Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = { "GameScripts", @@ -5323,12 +5359,28 @@ TEST(CameraRenderer_Test, DefaultPipelineAssetRefreshesWhenManagedSelectionChang EXPECT_EQ(managedAsset->GetDescriptor().assemblyName, "GameScripts"); EXPECT_EQ(managedAsset->GetDescriptor().namespaceName, "Gameplay"); EXPECT_EQ(managedAsset->GetDescriptor().className, "ManagedRenderPipelineProbeAsset"); + EXPECT_NE( + dynamic_cast( + renderer.GetPipeline()), + nullptr); Pipelines::ClearConfiguredManagedRenderPipelineAssetDescriptor(); + EXPECT_NE( + dynamic_cast( + renderer.GetPipelineAsset()), + nullptr); EXPECT_EQ( dynamic_cast( renderer.GetPipelineAsset()), nullptr); + EXPECT_NE( + dynamic_cast( + renderer.GetPipeline()), + nullptr); + EXPECT_EQ( + dynamic_cast( + renderer.GetPipeline()), + nullptr); } TEST(CameraRenderer_Test, RebindsToResolvedDefaultAssetWhenPreferredAssetCannotCreatePipeline) { diff --git a/tests/scripting/test_project_script_assembly.cpp b/tests/scripting/test_project_script_assembly.cpp index 3375dd46..f719f38c 100644 --- a/tests/scripting/test_project_script_assembly.cpp +++ b/tests/scripting/test_project_script_assembly.cpp @@ -241,7 +241,9 @@ TEST_F(ProjectScriptAssemblyTest, DiscoversProjectAssetRenderPipelineAssetClasse TEST_F( ProjectScriptAssemblyTest, - AutoConfiguresProjectDefaultRenderPipelineAssetOnRuntimeStart) { + DoesNotAutoConfigureProjectDefaultRenderPipelineAssetOnRuntimeStart) { + XCEngine::Rendering::Pipelines:: + ClearConfiguredManagedRenderPipelineAssetDescriptor(); Scene* runtimeScene = CreateScene("ProjectDefaultRenderPipelineScene"); @@ -251,32 +253,7 @@ TEST_F( descriptor = XCEngine::Rendering::Pipelines:: GetConfiguredManagedRenderPipelineAssetDescriptor(); - ASSERT_TRUE(descriptor.IsValid()); - EXPECT_EQ(descriptor.assemblyName, "GameScripts"); - EXPECT_EQ(descriptor.namespaceName, "ProjectScripts"); - EXPECT_EQ( - descriptor.className, - "ProjectDefaultRenderPipelineAsset"); - - const auto bridge = - XCEngine::Rendering::Pipelines::GetManagedRenderPipelineBridge(); - ASSERT_NE(bridge, nullptr); - - std::shared_ptr - assetRuntime = bridge->CreateAssetRuntime(descriptor); - ASSERT_NE(assetRuntime, nullptr); - - std::unique_ptr - recorder = assetRuntime->CreateStageRecorder(); - ASSERT_NE(recorder, nullptr); - - const XCEngine::Rendering::RenderContext context = {}; - ASSERT_TRUE(recorder->Initialize(context)); - EXPECT_TRUE( - recorder->SupportsStageRenderGraph( - XCEngine::Rendering::CameraFrameStage::MainScene)); - - recorder->Shutdown(); + EXPECT_FALSE(descriptor.IsValid()); } TEST_F(