diff --git a/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h b/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h index 8a347869..fcdcb050 100644 --- a/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h +++ b/engine/include/XCEngine/Rendering/Execution/CameraFrameStage.h @@ -192,5 +192,16 @@ GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage stage) { } } +inline constexpr bool DoesCameraFrameStageFallbackUseColorOnlySurfaceAccess( + CameraFrameStage stage) { + return IsCameraFrameFullscreenSequenceStage(stage); +} + +inline constexpr bool +DoesCameraFrameStageFallbackPromoteSourceToPixelShaderResource( + CameraFrameStage stage) { + return IsCameraFrameFullscreenSequenceStage(stage); +} + } // namespace Rendering } // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp index 4b589682..adc6d9ea 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameGraph/StageContract.cpp @@ -103,7 +103,7 @@ std::vector BuildCameraFrameStageGraphDefaultColorTarg RenderGraphSurfaceAccessMode BuildCameraFrameStageFallbackSurfaceAccessMode( CameraFrameStage stage) { - return IsCameraFrameFullscreenSequenceStage(stage) + return DoesCameraFrameStageFallbackUseColorOnlySurfaceAccess(stage) ? RenderGraphSurfaceAccessMode::ColorOnly : RenderGraphSurfaceAccessMode::ColorDepth; } @@ -509,7 +509,8 @@ CameraFrameStageFallbackSurfaceResolution ResolveCameraFrameStageFallbackSurface } resolution.sourceSurface = stageState.sourceSurfaceTemplate; - if (IsCameraFrameFullscreenSequenceStage(stageState.stage) && + if (DoesCameraFrameStageFallbackPromoteSourceToPixelShaderResource( + stageState.stage) && graphOwnsSourceTransitions) { resolution.sourceSurface = BuildGraphManagedImportedSurface( diff --git a/tests/Rendering/unit/test_camera_frame_graph_stage_contract.cpp b/tests/Rendering/unit/test_camera_frame_graph_stage_contract.cpp index aef757a2..da5905db 100644 --- a/tests/Rendering/unit/test_camera_frame_graph_stage_contract.cpp +++ b/tests/Rendering/unit/test_camera_frame_graph_stage_contract.cpp @@ -1099,6 +1099,33 @@ TEST(CameraFrameRenderGraphStageContract_Test, ResolvesFullscreenFallbackSurface XCEngine::RHI::ResourceStates::PixelShaderResource); } +TEST(CameraFrameRenderGraphStageContract_Test, ResolvesRegularFallbackSurfaceWithoutPromotingSourceState) { + CameraFrameStageGraphBuildState stageState = {}; + stageState.stage = CameraFrameStage::ObjectId; + stageState.hasSourceSurface = true; + stageState.surfaceTemplate = RenderSurface(800, 600); + stageState.surfaceTemplate.SetAutoTransitionEnabled(true); + stageState.sourceSurfaceTemplate = RenderSurface(800, 600); + stageState.sourceSurfaceTemplate.SetAutoTransitionEnabled(true); + stageState.sourceColorView = + reinterpret_cast(35); + stageState.sourceColorState = XCEngine::RHI::ResourceStates::CopySrc; + + const CameraFrameStageFallbackSurfaceResolution resolution = + ResolveCameraFrameStageFallbackSurfaceResolution( + stageState, + true, + true); + + EXPECT_TRUE(resolution.hasSourceSurface); + EXPECT_TRUE(resolution.sourceSurface.IsAutoTransitionEnabled()); + EXPECT_FALSE(resolution.outputSurface.IsAutoTransitionEnabled()); + EXPECT_EQ(resolution.sourceColorView, stageState.sourceColorView); + EXPECT_EQ( + resolution.sourceColorState, + XCEngine::RHI::ResourceStates::CopySrc); +} + TEST(CameraFrameRenderGraphStageContract_Test, BuildsFallbackPassContextFromResolvedSurfaces) { CameraFrameStageFallbackSurfaceResolution resolution = {}; resolution.hasSourceSurface = true; 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 3f44aa34..1e8ed6b3 100644 --- a/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp +++ b/tests/Rendering/unit/test_camera_frame_graph_stage_policy.cpp @@ -38,6 +38,21 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsStageFullscreenAndTransition EXPECT_EQ( GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage::PostProcess), CameraFrameStageSharedSurfaceRole::None); + EXPECT_TRUE( + DoesCameraFrameStageFallbackUseColorOnlySurfaceAccess( + CameraFrameStage::PostProcess)); + EXPECT_TRUE( + DoesCameraFrameStageFallbackUseColorOnlySurfaceAccess( + CameraFrameStage::FinalOutput)); + EXPECT_FALSE( + DoesCameraFrameStageFallbackUseColorOnlySurfaceAccess( + CameraFrameStage::ObjectId)); + EXPECT_TRUE( + DoesCameraFrameStageFallbackPromoteSourceToPixelShaderResource( + CameraFrameStage::PostProcess)); + EXPECT_FALSE( + DoesCameraFrameStageFallbackPromoteSourceToPixelShaderResource( + CameraFrameStage::ShadowCaster)); EXPECT_EQ( GetCameraFrameStageExecutionKind(CameraFrameStage::PostProcess),