diff --git a/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h b/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h index 65ea02ac..9170f57e 100644 --- a/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h +++ b/engine/include/XCEngine/Rendering/Execution/CameraFramePlan.h @@ -54,6 +54,7 @@ struct CameraFramePlan { const FullscreenPassRenderRequest* GetFullscreenPassRequest(CameraFrameStage stage) const; const ScenePassRenderRequest* GetScenePassRequest(CameraFrameStage stage) const; const ObjectIdRenderRequest* GetObjectIdRequest(CameraFrameStage stage) const; + const RenderSurface* GetSharedStageOutputSurface(CameraFrameStage stage) const; const RenderSurface& GetMainSceneSurface() const; const RenderSurface& GetFinalCompositedSurface() const; bool RequiresIntermediateSceneColor() const; diff --git a/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h b/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h index e2bc2520..8a347869 100644 --- a/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h +++ b/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h @@ -39,6 +39,12 @@ enum class CameraFrameStageSurfaceResourceSlot : uint8_t { ObjectId }; +enum class CameraFrameStageSharedSurfaceRole : uint8_t { + None, + MainScene, + FinalComposited +}; + struct CameraFrameStageInfo { CameraFrameStage stage = CameraFrameStage::MainScene; const char* name = ""; @@ -172,5 +178,19 @@ GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage stage) { } } +inline constexpr CameraFrameStageSharedSurfaceRole +GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage stage) { + switch (stage) { + case CameraFrameStage::PreScenePasses: + case CameraFrameStage::MainScene: + return CameraFrameStageSharedSurfaceRole::MainScene; + case CameraFrameStage::PostScenePasses: + case CameraFrameStage::OverlayPasses: + return CameraFrameStageSharedSurfaceRole::FinalComposited; + default: + return CameraFrameStageSharedSurfaceRole::None; + } +} + } // namespace Rendering } // namespace XCEngine diff --git a/engine/src/Rendering/Execution/CameraFramePlan.cpp b/engine/src/Rendering/Execution/CameraFramePlan.cpp index 22c07590..e96a9faf 100644 --- a/engine/src/Rendering/Execution/CameraFramePlan.cpp +++ b/engine/src/Rendering/Execution/CameraFramePlan.cpp @@ -191,6 +191,18 @@ const ObjectIdRenderRequest* CameraFramePlan::GetObjectIdRequest(CameraFrameStag : nullptr; } +const RenderSurface* CameraFramePlan::GetSharedStageOutputSurface( + CameraFrameStage stage) const { + switch (GetCameraFrameStageSharedOutputSurfaceRole(stage)) { + case CameraFrameStageSharedSurfaceRole::MainScene: + return &GetMainSceneSurface(); + case CameraFrameStageSharedSurfaceRole::FinalComposited: + return &GetFinalCompositedSurface(); + default: + return nullptr; + } +} + const RenderSurface& CameraFramePlan::GetMainSceneSurface() const { if (UsesGraphManagedMainSceneColor() && graphManagedMainSceneSurface.GetWidth() > 0u && diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/SurfaceResolver.h b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/SurfaceResolver.h index d4f7bb84..17a84743 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/SurfaceResolver.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/SurfaceResolver.h @@ -33,9 +33,10 @@ inline const RenderSurface* ResolveCameraFrameStageOutputSurface( CameraFrameStage stage, const CameraFramePlan& plan, const DirectionalShadowExecutionState& shadowState) { - if (stage == CameraFrameStage::PreScenePasses || - stage == CameraFrameStage::MainScene) { - return &plan.GetMainSceneSurface(); + if (const RenderSurface* sharedSurface = + plan.GetSharedStageOutputSurface(stage); + sharedSurface != nullptr) { + return sharedSurface; } if (const ScenePassRenderRequest* scenePassRequest = @@ -61,11 +62,6 @@ inline const RenderSurface* ResolveCameraFrameStageOutputSurface( return &objectIdRequest->surface; } - if (stage == CameraFrameStage::PostScenePasses || - stage == CameraFrameStage::OverlayPasses) { - return &plan.GetFinalCompositedSurface(); - } - return nullptr; } 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 3359e97b..3f44aa34 100644 --- a/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp +++ b/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp @@ -23,6 +23,21 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsStageFullscreenAndTransition EXPECT_EQ( GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage::FinalOutput), CameraFrameStageSurfaceResourceSlot::None); + EXPECT_EQ( + GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage::PreScenePasses), + CameraFrameStageSharedSurfaceRole::MainScene); + EXPECT_EQ( + GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage::MainScene), + CameraFrameStageSharedSurfaceRole::MainScene); + EXPECT_EQ( + GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage::PostScenePasses), + CameraFrameStageSharedSurfaceRole::FinalComposited); + EXPECT_EQ( + GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage::OverlayPasses), + CameraFrameStageSharedSurfaceRole::FinalComposited); + EXPECT_EQ( + GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage::PostProcess), + CameraFrameStageSharedSurfaceRole::None); EXPECT_EQ( GetCameraFrameStageExecutionKind(CameraFrameStage::PostProcess), diff --git a/tests/Rendering/unit/test_camera_scene_renderer.cpp b/tests/Rendering/unit/test_camera_scene_renderer.cpp index 05b8fbe3..28f2bc2e 100644 --- a/tests/Rendering/unit/test_camera_scene_renderer.cpp +++ b/tests/Rendering/unit/test_camera_scene_renderer.cpp @@ -954,6 +954,9 @@ TEST(CameraRenderRequest_Test, ReportsFormalFrameStageContract) { EXPECT_EQ(plan.GetScenePassRequest(CameraFrameStage::MainScene), nullptr); EXPECT_EQ(plan.GetObjectIdRequest(CameraFrameStage::ObjectId), &plan.request.objectId); EXPECT_EQ(plan.GetObjectIdRequest(CameraFrameStage::MainScene), nullptr); + EXPECT_EQ(plan.GetSharedStageOutputSurface(CameraFrameStage::PreScenePasses), &plan.GetMainSceneSurface()); + EXPECT_EQ(plan.GetSharedStageOutputSurface(CameraFrameStage::OverlayPasses), &plan.GetFinalCompositedSurface()); + EXPECT_EQ(plan.GetSharedStageOutputSurface(CameraFrameStage::PostProcess), nullptr); EXPECT_TRUE(plan.RequiresIntermediateSceneColor()); EXPECT_EQ(plan.GetMainSceneSurface().GetRenderAreaWidth(), 256u); EXPECT_EQ(plan.GetMainSceneSurface().GetRenderAreaHeight(), 128u);