diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp index b363a4bc..2fe865a1 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp @@ -3,6 +3,7 @@ #include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h" +#include "Rendering/Execution/DirectionalShadowExecutionState.h" #include "Rendering/Graph/RenderGraph.h" #include #include @@ -35,6 +36,23 @@ CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding( }; } +void PublishCameraFrameStageGraphResources( + const CameraFrameStageGraphBuildState& stageState, + const CameraFrameRenderGraphStageContext& context) { + CameraFrameRenderGraphResources& frameResources = context.builder.frameData.resources; + WriteCameraFrameRenderGraphStageSurfaceResources( + frameResources, + stageState.stage, + stageState.outputColor, + stageState.outputSurface.depthTexture); + + if (stageState.stage == CameraFrameStage::ShadowCaster && + context.shadowState.HasShadowSampling() && + stageState.outputSurface.depthTexture.IsValid()) { + frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture; + } +} + RenderPassContext BuildCameraFrameStageGraphPassContext( 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 470e873d..5f6f32f7 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h @@ -23,6 +23,10 @@ struct CameraFrameStageFallbackSurfaceResolution { CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding( const CameraFrameStageGraphBuildState& stageState); +void PublishCameraFrameStageGraphResources( + const CameraFrameStageGraphBuildState& stageState, + const CameraFrameRenderGraphStageContext& context); + RenderPassContext BuildCameraFrameStageGraphPassContext( const CameraFrameRenderGraphStageContext& context, const CameraFrameStageGraphBuildState& stageState, diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.cpp index feffd57d..2d2edeae 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.cpp @@ -1,5 +1,6 @@ #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h" @@ -31,7 +32,7 @@ bool RecordCameraFrameRenderGraphStage( BuildCameraFrameStageGraphBuildState( stage, context); - PublishCameraFrameStageGraphBuildState(stageState, context); + PublishCameraFrameStageGraphResources(stageState, context); for (CameraFrameStageRecordHandler handler : kCameraFrameStageRecordHandlers) { bool stageHandled = false; diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp index 35fa504b..00492b6d 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp @@ -1,10 +1,7 @@ #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h" -#include - #include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePolicy.h" -#include "Rendering/Execution/DirectionalShadowExecutionState.h" #include "Rendering/Execution/Internal/CameraFrameStageSurfaceResolver.h" namespace XCEngine { @@ -59,22 +56,5 @@ CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState( return stageState; } -void PublishCameraFrameStageGraphBuildState( - const CameraFrameStageGraphBuildState& stageState, - const CameraFrameRenderGraphStageContext& context) { - CameraFrameRenderGraphResources& frameResources = context.builder.frameData.resources; - if (stageState.stage == CameraFrameStage::ShadowCaster && - context.shadowState.HasShadowSampling() && - stageState.outputSurface.depthTexture.IsValid()) { - frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture; - } - - WriteCameraFrameRenderGraphStageSurfaceResources( - frameResources, - stageState.stage, - stageState.outputColor, - stageState.outputSurface.depthTexture); -} - } // namespace Rendering } // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h index 5a5d1f4e..81125579 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h @@ -27,9 +27,5 @@ CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState( CameraFrameStage stage, const CameraFrameRenderGraphStageContext& context); -void PublishCameraFrameStageGraphBuildState( - const CameraFrameStageGraphBuildState& stageState, - const CameraFrameRenderGraphStageContext& context); - } // 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 4001dfee..eb7dab85 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 @@ -209,6 +209,121 @@ TEST(CameraFrameRenderGraphStageContract_Test, BuildsPassContextFromStageState) XCEngine::RHI::ResourceStates::PixelShaderResource); } +TEST(CameraFrameRenderGraphStageContract_Test, PublishesStageSurfaceResourcesIntoFrameData) { + RenderGraph graph = {}; + RenderGraphBuilder graphBuilder(graph); + RenderGraphBlackboard blackboard = {}; + CameraFrameRenderGraphFrameData& frameData = + EmplaceCameraFrameRenderGraphFrameData(blackboard); + RenderGraphImportedTextureRegistry importedTextures = {}; + CameraFrameExecutionState executionState = {}; + bool stageExecutionSucceeded = true; + CameraFrameRenderGraphBuilderContext builderContext = { + graphBuilder, + blackboard, + frameData, + importedTextures, + executionState, + stageExecutionSucceeded + }; + CameraFramePlan plan = {}; + DirectionalShadowExecutionState shadowState = {}; + RenderSceneData sceneData = {}; + const CameraFrameRenderGraphStageContext context = { + plan, + shadowState, + sceneData, + builderContext + }; + + CameraFrameStageGraphBuildState stageState = {}; + stageState.stage = CameraFrameStage::MainScene; + stageState.outputColor = RenderGraphTextureHandle{ 91u }; + stageState.outputSurface.depthTexture = RenderGraphTextureHandle{ 92u }; + + PublishCameraFrameStageGraphResources(stageState, context); + + EXPECT_EQ(frameData.resources.mainScene.color.index, 91u); + EXPECT_EQ(frameData.resources.mainScene.depth.index, 92u); + EXPECT_FALSE(frameData.resources.mainDirectionalShadow.IsValid()); +} + +TEST(CameraFrameRenderGraphStageContract_Test, PublishesShadowCasterDepthAliasOnlyWhenShadowSamplingIsValid) { + RenderGraph graph = {}; + RenderGraphBuilder graphBuilder(graph); + RenderGraphBlackboard blackboard = {}; + CameraFrameRenderGraphFrameData& frameData = + EmplaceCameraFrameRenderGraphFrameData(blackboard); + RenderGraphImportedTextureRegistry importedTextures = {}; + CameraFrameExecutionState executionState = {}; + bool stageExecutionSucceeded = true; + CameraFrameRenderGraphBuilderContext builderContext = { + graphBuilder, + blackboard, + frameData, + importedTextures, + executionState, + stageExecutionSucceeded + }; + CameraFramePlan plan = {}; + DirectionalShadowExecutionState shadowState = {}; + shadowState.shadowData.enabled = true; + shadowState.shadowData.shadowMap = + reinterpret_cast(101); + RenderSceneData sceneData = {}; + const CameraFrameRenderGraphStageContext context = { + plan, + shadowState, + sceneData, + builderContext + }; + + CameraFrameStageGraphBuildState stageState = {}; + stageState.stage = CameraFrameStage::ShadowCaster; + stageState.outputSurface.depthTexture = RenderGraphTextureHandle{ 102u }; + + PublishCameraFrameStageGraphResources(stageState, context); + + EXPECT_EQ(frameData.resources.mainDirectionalShadow.index, 102u); + EXPECT_FALSE(frameData.resources.mainScene.depth.IsValid()); +} + +TEST(CameraFrameRenderGraphStageContract_Test, DoesNotPublishShadowCasterDepthAliasWithoutValidShadowSampling) { + RenderGraph graph = {}; + RenderGraphBuilder graphBuilder(graph); + RenderGraphBlackboard blackboard = {}; + CameraFrameRenderGraphFrameData& frameData = + EmplaceCameraFrameRenderGraphFrameData(blackboard); + RenderGraphImportedTextureRegistry importedTextures = {}; + CameraFrameExecutionState executionState = {}; + bool stageExecutionSucceeded = true; + CameraFrameRenderGraphBuilderContext builderContext = { + graphBuilder, + blackboard, + frameData, + importedTextures, + executionState, + stageExecutionSucceeded + }; + CameraFramePlan plan = {}; + DirectionalShadowExecutionState shadowState = {}; + RenderSceneData sceneData = {}; + const CameraFrameRenderGraphStageContext context = { + plan, + shadowState, + sceneData, + builderContext + }; + + CameraFrameStageGraphBuildState stageState = {}; + stageState.stage = CameraFrameStage::ShadowCaster; + stageState.outputSurface.depthTexture = RenderGraphTextureHandle{ 111u }; + + PublishCameraFrameStageGraphResources(stageState, context); + + EXPECT_FALSE(frameData.resources.mainDirectionalShadow.IsValid()); +} + TEST(CameraFrameRenderGraphStageContract_Test, BuildsRecordingContextFromStageStateAndOverrides) { RenderGraph graph = {}; RenderGraphBuilder graphBuilder(graph);