diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index e9d568f4..ef92c667 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -537,6 +537,7 @@ add_library(XCEngine STATIC ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphExecution.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphExecution.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRuntime.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.h ${CMAKE_CURRENT_SOURCE_DIR}/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.cpp index 8b424cb2..68be413c 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.cpp @@ -13,10 +13,7 @@ namespace { using CameraFrameStageRecordHandler = bool (*)( const CameraFrameStageGraphBuildState& stageState, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session, + const CameraFrameRenderGraphStageRecordContext& context, bool& handled); constexpr std::array kCameraFrameStageRecordHandlers = { @@ -29,32 +26,16 @@ constexpr std::array kCameraFrameStageRecordH bool RecordCameraFrameRenderGraphStage( CameraFrameStage stage, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session) { + const CameraFrameRenderGraphStageRecordContext& context) { const CameraFrameStageGraphBuildState stageState = BuildCameraFrameStageGraphBuildState( stage, - plan, - shadowState, - sceneData, - session.graphBuilder, - session.importedTextures); - PublishCameraFrameStageGraphBuildState( - stageState, - shadowState, - session.frameResources); + context); + PublishCameraFrameStageGraphBuildState(stageState, context); for (CameraFrameStageRecordHandler handler : kCameraFrameStageRecordHandlers) { bool stageHandled = false; - if (!handler( - stageState, - plan, - shadowState, - sceneData, - session, - stageHandled)) { + if (!handler(stageState, context, stageHandled)) { return false; } if (stageHandled) { @@ -62,12 +43,7 @@ bool RecordCameraFrameRenderGraphStage( } } - AddCameraFrameStageFallbackRasterPass( - stageState, - plan, - shadowState, - sceneData, - session); + AddCameraFrameStageFallbackRasterPass(stageState, context); return true; } diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.h index 19ad1cb1..f56c1d68 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.h @@ -1,20 +1,13 @@ #pragma once -#include - -#include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h" namespace XCEngine { namespace Rendering { -struct DirectionalShadowExecutionState; - bool RecordCameraFrameRenderGraphStage( CameraFrameStage stage, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session); + const CameraFrameRenderGraphStageRecordContext& context); } // namespace Rendering } // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp index fe83cdc9..6ba13475 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.cpp @@ -4,6 +4,7 @@ #include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h" #include "Rendering/Execution/DirectionalShadowExecutionState.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h" #include "Rendering/Graph/RenderGraph.h" @@ -192,11 +193,9 @@ bool ExecuteRecordedFrameStage( bool TryRecordCameraFrameStageStandaloneRenderGraphPass( const CameraFrameStageGraphBuildState& stageState, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session, + const CameraFrameRenderGraphStageRecordContext& context, bool& handled) { + CameraFrameRenderGraphRecordingSession& session = context.session; RenderPass* const standaloneStagePass = ResolveStandaloneStagePass(stageState.stage, session.executionState); if (standaloneStagePass == nullptr || @@ -209,13 +208,13 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass( const RenderSceneData stageSceneData = BuildStandaloneStageSceneData( stageState.stage, - plan, - shadowState, - sceneData, + context.plan, + context.shadowState, + context.sceneData, stageState.surfaceTemplate); bool* const stageExecutionSucceeded = &session.stageExecutionSucceeded; const RenderPassGraphBeginCallback beginStandalonePass = - [stageExecutionSucceeded, standaloneStagePass, renderContext = &plan.request.context]( + [stageExecutionSucceeded, standaloneStagePass, renderContext = &context.plan.request.context]( const RenderPassContext&) -> bool { if (!InitializeStandalonePass( standaloneStagePass, @@ -229,7 +228,7 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass( const RenderPassRenderGraphContext standalonePassContext = { session.graphBuilder, stageState.stageName, - plan.request.context, + context.plan.request.context, stageSceneData, stageState.surfaceTemplate, stageState.hasSourceSurface @@ -258,11 +257,9 @@ bool TryRecordCameraFrameStageStandaloneRenderGraphPass( bool TryRecordCameraFrameMainSceneGraphPass( const CameraFrameStageGraphBuildState& stageState, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState&, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session, + const CameraFrameRenderGraphStageRecordContext& context, bool& handled) { + CameraFrameRenderGraphRecordingSession& session = context.session; if (stageState.stage != CameraFrameStage::MainScene || session.executionState.pipeline == nullptr || !session.executionState.pipeline->SupportsMainSceneRenderGraph()) { @@ -274,8 +271,8 @@ bool TryRecordCameraFrameMainSceneGraphPass( const RenderPipelineMainSceneRenderGraphContext mainSceneContext = { session.graphBuilder, stageState.stageName, - plan.request.context, - sceneData, + context.plan.request.context, + context.sceneData, stageState.surfaceTemplate, stageState.hasSourceSurface ? &stageState.sourceSurfaceTemplate @@ -299,16 +296,14 @@ bool TryRecordCameraFrameMainSceneGraphPass( void AddCameraFrameStageFallbackRasterPass( const CameraFrameStageGraphBuildState& stageState, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session) { + const CameraFrameRenderGraphStageRecordContext& context) { + CameraFrameRenderGraphRecordingSession& session = context.session; const CameraFrameStageGraphBuildState capturedStageState = stageState; CameraFrameExecutionState* const executionState = &session.executionState; bool* const stageExecutionSucceeded = &session.stageExecutionSucceeded; - const CameraFramePlan* const planPtr = &plan; - const DirectionalShadowExecutionState* const shadowStatePtr = &shadowState; - const RenderSceneData* const sceneDataPtr = &sceneData; + const CameraFramePlan* const planPtr = &context.plan; + const DirectionalShadowExecutionState* const shadowStatePtr = &context.shadowState; + const RenderSceneData* const sceneDataPtr = &context.sceneData; session.graphBuilder.AddRasterPass( capturedStageState.stageName, [capturedStageState, executionState, stageExecutionSucceeded, planPtr, shadowStatePtr, sceneDataPtr]( diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.h index f083222e..8d3969f7 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.h @@ -3,34 +3,22 @@ namespace XCEngine { namespace Rendering { -struct CameraFramePlan; -struct CameraFrameRenderGraphRecordingSession; +struct CameraFrameRenderGraphStageRecordContext; struct CameraFrameStageGraphBuildState; -struct DirectionalShadowExecutionState; -struct RenderSceneData; bool TryRecordCameraFrameStageStandaloneRenderGraphPass( const CameraFrameStageGraphBuildState& stageState, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session, + const CameraFrameRenderGraphStageRecordContext& context, bool& handled); bool TryRecordCameraFrameMainSceneGraphPass( const CameraFrameStageGraphBuildState& stageState, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session, + const CameraFrameRenderGraphStageRecordContext& context, bool& handled); void AddCameraFrameStageFallbackRasterPass( const CameraFrameStageGraphBuildState& stageState, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session); + const CameraFrameRenderGraphStageRecordContext& context); } // namespace Rendering } // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h new file mode 100644 index 00000000..f2bc310d --- /dev/null +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h" + +namespace XCEngine { +namespace Rendering { + +struct DirectionalShadowExecutionState; +struct RenderSceneData; + +struct CameraFrameRenderGraphStageRecordContext { + const CameraFramePlan& plan; + const DirectionalShadowExecutionState& shadowState; + const RenderSceneData& sceneData; + CameraFrameRenderGraphRecordingSession& session; +}; + +} // namespace Rendering +} // namespace XCEngine diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp index 2cb3bf9f..80daa1a7 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageRecording.cpp @@ -3,6 +3,7 @@ #include "Rendering/Execution/CameraFrameRenderGraphResources.h" #include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRuntime.h" #include "Rendering/Graph/RenderGraph.h" @@ -30,18 +31,19 @@ bool RecordCameraFrameRenderGraphStages( executionState, stageExecutionSucceeded }; + const CameraFrameRenderGraphStageRecordContext context = { + plan, + shadowState, + sceneData, + session + }; for (const CameraFrameStageInfo& stageInfo : kOrderedCameraFrameStages) { if (!plan.HasFrameStage(stageInfo.stage) && stageInfo.stage != CameraFrameStage::MainScene) { continue; } - if (!RecordCameraFrameRenderGraphStage( - stageInfo.stage, - plan, - shadowState, - sceneData, - session)) { + if (!RecordCameraFrameRenderGraphStage(stageInfo.stage, context)) { return false; } } diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.cpp index d069a125..ae8a8146 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.cpp @@ -3,6 +3,7 @@ #include "Debug/Logger.h" #include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphRecordingSession.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h" #include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h" #include "Rendering/Graph/RenderGraph.h" @@ -243,11 +244,9 @@ bool RecordFullscreenPassSequenceStage( bool TryRecordCameraFrameStageSequence( const CameraFrameStageGraphBuildState& stageState, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState&, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session, + const CameraFrameRenderGraphStageRecordContext& context, bool& handled) { + CameraFrameRenderGraphRecordingSession& session = context.session; if (stageState.stageSequence == nullptr) { handled = false; return true; @@ -255,7 +254,10 @@ bool TryRecordCameraFrameStageSequence( handled = true; const RenderPassContext stagePassContext = - BuildCameraFrameStageGraphPassContext(plan, stageState, sceneData); + BuildCameraFrameStageGraphPassContext( + context, + stageState, + context.sceneData); const bool recordResult = IsCameraFrameFullscreenSequenceStage(stageState.stage) ? RecordFullscreenPassSequenceStage( @@ -263,7 +265,7 @@ bool TryRecordCameraFrameStageSequence( stageState.stageName, stagePassContext, ResolveCameraFrameFullscreenStageGraphSourceBinding( - plan, + context.plan, stageState.stage, stageState.surfaceTemplate, stagePassContext.sourceSurface, @@ -272,7 +274,7 @@ bool TryRecordCameraFrameStageSequence( GetPrimaryColorTexture(stageState.sourceSurface), &session.blackboard), stageState.outputColor, - sceneData, + context.sceneData, stageState.stageSequence, session.executionState, session.graphBuilder, @@ -283,7 +285,7 @@ bool TryRecordCameraFrameStageSequence( stageState.stageName, stagePassContext, stageState.outputSurface, - sceneData, + context.sceneData, stageState.stageSequence, session.executionState, session.graphBuilder, diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.h index ef5ee024..231eda38 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.h @@ -3,19 +3,12 @@ namespace XCEngine { namespace Rendering { -struct CameraFrameExecutionState; -struct CameraFramePlan; -struct CameraFrameRenderGraphRecordingSession; +struct CameraFrameRenderGraphStageRecordContext; struct CameraFrameStageGraphBuildState; -struct DirectionalShadowExecutionState; -struct RenderSceneData; bool TryRecordCameraFrameStageSequence( const CameraFrameStageGraphBuildState& stageState, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - CameraFrameRenderGraphRecordingSession& session, + const CameraFrameRenderGraphStageRecordContext& context, bool& handled); } // namespace Rendering diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp index 5fae3afd..a83e7998 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.cpp @@ -3,6 +3,7 @@ #include "Rendering/Execution/CameraFrameRenderGraphResources.h" #include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h" #include "Rendering/Execution/DirectionalShadowExecutionState.h" +#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageRecordContext.h" namespace XCEngine { namespace Rendering { @@ -51,11 +52,11 @@ RenderPassContext BuildFrameStagePassContext( } // namespace RenderPassContext BuildCameraFrameStageGraphPassContext( - const CameraFramePlan& plan, + const CameraFrameRenderGraphStageRecordContext& context, const CameraFrameStageGraphBuildState& stageState, const RenderSceneData& sceneData) { return { - plan.request.context, + context.plan.request.context, stageState.surfaceTemplate, sceneData, stageState.hasSourceSurface @@ -68,18 +69,18 @@ RenderPassContext BuildCameraFrameStageGraphPassContext( CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState( CameraFrameStage stage, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - RenderGraphBuilder& graphBuilder, - RenderGraphImportedTextureRegistry& importedTextures) { + const CameraFrameRenderGraphStageRecordContext& context) { CameraFrameStageGraphBuildState stageState = {}; stageState.stage = stage; stageState.stageName = Containers::String(GetCameraFrameStageName(stage)); - stageState.stageSequence = plan.GetPassSequence(stage); + stageState.stageSequence = context.plan.GetPassSequence(stage); const RenderPassContext stagePassContext = - BuildFrameStagePassContext(stage, plan, shadowState, sceneData); + BuildFrameStagePassContext( + stage, + context.plan, + context.shadowState, + context.sceneData); stageState.surfaceTemplate = stagePassContext.surface; stageState.hasSourceSurface = stagePassContext.sourceSurface != nullptr; if (stageState.hasSourceSurface) { @@ -89,16 +90,16 @@ CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState( stageState.sourceColorState = stagePassContext.sourceColorState; stageState.sourceSurface = ImportRenderGraphSurface( - graphBuilder, - importedTextures, + context.session.graphBuilder, + context.session.importedTextures, stageState.stageName + ".Source", stagePassContext.sourceSurface, RenderGraphSurfaceImportUsage::Source, IsCameraFrameFullscreenSequenceStage(stage)); stageState.outputSurface = ImportRenderGraphSurface( - graphBuilder, - importedTextures, + context.session.graphBuilder, + context.session.importedTextures, stageState.stageName + ".Output", &stagePassContext.surface, RenderGraphSurfaceImportUsage::Output, @@ -107,20 +108,20 @@ CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState( stageState.outputColor = ResolveStageOutputColorHandle( stage, - plan, + context.plan, stageState.stageName, stagePassContext, stageState.outputSurface, - graphBuilder); + context.session.graphBuilder); return stageState; } void PublishCameraFrameStageGraphBuildState( const CameraFrameStageGraphBuildState& stageState, - const DirectionalShadowExecutionState& shadowState, - CameraFrameRenderGraphResources& frameResources) { + const CameraFrameRenderGraphStageRecordContext& context) { + CameraFrameRenderGraphResources& frameResources = context.session.frameResources; if (stageState.stage == CameraFrameStage::ShadowCaster && - shadowState.HasShadowSampling() && + context.shadowState.HasShadowSampling() && stageState.outputSurface.depthTexture.IsValid()) { frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture; } diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h index b2cd8d7a..d35db1c2 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h @@ -7,9 +7,7 @@ namespace XCEngine { namespace Rendering { -struct CameraFrameRenderGraphResources; -struct DirectionalShadowExecutionState; -class RenderGraphBuilder; +struct CameraFrameRenderGraphStageRecordContext; struct CameraFrameStageGraphBuildState { CameraFrameStage stage = CameraFrameStage::MainScene; @@ -26,22 +24,17 @@ struct CameraFrameStageGraphBuildState { }; RenderPassContext BuildCameraFrameStageGraphPassContext( - const CameraFramePlan& plan, + const CameraFrameRenderGraphStageRecordContext& context, const CameraFrameStageGraphBuildState& stageState, const RenderSceneData& sceneData); CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState( CameraFrameStage stage, - const CameraFramePlan& plan, - const DirectionalShadowExecutionState& shadowState, - const RenderSceneData& sceneData, - RenderGraphBuilder& graphBuilder, - RenderGraphImportedTextureRegistry& importedTextures); + const CameraFrameRenderGraphStageRecordContext& context); void PublishCameraFrameStageGraphBuildState( const CameraFrameStageGraphBuildState& stageState, - const DirectionalShadowExecutionState& shadowState, - CameraFrameRenderGraphResources& frameResources); + const CameraFrameRenderGraphStageRecordContext& context); } // namespace Rendering } // namespace XCEngine