diff --git a/engine/include/XCEngine/Rendering/Execution/CameraFrameRenderGraphResources.h b/engine/include/XCEngine/Rendering/Execution/CameraFrameRenderGraphResources.h index 70c74424..18fc1709 100644 --- a/engine/include/XCEngine/Rendering/Execution/CameraFrameRenderGraphResources.h +++ b/engine/include/XCEngine/Rendering/Execution/CameraFrameRenderGraphResources.h @@ -18,48 +18,71 @@ struct CameraFrameRenderGraphResources { RenderGraphTextureHandle mainDirectionalShadow = {}; }; -inline CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphStageSurfaceResources( +inline CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphSurfaceResources( CameraFrameRenderGraphResources& frameResources, - CameraFrameStage stage) { - switch (stage) { - case CameraFrameStage::MainScene: + CameraFrameStageSurfaceResourceSlot slot) { + switch (slot) { + case CameraFrameStageSurfaceResourceSlot::MainScene: return &frameResources.mainScene; - case CameraFrameStage::PostProcess: + case CameraFrameStageSurfaceResourceSlot::PostProcess: return &frameResources.postProcess; - case CameraFrameStage::ObjectId: + case CameraFrameStageSurfaceResourceSlot::ObjectId: return &frameResources.objectId; default: return nullptr; } } -inline const CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphStageSurfaceResources( +inline const CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphSurfaceResources( const CameraFrameRenderGraphResources& frameResources, - CameraFrameStage stage) { - switch (stage) { - case CameraFrameStage::MainScene: + CameraFrameStageSurfaceResourceSlot slot) { + switch (slot) { + case CameraFrameStageSurfaceResourceSlot::MainScene: return &frameResources.mainScene; - case CameraFrameStage::PostProcess: + case CameraFrameStageSurfaceResourceSlot::PostProcess: return &frameResources.postProcess; - case CameraFrameStage::ObjectId: + case CameraFrameStageSurfaceResourceSlot::ObjectId: return &frameResources.objectId; default: return nullptr; } } +inline CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphStageSurfaceResources( + CameraFrameRenderGraphResources& frameResources, + CameraFrameStage stage) { + return ResolveCameraFrameRenderGraphSurfaceResources( + frameResources, + GetCameraFrameStageSurfaceResourceSlot(stage)); +} + +inline const CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphStageSurfaceResources( + const CameraFrameRenderGraphResources& frameResources, + CameraFrameStage stage) { + return ResolveCameraFrameRenderGraphSurfaceResources( + frameResources, + GetCameraFrameStageSurfaceResourceSlot(stage)); +} + +inline constexpr CameraFrameStageSurfaceResourceSlot +ResolveCameraFrameColorSourceSurfaceResourceSlot( + CameraFrameColorSource source) { + switch (source) { + case CameraFrameColorSource::MainSceneColor: + return CameraFrameStageSurfaceResourceSlot::MainScene; + case CameraFrameColorSource::PostProcessColor: + return CameraFrameStageSurfaceResourceSlot::PostProcess; + default: + return CameraFrameStageSurfaceResourceSlot::None; + } +} + inline const CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphColorSourceResources( const CameraFrameRenderGraphResources& frameResources, CameraFrameColorSource source) { - switch (source) { - case CameraFrameColorSource::MainSceneColor: - return &frameResources.mainScene; - case CameraFrameColorSource::PostProcessColor: - return &frameResources.postProcess; - case CameraFrameColorSource::ExplicitSurface: - default: - return nullptr; - } + return ResolveCameraFrameRenderGraphSurfaceResources( + frameResources, + ResolveCameraFrameColorSourceSurfaceResourceSlot(source)); } inline RenderGraphTextureHandle ResolveCameraFrameRenderGraphColorSource( diff --git a/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h b/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h index ef753ae4..e2bc2520 100644 --- a/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h +++ b/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h @@ -32,6 +32,13 @@ enum class CameraFrameStageRequestKind : uint8_t { ObjectId }; +enum class CameraFrameStageSurfaceResourceSlot : uint8_t { + None, + MainScene, + PostProcess, + ObjectId +}; + struct CameraFrameStageInfo { CameraFrameStage stage = CameraFrameStage::MainScene; const char* name = ""; @@ -93,6 +100,11 @@ inline constexpr bool IsCameraFrameSequenceStage(CameraFrameStage stage) { CameraFrameStageExecutionKind::Sequence; } +inline constexpr bool IsCameraFrameFullscreenSequenceStage(CameraFrameStage stage) { + return stage == CameraFrameStage::PostProcess || + stage == CameraFrameStage::FinalOutput; +} + inline constexpr bool SupportsCameraFrameStandalonePass(CameraFrameStage stage) { return GetCameraFrameStageExecutionKind(stage) == CameraFrameStageExecutionKind::StandalonePass; @@ -130,5 +142,35 @@ inline constexpr const char* GetCameraFrameStageName(CameraFrameStage stage) { } } +inline constexpr bool DoesCameraFrameStageGraphOwnColorTransitions( + CameraFrameStage stage) { + return stage == CameraFrameStage::MainScene || + stage == CameraFrameStage::PostProcess || + stage == CameraFrameStage::FinalOutput || + stage == CameraFrameStage::ObjectId; +} + +inline constexpr bool DoesCameraFrameStageGraphOwnDepthTransitions( + CameraFrameStage stage) { + return stage == CameraFrameStage::ShadowCaster || + stage == CameraFrameStage::DepthOnly || + stage == CameraFrameStage::MainScene || + stage == CameraFrameStage::ObjectId; +} + +inline constexpr CameraFrameStageSurfaceResourceSlot +GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage stage) { + switch (stage) { + case CameraFrameStage::MainScene: + return CameraFrameStageSurfaceResourceSlot::MainScene; + case CameraFrameStage::PostProcess: + return CameraFrameStageSurfaceResourceSlot::PostProcess; + case CameraFrameStage::ObjectId: + return CameraFrameStageSurfaceResourceSlot::ObjectId; + default: + return CameraFrameStageSurfaceResourceSlot::None; + } +} + } // namespace Rendering } // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StagePolicy.h b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StagePolicy.h index 2394b169..024f0e24 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StagePolicy.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StagePolicy.h @@ -13,28 +13,6 @@ struct CameraFrameRenderGraphSourceBinding { RenderGraphTextureHandle sourceColor = {}; }; -inline bool IsCameraFrameFullscreenSequenceStage( - CameraFrameStage stage) { - return stage == CameraFrameStage::PostProcess || - stage == CameraFrameStage::FinalOutput; -} - -inline bool DoesCameraFrameStageGraphOwnColorTransitions( - CameraFrameStage stage) { - return stage == CameraFrameStage::MainScene || - stage == CameraFrameStage::PostProcess || - stage == CameraFrameStage::FinalOutput || - stage == CameraFrameStage::ObjectId; -} - -inline bool DoesCameraFrameStageGraphOwnDepthTransitions( - CameraFrameStage stage) { - return stage == CameraFrameStage::ShadowCaster || - stage == CameraFrameStage::DepthOnly || - stage == CameraFrameStage::MainScene || - stage == CameraFrameStage::ObjectId; -} - inline bool UsesCameraFrameStageGraphManagedOutputColor( const CameraFramePlan& plan, CameraFrameStage stage) { diff --git a/tests/Rendering/unit/test_camera_frame_graph_frame_data.cpp b/tests/Rendering/unit/test_camera_frame_graph_frame_data.cpp index dce1d07f..24b393ba 100644 --- a/tests/Rendering/unit/test_camera_frame_graph_frame_data.cpp +++ b/tests/Rendering/unit/test_camera_frame_graph_frame_data.cpp @@ -45,3 +45,44 @@ TEST(CameraFrameRenderGraphFrameData_Test, ResolvesColorSourceFromBlackboardFram .index, 19u); } + +TEST(CameraFrameRenderGraphFrameData_Test, ResolvesStageSurfaceResourcesThroughCentralSlotPolicy) { + CameraFrameRenderGraphResources frameResources = {}; + + EXPECT_EQ( + ResolveCameraFrameRenderGraphStageSurfaceResources( + frameResources, + CameraFrameStage::MainScene), + &frameResources.mainScene); + EXPECT_EQ( + ResolveCameraFrameRenderGraphStageSurfaceResources( + frameResources, + CameraFrameStage::PostProcess), + &frameResources.postProcess); + EXPECT_EQ( + ResolveCameraFrameRenderGraphStageSurfaceResources( + frameResources, + CameraFrameStage::ObjectId), + &frameResources.objectId); + EXPECT_EQ( + ResolveCameraFrameRenderGraphStageSurfaceResources( + frameResources, + CameraFrameStage::FinalOutput), + nullptr); + + WriteCameraFrameRenderGraphStageSurfaceResources( + frameResources, + CameraFrameStage::PostProcess, + RenderGraphTextureHandle{ 23u }, + RenderGraphTextureHandle{ 29u }); + WriteCameraFrameRenderGraphStageSurfaceResources( + frameResources, + CameraFrameStage::FinalOutput, + RenderGraphTextureHandle{ 31u }, + RenderGraphTextureHandle{ 37u }); + + EXPECT_EQ(frameResources.postProcess.color.index, 23u); + EXPECT_EQ(frameResources.postProcess.depth.index, 29u); + EXPECT_FALSE(frameResources.mainScene.color.IsValid()); + EXPECT_FALSE(frameResources.objectId.color.IsValid()); +} diff --git a/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp b/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp index 30d5da9f..3359e97b 100644 --- a/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp +++ b/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp @@ -11,6 +11,18 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsStageFullscreenAndTransition EXPECT_TRUE(IsCameraFrameSequenceStage(CameraFrameStage::PreScenePasses)); EXPECT_TRUE(IsCameraFrameSequenceStage(CameraFrameStage::OverlayPasses)); EXPECT_FALSE(IsCameraFrameSequenceStage(CameraFrameStage::MainScene)); + EXPECT_EQ( + GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage::MainScene), + CameraFrameStageSurfaceResourceSlot::MainScene); + EXPECT_EQ( + GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage::PostProcess), + CameraFrameStageSurfaceResourceSlot::PostProcess); + EXPECT_EQ( + GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage::ObjectId), + CameraFrameStageSurfaceResourceSlot::ObjectId); + EXPECT_EQ( + GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage::FinalOutput), + CameraFrameStageSurfaceResourceSlot::None); EXPECT_EQ( GetCameraFrameStageExecutionKind(CameraFrameStage::PostProcess),