diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp index 328f150f..9ecb647b 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.cpp @@ -69,6 +69,13 @@ std::vector BuildCameraFrameStageGraphDefaultColorTarg return stageState.outputSurface.colorTextures; } +RenderGraphSurfaceAccessMode BuildCameraFrameStageFallbackSurfaceAccessMode( + CameraFrameStage stage) { + return IsCameraFrameFullscreenSequenceStage(stage) + ? RenderGraphSurfaceAccessMode::ColorOnly + : RenderGraphSurfaceAccessMode::ColorDepth; +} + } // namespace CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding( @@ -521,14 +528,11 @@ bool RecordCameraFrameMainSceneGraphPass( void RecordCameraFrameStageFallbackPassIO( const CameraFrameStageGraphBuildState& stageState, RenderGraphPassBuilder& passBuilder) { - if (IsCameraFrameFullscreenSequenceStage(stageState.stage)) { - ReadRenderGraphColorSurface(passBuilder, stageState.sourceSurface); - WriteRenderGraphColorSurface(passBuilder, stageState.outputSurface); - return; - } - - ReadRenderGraphSurface(passBuilder, stageState.sourceSurface); - WriteRenderGraphSurface(passBuilder, stageState.outputSurface); + RecordRenderGraphSurfaceIO( + passBuilder, + stageState.sourceSurface, + stageState.outputSurface, + BuildCameraFrameStageFallbackSurfaceAccessMode(stageState.stage)); } bool ExecuteCameraFrameStageFallbackPass( diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.cpp b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.cpp index 91c83713..02c00d37 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.cpp +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.cpp @@ -181,50 +181,85 @@ RenderGraphTextureHandle GetPrimaryColorTexture( void ReadRenderGraphSurface( RenderGraphPassBuilder& passBuilder, - const RenderGraphImportedSurface& surface) { + const RenderGraphImportedSurface& surface, + RenderGraphSurfaceAccessMode accessMode) { for (RenderGraphTextureHandle texture : surface.colorTextures) { if (texture.IsValid()) { passBuilder.ReadTexture(texture); } } - if (surface.depthTexture.IsValid()) { + if (accessMode == RenderGraphSurfaceAccessMode::ColorDepth && + surface.depthTexture.IsValid()) { passBuilder.ReadDepthTexture(surface.depthTexture); } } +void ReadRenderGraphSurface( + RenderGraphPassBuilder& passBuilder, + const RenderGraphImportedSurface& surface) { + ReadRenderGraphSurface( + passBuilder, + surface, + RenderGraphSurfaceAccessMode::ColorDepth); +} + void ReadRenderGraphColorSurface( RenderGraphPassBuilder& passBuilder, const RenderGraphImportedSurface& surface) { + ReadRenderGraphSurface( + passBuilder, + surface, + RenderGraphSurfaceAccessMode::ColorOnly); +} + +void WriteRenderGraphSurface( + RenderGraphPassBuilder& passBuilder, + const RenderGraphImportedSurface& surface, + RenderGraphSurfaceAccessMode accessMode) { for (RenderGraphTextureHandle texture : surface.colorTextures) { if (texture.IsValid()) { - passBuilder.ReadTexture(texture); + passBuilder.WriteTexture(texture); } } + + if (accessMode == RenderGraphSurfaceAccessMode::ColorDepth && + surface.depthTexture.IsValid()) { + passBuilder.WriteDepthTexture(surface.depthTexture); + } } void WriteRenderGraphSurface( RenderGraphPassBuilder& passBuilder, const RenderGraphImportedSurface& surface) { - for (RenderGraphTextureHandle texture : surface.colorTextures) { - if (texture.IsValid()) { - passBuilder.WriteTexture(texture); - } - } - - if (surface.depthTexture.IsValid()) { - passBuilder.WriteDepthTexture(surface.depthTexture); - } + WriteRenderGraphSurface( + passBuilder, + surface, + RenderGraphSurfaceAccessMode::ColorDepth); } void WriteRenderGraphColorSurface( RenderGraphPassBuilder& passBuilder, const RenderGraphImportedSurface& surface) { - for (RenderGraphTextureHandle texture : surface.colorTextures) { - if (texture.IsValid()) { - passBuilder.WriteTexture(texture); - } - } + WriteRenderGraphSurface( + passBuilder, + surface, + RenderGraphSurfaceAccessMode::ColorOnly); +} + +void RecordRenderGraphSurfaceIO( + RenderGraphPassBuilder& passBuilder, + const RenderGraphImportedSurface& sourceSurface, + const RenderGraphImportedSurface& outputSurface, + RenderGraphSurfaceAccessMode accessMode) { + ReadRenderGraphSurface( + passBuilder, + sourceSurface, + accessMode); + WriteRenderGraphSurface( + passBuilder, + outputSurface, + accessMode); } RenderSurface BuildGraphManagedImportedSurface( diff --git a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h index 60847dd0..134ab28b 100644 --- a/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h +++ b/engine/src/Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h @@ -25,6 +25,11 @@ struct RenderGraphImportedSurface { RenderGraphTextureHandle depthTexture = {}; }; +enum class RenderGraphSurfaceAccessMode { + ColorOnly = 0, + ColorDepth = 1 +}; + using RenderGraphImportedTextureRegistry = std::unordered_map; @@ -52,6 +57,11 @@ RenderGraphImportedSurface ImportRenderGraphSurface( RenderGraphTextureHandle GetPrimaryColorTexture( const RenderGraphImportedSurface& surface); +void ReadRenderGraphSurface( + RenderGraphPassBuilder& passBuilder, + const RenderGraphImportedSurface& surface, + RenderGraphSurfaceAccessMode accessMode); + void ReadRenderGraphSurface( RenderGraphPassBuilder& passBuilder, const RenderGraphImportedSurface& surface); @@ -60,6 +70,11 @@ void ReadRenderGraphColorSurface( RenderGraphPassBuilder& passBuilder, const RenderGraphImportedSurface& surface); +void WriteRenderGraphSurface( + RenderGraphPassBuilder& passBuilder, + const RenderGraphImportedSurface& surface, + RenderGraphSurfaceAccessMode accessMode); + void WriteRenderGraphSurface( RenderGraphPassBuilder& passBuilder, const RenderGraphImportedSurface& surface); @@ -68,6 +83,12 @@ void WriteRenderGraphColorSurface( RenderGraphPassBuilder& passBuilder, const RenderGraphImportedSurface& surface); +void RecordRenderGraphSurfaceIO( + RenderGraphPassBuilder& passBuilder, + const RenderGraphImportedSurface& sourceSurface, + const RenderGraphImportedSurface& outputSurface, + RenderGraphSurfaceAccessMode accessMode); + RenderSurface BuildGraphManagedImportedSurface( const RenderSurface& templateSurface, RHI::ResourceStates stateBefore,