diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp index fbdc6244..b506ab80 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp @@ -19,6 +19,41 @@ CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding( }; } +CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding( + const CameraFramePlan& plan, + CameraFrameStage stage, + const RenderSurface& stageSurfaceTemplate, + const RenderSurface* explicitSourceSurfaceTemplate, + RHI::RHIResourceView* explicitSourceColorView, + const RHI::ResourceStates explicitSourceColorState, + const RenderGraphTextureHandle explicitSourceColor, + const RenderGraphBlackboard* blackboard) { + CameraFrameRenderGraphSourceBinding binding = {}; + binding.sourceSurfaceTemplate = explicitSourceSurfaceTemplate; + binding.sourceColorView = explicitSourceColorView; + binding.sourceColorState = explicitSourceColorState; + binding.sourceColor = explicitSourceColor; + + const CameraFrameColorSource graphManagedSource = + ResolveCameraFrameStageGraphManagedColorSource(plan, stage); + if (graphManagedSource != CameraFrameColorSource::ExplicitSurface) { + binding.sourceSurfaceTemplate = &stageSurfaceTemplate; + binding.sourceColorView = nullptr; + binding.sourceColorState = RHI::ResourceStates::PixelShaderResource; + binding.sourceColor = + ResolveCameraFrameRenderGraphColorSource( + blackboard, + graphManagedSource); + } + + if (binding.sourceSurfaceTemplate == nullptr && + binding.sourceColor.IsValid()) { + binding.sourceSurfaceTemplate = &stageSurfaceTemplate; + } + + return binding; +} + RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext( const CameraFrameRenderGraphStageContext& context, const CameraFrameStageGraphBuildState& stageState, diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h index e193ef26..70454d24 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h @@ -23,6 +23,16 @@ struct CameraFrameStageFallbackSurfaceResolution { CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding( const CameraFrameStageGraphBuildState& stageState); +CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding( + const CameraFramePlan& plan, + CameraFrameStage stage, + const RenderSurface& stageSurfaceTemplate, + const RenderSurface* explicitSourceSurfaceTemplate, + RHI::RHIResourceView* explicitSourceColorView, + RHI::ResourceStates explicitSourceColorState, + RenderGraphTextureHandle explicitSourceColor, + const RenderGraphBlackboard* blackboard); + RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext( const CameraFrameRenderGraphStageContext& context, const CameraFrameStageGraphBuildState& stageState, diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePolicy.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePolicy.h index 30cb06c0..2394b169 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePolicy.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePolicy.h @@ -52,40 +52,5 @@ inline CameraFrameColorSource ResolveCameraFrameStageGraphManagedColorSource( return plan.ResolveStageColorSource(stage); } -inline CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding( - const CameraFramePlan& plan, - CameraFrameStage stage, - const RenderSurface& stageSurfaceTemplate, - const RenderSurface* explicitSourceSurfaceTemplate, - RHI::RHIResourceView* explicitSourceColorView, - RHI::ResourceStates explicitSourceColorState, - RenderGraphTextureHandle explicitSourceColor, - const RenderGraphBlackboard* blackboard) { - CameraFrameRenderGraphSourceBinding binding = {}; - binding.sourceSurfaceTemplate = explicitSourceSurfaceTemplate; - binding.sourceColorView = explicitSourceColorView; - binding.sourceColorState = explicitSourceColorState; - binding.sourceColor = explicitSourceColor; - - const CameraFrameColorSource graphManagedSource = - ResolveCameraFrameStageGraphManagedColorSource(plan, stage); - if (graphManagedSource != CameraFrameColorSource::ExplicitSurface) { - binding.sourceSurfaceTemplate = &stageSurfaceTemplate; - binding.sourceColorView = nullptr; - binding.sourceColorState = RHI::ResourceStates::PixelShaderResource; - binding.sourceColor = - ResolveCameraFrameRenderGraphColorSource( - blackboard, - graphManagedSource); - } - - if (binding.sourceSurfaceTemplate == nullptr && - binding.sourceColor.IsValid()) { - binding.sourceSurfaceTemplate = &stageSurfaceTemplate; - } - - return binding; -} - } // namespace Rendering } // namespace XCEngine diff --git a/tests/Rendering/unit/test_camera_frame_render_graph_stage_contract.cpp b/tests/Rendering/unit/test_camera_frame_render_graph_stage_contract.cpp index 89feb09b..db8bb20a 100644 --- a/tests/Rendering/unit/test_camera_frame_render_graph_stage_contract.cpp +++ b/tests/Rendering/unit/test_camera_frame_render_graph_stage_contract.cpp @@ -34,6 +34,15 @@ RenderGraphTextureHandle ImportTestTexture( {}); } +RenderSurface CreateColorSurface( + uint32_t width, + uint32_t height, + XCEngine::RHI::RHIResourceView* colorAttachment) { + RenderSurface surface(width, height); + surface.SetColorAttachment(colorAttachment); + return surface; +} + } // namespace TEST(CameraFrameRenderGraphStageContract_Test, BuildsSourceBindingFromStageState) { @@ -121,6 +130,88 @@ TEST(CameraFrameRenderGraphStageContract_Test, BuildsRecordingContextFromStageSt EXPECT_EQ(recordingContext.blackboard, &blackboard); } +TEST(CameraFrameRenderGraphStageContract_Test, KeepsExplicitFullscreenSourceBindingUntouched) { + CameraFramePlan plan = {}; + RenderSurface stageSurface(320, 180); + RenderSurface explicitSourceSurface = + CreateColorSurface( + 320, + 180, + reinterpret_cast(11)); + XCEngine::RHI::RHIResourceView* const explicitSourceColorView = + reinterpret_cast(12); + + const CameraFrameRenderGraphSourceBinding binding = + ResolveCameraFrameFullscreenStageGraphSourceBinding( + plan, + CameraFrameStage::PostProcess, + stageSurface, + &explicitSourceSurface, + explicitSourceColorView, + XCEngine::RHI::ResourceStates::CopySrc, + RenderGraphTextureHandle{ 21u }, + nullptr); + + EXPECT_EQ(binding.sourceSurfaceTemplate, &explicitSourceSurface); + EXPECT_EQ(binding.sourceColorView, explicitSourceColorView); + EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::CopySrc); + EXPECT_EQ(binding.sourceColor.index, 21u); +} + +TEST(CameraFrameRenderGraphStageContract_Test, ResolvesGraphManagedPostProcessSourceFromBlackboard) { + CameraFramePlan plan = {}; + plan.colorChain.postProcess.source = CameraFrameColorSource::MainSceneColor; + + RenderGraphBlackboard blackboard = {}; + CameraFrameRenderGraphResources& frameResources = + EmplaceCameraFrameRenderGraphFrameData(blackboard).resources; + frameResources.mainScene.color = RenderGraphTextureHandle{ 31u }; + + RenderSurface stageSurface(640, 360); + const CameraFrameRenderGraphSourceBinding binding = + ResolveCameraFrameFullscreenStageGraphSourceBinding( + plan, + CameraFrameStage::PostProcess, + stageSurface, + nullptr, + reinterpret_cast(41), + XCEngine::RHI::ResourceStates::Common, + {}, + &blackboard); + + EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface); + EXPECT_EQ(binding.sourceColorView, nullptr); + EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource); + EXPECT_EQ(binding.sourceColor.index, 31u); +} + +TEST(CameraFrameRenderGraphStageContract_Test, ResolvesGraphManagedFinalOutputSourceFromBlackboard) { + CameraFramePlan plan = {}; + plan.colorChain.finalOutput.source = CameraFrameColorSource::PostProcessColor; + + RenderGraphBlackboard blackboard = {}; + CameraFrameRenderGraphResources& frameResources = + EmplaceCameraFrameRenderGraphFrameData(blackboard).resources; + frameResources.postProcess.color = RenderGraphTextureHandle{ 51u }; + + RenderSurface stageSurface(800, 600); + const CameraFrameRenderGraphSourceBinding binding = + ResolveCameraFrameFullscreenStageGraphSourceBinding( + plan, + CameraFrameStage::FinalOutput, + stageSurface, + nullptr, + reinterpret_cast(61), + XCEngine::RHI::ResourceStates::Common, + {}, + &blackboard); + + EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface); + EXPECT_EQ(binding.sourceColorView, nullptr); + EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource); + EXPECT_EQ(binding.sourceColor.index, 51u); +} + TEST(CameraFrameRenderGraphStageContract_Test, ResolvesFullscreenFallbackSurfaceOverrides) { CameraFrameStageGraphBuildState stageState = {}; stageState.stage = CameraFrameStage::PostProcess; diff --git a/tests/Rendering/unit/test_camera_frame_render_graph_stage_policy.cpp b/tests/Rendering/unit/test_camera_frame_render_graph_stage_policy.cpp index a35bf635..1c39d772 100644 --- a/tests/Rendering/unit/test_camera_frame_render_graph_stage_policy.cpp +++ b/tests/Rendering/unit/test_camera_frame_render_graph_stage_policy.cpp @@ -4,19 +4,6 @@ using namespace XCEngine::Rendering; -namespace { - -RenderSurface CreateColorSurface( - uint32_t width, - uint32_t height, - XCEngine::RHI::RHIResourceView* colorAttachment) { - RenderSurface surface(width, height); - surface.SetColorAttachment(colorAttachment); - return surface; -} - -} // namespace - TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsStageFullscreenAndTransitionPolicies) { EXPECT_TRUE(IsCameraFrameFullscreenSequenceStage(CameraFrameStage::PostProcess)); EXPECT_TRUE(IsCameraFrameFullscreenSequenceStage(CameraFrameStage::FinalOutput)); @@ -40,85 +27,3 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsGraphManagedOutputColorStage EXPECT_TRUE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::PostProcess)); EXPECT_FALSE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::FinalOutput)); } - -TEST(CameraFrameRenderGraphStagePolicy_Test, KeepsExplicitFullscreenSourceBindingUntouched) { - CameraFramePlan plan = {}; - RenderSurface stageSurface(320, 180); - RenderSurface explicitSourceSurface = - CreateColorSurface( - 320, - 180, - reinterpret_cast(11)); - XCEngine::RHI::RHIResourceView* const explicitSourceColorView = - reinterpret_cast(12); - - const CameraFrameRenderGraphSourceBinding binding = - ResolveCameraFrameFullscreenStageGraphSourceBinding( - plan, - CameraFrameStage::PostProcess, - stageSurface, - &explicitSourceSurface, - explicitSourceColorView, - XCEngine::RHI::ResourceStates::CopySrc, - RenderGraphTextureHandle{ 21u }, - nullptr); - - EXPECT_EQ(binding.sourceSurfaceTemplate, &explicitSourceSurface); - EXPECT_EQ(binding.sourceColorView, explicitSourceColorView); - EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::CopySrc); - EXPECT_EQ(binding.sourceColor.index, 21u); -} - -TEST(CameraFrameRenderGraphStagePolicy_Test, ResolvesGraphManagedPostProcessSourceFromBlackboard) { - CameraFramePlan plan = {}; - plan.colorChain.postProcess.source = CameraFrameColorSource::MainSceneColor; - - RenderGraphBlackboard blackboard = {}; - CameraFrameRenderGraphResources& frameResources = - EmplaceCameraFrameRenderGraphFrameData(blackboard).resources; - frameResources.mainScene.color = RenderGraphTextureHandle{ 31u }; - - RenderSurface stageSurface(640, 360); - const CameraFrameRenderGraphSourceBinding binding = - ResolveCameraFrameFullscreenStageGraphSourceBinding( - plan, - CameraFrameStage::PostProcess, - stageSurface, - nullptr, - reinterpret_cast(41), - XCEngine::RHI::ResourceStates::Common, - {}, - &blackboard); - - EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface); - EXPECT_EQ(binding.sourceColorView, nullptr); - EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource); - EXPECT_EQ(binding.sourceColor.index, 31u); -} - -TEST(CameraFrameRenderGraphStagePolicy_Test, ResolvesGraphManagedFinalOutputSourceFromBlackboard) { - CameraFramePlan plan = {}; - plan.colorChain.finalOutput.source = CameraFrameColorSource::PostProcessColor; - - RenderGraphBlackboard blackboard = {}; - CameraFrameRenderGraphResources& frameResources = - EmplaceCameraFrameRenderGraphFrameData(blackboard).resources; - frameResources.postProcess.color = RenderGraphTextureHandle{ 51u }; - - RenderSurface stageSurface(800, 600); - const CameraFrameRenderGraphSourceBinding binding = - ResolveCameraFrameFullscreenStageGraphSourceBinding( - plan, - CameraFrameStage::FinalOutput, - stageSurface, - nullptr, - reinterpret_cast(61), - XCEngine::RHI::ResourceStates::Common, - {}, - &blackboard); - - EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface); - EXPECT_EQ(binding.sourceColorView, nullptr); - EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource); - EXPECT_EQ(binding.sourceColor.index, 51u); -}