diff --git a/engine/include/XCEngine/Rendering/RenderPassGraphContract.h b/engine/include/XCEngine/Rendering/RenderPassGraphContract.h index 94980ec9..b0746e8d 100644 --- a/engine/include/XCEngine/Rendering/RenderPassGraphContract.h +++ b/engine/include/XCEngine/Rendering/RenderPassGraphContract.h @@ -59,6 +59,15 @@ bool RecordRasterRenderPass( const RenderPassRenderGraphContext& context, const RenderPassGraphIO& io); +inline bool RecordCompatibleRasterRenderPass( + RenderPass& pass, + const RenderPassRenderGraphContext& context, + const RenderPassGraphIO& io) { + return pass.SupportsRenderGraph() + ? pass.RecordRenderGraph(context) + : RecordRasterRenderPass(pass, context, io); +} + inline bool RecordSourceColorFullscreenRasterPass( RenderPass& pass, const RenderPassRenderGraphContext& context) { @@ -86,6 +95,33 @@ inline bool RecordDeclaredRasterPass( BuildDeclaredRasterPassGraphIO(context)); } +inline bool RecordCompatibleSourceColorFullscreenRasterPass( + RenderPass& pass, + const RenderPassRenderGraphContext& context) { + return RecordCompatibleRasterRenderPass( + pass, + context, + BuildSourceColorFullscreenRasterPassGraphIO()); +} + +inline bool RecordCompatibleColorDepthRasterPass( + RenderPass& pass, + const RenderPassRenderGraphContext& context) { + return RecordCompatibleRasterRenderPass( + pass, + context, + BuildColorDepthRasterPassGraphIO()); +} + +inline bool RecordCompatibleDeclaredRasterPass( + RenderPass& pass, + const RenderPassRenderGraphContext& context) { + return RecordCompatibleRasterRenderPass( + pass, + context, + BuildDeclaredRasterPassGraphIO(context)); +} + inline bool RecordSourceColorFullscreenCallbackRasterPass( const RenderPassRenderGraphContext& context, RenderPassGraphExecutePassCallback executePassCallback, diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp index dc522e4d..328f150f 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp @@ -12,15 +12,6 @@ namespace Rendering { namespace { -bool RecordCameraFrameCompatibleGraphPass( - RenderPass& pass, - const RenderPassRenderGraphContext& context, - const RenderPassGraphIO& io) { - return pass.SupportsRenderGraph() - ? pass.RecordRenderGraph(context) - : RecordRasterRenderPass(pass, context, io); -} - bool ExecuteCameraFrameScenePassRequestStage( RenderPass* pass, const ScenePassRenderRequest& request, @@ -289,7 +280,7 @@ bool RecordCameraFrameRegularSequenceStageRenderGraphPass( const RenderGraphImportedSurface& outputSurface, const RenderPassGraphBeginCallback& beginPassCallback, RenderPass& pass) { - return RecordCameraFrameCompatibleGraphPass( + return RecordCompatibleDeclaredRasterPass( pass, BuildRenderPassRenderGraphContext( BuildCameraFrameStageGraphRecordingContext( @@ -300,12 +291,7 @@ bool RecordCameraFrameRegularSequenceStageRenderGraphPass( BuildCameraFrameStageGraphSourceBinding(stageState), outputSurface.colorTextures, outputSurface.depthTexture), - beginPassCallback), - { - false, - GetPrimaryColorTexture(outputSurface).IsValid(), - outputSurface.depthTexture.IsValid() - }); + beginPassCallback)); } CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding( @@ -447,7 +433,7 @@ bool RecordCameraFrameFullscreenSequenceStageGraphPass( currentSourceColor }; const bool recordSucceeded = - RecordCameraFrameCompatibleGraphPass( + RecordCompatibleSourceColorFullscreenRasterPass( pass, BuildRenderPassRenderGraphContext( BuildCameraFrameStageGraphRecordingContext( @@ -458,12 +444,7 @@ bool RecordCameraFrameFullscreenSequenceStageGraphPass( passSourceBinding, std::vector{ passOutputColor }, {}), - beginPassCallback), - { - true, - true, - false - }); + beginPassCallback)); if (recordSucceeded) { currentSourceColor = passOutputColor; } diff --git a/tests/Rendering/unit/test_render_graph_recording_context.cpp b/tests/Rendering/unit/test_render_graph_recording_context.cpp index 2acf8387..59419b5b 100644 --- a/tests/Rendering/unit/test_render_graph_recording_context.cpp +++ b/tests/Rendering/unit/test_render_graph_recording_context.cpp @@ -49,6 +49,32 @@ RenderPassContext BuildPassContext( }; } +class CompatibleRecordingRenderPass final : public RenderPass { +public: + const char* GetName() const override { + return "CompatibleRecordingRenderPass"; + } + + bool SupportsRenderGraph() const override { + return supportsRenderGraph; + } + + bool RecordRenderGraph(const RenderPassRenderGraphContext& context) override { + ++recordRenderGraphCalls; + lastPassName = context.passName; + return recordRenderGraphResult; + } + + bool Execute(const RenderPassContext&) override { + return true; + } + + bool supportsRenderGraph = false; + bool recordRenderGraphResult = true; + int recordRenderGraphCalls = 0; + XCEngine::Containers::String lastPassName = {}; +}; + } // namespace TEST(RenderPassGraphContract_Test, BuildsSourceColorFullscreenRasterPassGraphIO) { @@ -98,6 +124,63 @@ TEST(RenderPassGraphContract_Test, BuildsDeclaredRasterPassGraphIOFromContextRes EXPECT_TRUE(io.writeDepth); } +TEST(RenderPassGraphContract_Test, RecordCompatibleDeclaredRasterPassUsesRenderGraphPathWhenSupported) { + RenderGraph graph = {}; + RenderGraphBuilder builder(graph); + RenderGraphBlackboard blackboard = {}; + RenderContext renderContext = {}; + RenderSceneData sceneData = {}; + RenderSurface surface(1280u, 720u); + RenderSurface sourceSurface(640u, 360u); + bool executionSucceeded = true; + const RenderPassRenderGraphContext passContext = + BuildRenderPassRenderGraphContext( + BuildCommonContext( + builder, + blackboard, + renderContext, + sceneData, + surface, + sourceSurface, + executionSucceeded)); + + CompatibleRecordingRenderPass pass = {}; + pass.supportsRenderGraph = true; + + EXPECT_TRUE(RecordCompatibleDeclaredRasterPass(pass, passContext)); + EXPECT_EQ(pass.recordRenderGraphCalls, 1); + EXPECT_EQ(pass.lastPassName, XCEngine::Containers::String("Recording.Pass")); + EXPECT_EQ(graph.GetPassCount(), 0u); +} + +TEST(RenderPassGraphContract_Test, RecordCompatibleDeclaredRasterPassFallsBackToNativeRasterRecording) { + RenderGraph graph = {}; + RenderGraphBuilder builder(graph); + RenderGraphBlackboard blackboard = {}; + RenderContext renderContext = {}; + RenderSceneData sceneData = {}; + RenderSurface surface(1280u, 720u); + RenderSurface sourceSurface(640u, 360u); + bool executionSucceeded = true; + const RenderPassRenderGraphContext passContext = + BuildRenderPassRenderGraphContext( + BuildCommonContext( + builder, + blackboard, + renderContext, + sceneData, + surface, + sourceSurface, + executionSucceeded)); + + CompatibleRecordingRenderPass pass = {}; + pass.supportsRenderGraph = false; + + EXPECT_TRUE(RecordCompatibleDeclaredRasterPass(pass, passContext)); + EXPECT_EQ(pass.recordRenderGraphCalls, 0); + EXPECT_EQ(graph.GetPassCount(), 1u); +} + TEST(RenderGraphRecordingContext_Test, BuildsRenderPassContextFromSharedRecordingData) { RenderGraph graph = {}; RenderGraphBuilder builder(graph);