From 702356007ca716330a541ef0ce36e65c3fee6b0b Mon Sep 17 00:00:00 2001 From: antonmic Date: Tue, 8 Jun 2021 22:36:54 -0700 Subject: [PATCH] Pass changes WIP: standardized usage of new pass initialization functions --- .../AcesOutputTransformLutPass.h | 4 +++- .../DisplayMapper/AcesOutputTransformPass.h | 4 +++- .../ApplyShaperLookupTablePass.h | 4 +++- .../BakeAcesOutputTransformLutPass.h | 4 +--- .../DisplayMapperFullScreenPass.h | 7 ++----- .../Feature/DisplayMapper/DisplayMapperPass.h | 1 + .../DisplayMapper/OutputTransformPass.h | 4 +++- .../AcesOutputTransformLutPass.cpp | 4 ++-- .../DisplayMapper/AcesOutputTransformPass.cpp | 4 ++-- .../ApplyShaperLookupTablePass.cpp | 4 ++-- .../BakeAcesOutputTransformLutPass.cpp | 13 +----------- .../DisplayMapperFullScreenPass.cpp | 4 ---- .../DisplayMapper/DisplayMapperPass.cpp | 14 ++++++++++++- .../DisplayMapper/OutputTransformPass.cpp | 4 ++-- .../BlendColorGradingLutsPass.cpp | 15 ++------------ .../BlendColorGradingLutsPass.h | 4 +--- .../DepthOfFieldBokehBlurPass.cpp | 4 ++-- .../DepthOfFieldBokehBlurPass.h | 2 +- .../DepthOfFieldCompositePass.cpp | 4 ++-- .../DepthOfFieldCompositePass.h | 2 +- .../PostProcessing/DepthOfFieldMaskPass.cpp | 4 ++-- .../PostProcessing/DepthOfFieldMaskPass.h | 2 +- .../LookModificationCompositePass.cpp | 4 ++-- .../LookModificationCompositePass.h | 2 +- .../Source/PostProcessing/SMAABasePass.cpp | 4 ++-- .../Code/Source/PostProcessing/SMAABasePass.h | 5 ++++- .../SMAABlendingWeightCalculationPass.cpp | 4 ++-- .../SMAABlendingWeightCalculationPass.h | 4 +++- .../PostProcessing/SMAAEdgeDetectionPass.cpp | 4 ++-- .../PostProcessing/SMAAEdgeDetectionPass.h | 4 +++- .../SMAANeighborhoodBlendingPass.cpp | 4 ++-- .../SMAANeighborhoodBlendingPass.h | 4 +++- .../Source/ScreenSpace/DeferredFogPass.cpp | 4 ++-- .../Code/Source/ScreenSpace/DeferredFogPass.h | 12 ++++++----- .../RPI.Public/Pass/FullscreenTrianglePass.h | 5 +---- .../Code/Include/Atom/RPI.Public/Pass/Pass.h | 19 ++++++++++++++---- .../Pass/FullscreenTrianglePass.cpp | 20 ++++++------------- .../RPI/Code/Source/RPI.Public/Pass/Pass.cpp | 16 +++++++++++++++ .../Source/RPI.Public/Pass/PassSystem.cpp | 2 +- .../Code/Source/RPI.Public/RenderPipeline.cpp | 5 +++++ 40 files changed, 127 insertions(+), 107 deletions(-) diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/AcesOutputTransformLutPass.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/AcesOutputTransformLutPass.h index bc8673a64b..a6c7615574 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/AcesOutputTransformLutPass.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/AcesOutputTransformLutPass.h @@ -48,7 +48,9 @@ namespace AZ void SetShaperParams(const ShaperParams& shaperParams); private: explicit AcesOutputTransformLutPass(const RPI::PassDescriptor& descriptor); - void Init() override; + + // Pass behavior overrides... + void InitializeInternal() override; // Scope producer functions... void SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) override; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/AcesOutputTransformPass.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/AcesOutputTransformPass.h index 5a0ccdb32a..350b178cfa 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/AcesOutputTransformPass.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/AcesOutputTransformPass.h @@ -50,7 +50,9 @@ namespace AZ private: explicit AcesOutputTransformPass(const RPI::PassDescriptor& descriptor); - void Init() override; + + // Pass behavior overrides + void InitializeInternal() override; // Scope producer functions... void CompileResources(const RHI::FrameGraphCompileContext& context) override; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/ApplyShaperLookupTablePass.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/ApplyShaperLookupTablePass.h index 35d2fcf603..3b6d7f7c27 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/ApplyShaperLookupTablePass.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/ApplyShaperLookupTablePass.h @@ -45,7 +45,9 @@ namespace AZ protected: explicit ApplyShaperLookupTablePass(const RPI::PassDescriptor& descriptor); - void Init() override; + + // Pass behavior overrides... + void InitializeInternal() override; RHI::ShaderInputImageIndex m_shaderInputLutImageIndex; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/BakeAcesOutputTransformLutPass.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/BakeAcesOutputTransformLutPass.h index 60505653b7..0f6f1aa954 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/BakeAcesOutputTransformLutPass.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/BakeAcesOutputTransformLutPass.h @@ -57,15 +57,13 @@ namespace AZ explicit BakeAcesOutputTransformLutPass(const RPI::PassDescriptor& descriptor); // Pass behavior overrides... - void FrameBeginInternal(FramePrepareParams params) override; + void InitializeInternal() override; // RHI::ScopeProducer overrides... void SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) override; void CompileResources(const RHI::FrameGraphCompileContext& context) override; void BuildCommandListInternal(const RHI::FrameGraphExecuteContext& context) override; - void Init(); - void AcquireLutImage(); void ReleaseLutImage(); diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperFullScreenPass.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperFullScreenPass.h index 23c4cd1a0a..59c02accdd 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperFullScreenPass.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperFullScreenPass.h @@ -41,14 +41,11 @@ namespace AZ void SetInputReferencePassName(const Name& passName); void SetInputReferenceAttachmentName(const Name& attachmentName); - // Pass behavior overrides - virtual void BuildInternal() override; - protected: explicit DisplayMapperFullScreenPass(const RPI::PassDescriptor& descriptor); - // FullscreenTrianglePass behavior overrides - virtual void Init(); + // Pass behavior overrides... + virtual void BuildInternal() override; private: Name m_inputReferencePassName = Name{ "Parent" }; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperPass.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperPass.h index 15ada4dd94..b741a10953 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperPass.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/DisplayMapperPass.h @@ -77,6 +77,7 @@ namespace AZ // Pass behavior overrides void BuildInternal() final; + void InitializeInternal() final; void FrameBeginInternal(FramePrepareParams params) final; void FrameEndInternal() final; void CreateChildPassesInternal() final; diff --git a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/OutputTransformPass.h b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/OutputTransformPass.h index b266eab14b..caee7ae3dd 100644 --- a/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/OutputTransformPass.h +++ b/Gems/Atom/Feature/Common/Code/Include/Atom/Feature/DisplayMapper/OutputTransformPass.h @@ -49,7 +49,9 @@ namespace AZ protected: explicit OutputTransformPass(const RPI::PassDescriptor& descriptor); - void Init() override; + + // Pass behavior overrides + void InitializeInternal() override; private: // Scope producer functions... diff --git a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformLutPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformLutPass.cpp index 104a91174d..5e3bde94e9 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformLutPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformLutPass.cpp @@ -42,9 +42,9 @@ namespace AZ ReleaseLutImage(); } - void AcesOutputTransformLutPass::Init() + void AcesOutputTransformLutPass::InitializeInternal() { - DisplayMapperFullScreenPass::Init(); + DisplayMapperFullScreenPass::InitializeInternal(); AZ_Assert(m_shaderResourceGroup != nullptr, "AcesOutputTransformLutPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); diff --git a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformPass.cpp index 6fe38ff032..ec34d40ea6 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/AcesOutputTransformPass.cpp @@ -44,9 +44,9 @@ namespace AZ { } - void AcesOutputTransformPass::Init() + void AcesOutputTransformPass::InitializeInternal() { - DisplayMapperFullScreenPass::Init(); + DisplayMapperFullScreenPass::InitializeInternal(); AZ_Assert(m_shaderResourceGroup != nullptr, "AcesOutputTransformPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); diff --git a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/ApplyShaperLookupTablePass.cpp b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/ApplyShaperLookupTablePass.cpp index 496b4dcc8f..ff910a4b81 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/ApplyShaperLookupTablePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/ApplyShaperLookupTablePass.cpp @@ -38,9 +38,9 @@ namespace AZ ReleaseLutImage(); } - void ApplyShaperLookupTablePass::Init() + void ApplyShaperLookupTablePass::InitializeInternal() { - DisplayMapperFullScreenPass::Init(); + DisplayMapperFullScreenPass::InitializeInternal(); AZ_Assert(m_shaderResourceGroup != nullptr, "ApplyShaperLookupTablePass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); diff --git a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/BakeAcesOutputTransformLutPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/BakeAcesOutputTransformLutPass.cpp index 3322b82ff7..7a32925e93 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/BakeAcesOutputTransformLutPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/BakeAcesOutputTransformLutPass.cpp @@ -38,17 +38,7 @@ namespace AZ ReleaseLutImage(); } - void BakeAcesOutputTransformLutPass::FrameBeginInternal(FramePrepareParams params) - { - if (!m_flags.m_initialized) - { - Init(); - } - - ComputePass::FrameBeginInternal(params); - } - - void BakeAcesOutputTransformLutPass::Init() + void BakeAcesOutputTransformLutPass::InitializeInternal() { AZ_Assert(m_shaderResourceGroup != nullptr, "BakeAcesOutputTransformLutPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); @@ -67,7 +57,6 @@ namespace AZ m_shaderInputShaperBiasIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_shaperBias" }); m_shaderInputShaperScaleIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_shaperScale" }); } - m_flags.m_initialized = true; } void BakeAcesOutputTransformLutPass::SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) diff --git a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperFullScreenPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperFullScreenPass.cpp index 096179d5b6..03fcfbe71d 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperFullScreenPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperFullScreenPass.cpp @@ -53,9 +53,5 @@ namespace AZ m_inputReferenceAttachmentName = attachmentName; } - void DisplayMapperFullScreenPass::Init() - { - FullscreenTrianglePass::Init(); - } } // namespace Render } // namespace AZ diff --git a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperPass.cpp index f5b301ca5c..0a6a2a59c7 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/DisplayMapperPass.cpp @@ -82,7 +82,7 @@ namespace AZ const Name& passName = fullscreenTrianglePass->GetName(); if (passName.GetStringView() == "CopyToSwapChain") { - fullscreenTrianglePass->Invalidate(); + fullscreenTrianglePass->QueueForInitialization(); } } } @@ -186,6 +186,18 @@ namespace AZ ParentPass::BuildInternal(); } + void DisplayMapperPass::InitializeInternal() + { + // Force update on bindings because children of display mapper pass have their outputs connect + // to their parent's output, which is a non-conventional and non-standard workflow + for (const RPI::Ptr& child : m_children) + { + child->UpdateConnectedBindings(); + } + + RPI::ParentPass::InitializeInternal(); + } + void DisplayMapperPass::FrameBeginInternal(FramePrepareParams params) { ConfigureDisplayParameters(); diff --git a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/OutputTransformPass.cpp b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/OutputTransformPass.cpp index a6b23171a5..5937f9ee49 100644 --- a/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/OutputTransformPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/DisplayMapper/OutputTransformPass.cpp @@ -39,9 +39,9 @@ namespace AZ { } - void OutputTransformPass::Init() + void OutputTransformPass::InitializeInternal() { - DisplayMapperFullScreenPass::Init(); + DisplayMapperFullScreenPass::InitializeInternal(); AZ_Assert(m_shaderResourceGroup != nullptr, "OutputTransformPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.cpp index e0ff253301..433f9c0276 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.cpp @@ -43,14 +43,9 @@ namespace AZ ReleaseLutImage(); } - void BlendColorGradingLutsPass::FrameBeginInternal(FramePrepareParams params) + void BlendColorGradingLutsPass::InitializeInternal() { - if (!m_flags.m_initialized) - { - Init(); - } - - ComputePass::FrameBeginInternal(params); + InitializeShaderVariant(); } void BlendColorGradingLutsPass::InitializeShaderVariant() @@ -106,12 +101,6 @@ namespace AZ m_needToUpdateShaderVariant = false; } - void BlendColorGradingLutsPass::Init() - { - InitializeShaderVariant(); - m_flags.m_initialized = true; - } - void BlendColorGradingLutsPass::SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) { ComputePass::SetupFrameGraphDependencies(frameGraph); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.h index c131a3cb38..048d0069f4 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/BlendColorGradingLutsPass.h @@ -56,7 +56,7 @@ namespace AZ explicit BlendColorGradingLutsPass(const RPI::PassDescriptor& descriptor); // Pass behavior overrides... - void FrameBeginInternal(FramePrepareParams params) override; + void InitializeInternal() override; // Scope producer functions... void SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) override; @@ -66,8 +66,6 @@ namespace AZ void InitializeShaderVariant(); void UpdateCurrentShaderVariant(); - void Init(); - void AcquireLutImage(); void ReleaseLutImage(); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.cpp index 4a4a8a8b76..090d87e048 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.cpp @@ -43,9 +43,9 @@ namespace AZ { } - void DepthOfFieldBokehBlurPass::Init() + void DepthOfFieldBokehBlurPass::InitializeInternal() { - FullscreenTrianglePass::Init(); + FullscreenTrianglePass::InitializeInternal(); m_sampleNumberIndex.Reset(); m_radiusMinIndex.Reset(); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.h index 688138fff0..c9b2dc6be2 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldBokehBlurPass.h @@ -39,11 +39,11 @@ namespace AZ protected: // Behaviour functions override... + void InitializeInternal() override; void FrameBeginInternal(FramePrepareParams params) override; private: DepthOfFieldBokehBlurPass(const RPI::PassDescriptor& descriptor); - void Init() override; void InitializeShaderVariant(); void UpdateCurrentShaderVariant(); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.cpp index 30c92963d0..bf88f8f8fb 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.cpp @@ -40,9 +40,9 @@ namespace AZ { } - void DepthOfFieldCompositePass::Init() + void DepthOfFieldCompositePass::InitializeInternal() { - FullscreenTrianglePass::Init(); + FullscreenTrianglePass::InitializeInternal(); m_backBlendFactorDivision2Index.Reset(); m_backBlendFactorDivision4Index.Reset(); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.h index fe4d60e679..00afdd0b0b 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldCompositePass.h @@ -37,11 +37,11 @@ namespace AZ protected: // Pass behavior overrides... + void InitializeInternal() override; void FrameBeginInternal(FramePrepareParams params) override; private: DepthOfFieldCompositePass(const RPI::PassDescriptor& descriptor); - void Init() override; void InitializeShaderVariant(); void UpdateCurrentShaderVariant(); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.cpp index 3f9c09c88c..93c19e5484 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.cpp @@ -33,9 +33,9 @@ namespace AZ { } - void DepthOfFieldMaskPass::Init() + void DepthOfFieldMaskPass::InitializeInternal() { - FullscreenTrianglePass::Init(); + FullscreenTrianglePass::InitializeInternal(); m_blendFactorIndex.Reset(); m_inputResolutionInverseIndex.Reset(); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.h index 09bb08a22c..7e21f87af7 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/DepthOfFieldMaskPass.h @@ -37,11 +37,11 @@ namespace AZ protected: // Pass behavior overrides... + void InitializeInternal() override; void FrameBeginInternal(FramePrepareParams params) override; private: DepthOfFieldMaskPass(const RPI::PassDescriptor& descriptor); - virtual void Init() override; // SRG binding indices... RHI::ShaderInputNameIndex m_blendFactorIndex = "m_blendFactor"; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.cpp index aff01d5bf1..45d3e0c39a 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.cpp @@ -48,9 +48,9 @@ namespace AZ } } - void LookModificationCompositePass::Init() + void LookModificationCompositePass::InitializeInternal() { - FullscreenTrianglePass::Init(); + FullscreenTrianglePass::InitializeInternal(); m_shaderColorGradingLutImageIndex.Reset(); m_shaderColorGradingShaperTypeIndex.Reset(); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.h index fb6c968436..8292330a2d 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/LookModificationCompositePass.h @@ -60,9 +60,9 @@ namespace AZ protected: LookModificationCompositePass(const RPI::PassDescriptor& descriptor); - void Init() override; //! Pass behavior overrides + void InitializeInternal() override; void FrameBeginInternal(FramePrepareParams params) final; private: diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABasePass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABasePass.cpp index d2424e24fd..f95637e824 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABasePass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABasePass.cpp @@ -43,9 +43,9 @@ namespace AZ { } - void SMAABasePass::Init() + void SMAABasePass::InitializeInternal() { - FullscreenTrianglePass::Init(); + FullscreenTrianglePass::InitializeInternal(); AZ_Assert(m_shaderResourceGroup != nullptr, "SMAABasePass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABasePass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABasePass.h index 0484b7d430..3a18d587b5 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABasePass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABasePass.h @@ -41,9 +41,12 @@ namespace AZ protected: SMAABasePass(const RPI::PassDescriptor& descriptor); - void Init() override; + // Pass behavior overrides... + void InitializeInternal() override; + // An interface to update pass srg. virtual void UpdateSRG() = 0; + // An interface to get current shader variation option. virtual void GetCurrentShaderOption(AZ::RPI::ShaderOptionGroup& shaderOption) const = 0; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.cpp index 39d9e51c86..7776bc3904 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.cpp @@ -94,9 +94,9 @@ namespace AZ } } - void SMAABlendingWeightCalculationPass::Init() + void SMAABlendingWeightCalculationPass::InitializeInternal() { - SMAABasePass::Init(); + SMAABasePass::InitializeInternal(); AZ_Assert(m_shaderResourceGroup != nullptr, "SMAABlendingWeightCalculationPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr()); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.h index b968a9c2d9..2f589a7ae6 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAABlendingWeightCalculationPass.h @@ -43,7 +43,9 @@ namespace AZ private: SMAABlendingWeightCalculationPass(const RPI::PassDescriptor& descriptor); - void Init() override; + + // Pass behavior overrides... + void InitializeInternal() override; // SMAABasePass functions... void UpdateSRG() override; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.cpp index 68485f3280..bb8069d0de 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.cpp @@ -48,9 +48,9 @@ namespace AZ { } - void SMAAEdgeDetectionPass::Init() + void SMAAEdgeDetectionPass::InitializeInternal() { - SMAABasePass::Init(); + SMAABasePass::InitializeInternal(); m_renderTargetMetricsShaderInputIndex.Reset(); m_chromaThresholdShaderInputIndex.Reset(); diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.h index f8302c55ca..f2c85297b6 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAAEdgeDetectionPass.h @@ -45,7 +45,9 @@ namespace AZ private: SMAAEdgeDetectionPass(const RPI::PassDescriptor& descriptor); - void Init() override; + + // Pass behavior overrides + void InitializeInternal() override; // SMAABasePass functions... void UpdateSRG() override; diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.cpp b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.cpp index 777e4d7d95..b2307de714 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.cpp @@ -47,9 +47,9 @@ namespace AZ { } - void SMAANeighborhoodBlendingPass::Init() + void SMAANeighborhoodBlendingPass::InitializeInternal() { - SMAABasePass::Init(); + SMAABasePass::InitializeInternal(); m_renderTargetMetricsShaderInputIndex.Reset(); } diff --git a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.h b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.h index 86386a0545..f54ff30575 100644 --- a/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/PostProcessing/SMAANeighborhoodBlendingPass.h @@ -37,7 +37,9 @@ namespace AZ private: SMAANeighborhoodBlendingPass(const RPI::PassDescriptor& descriptor); - void Init() override; + + // Pass behavior overrides + void InitializeInternal() override; // SMAABasePass functions... void UpdateSRG() override; diff --git a/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogPass.cpp b/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogPass.cpp index 477040b74a..70e17a28d3 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogPass.cpp +++ b/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogPass.cpp @@ -46,9 +46,9 @@ namespace AZ } - void DeferredFogPass::Init() + void DeferredFogPass::InitializeInternal() { - FullscreenTrianglePass::Init(); + FullscreenTrianglePass::InitializeInternal(); // The following will ensure that in the case of data driven pass, the settings will get // updated by the pass enable state. diff --git a/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogPass.h b/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogPass.h index e2740850de..78b7d25bff 100644 --- a/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogPass.h +++ b/Gems/Atom/Feature/Common/Code/Source/ScreenSpace/DeferredFogPass.h @@ -43,13 +43,11 @@ namespace AZ { AZ_RPI_PASS(DeferredFogPass); - public: AZ_RTTI(DeferredFogPass, "{0406C8AB-E95D-43A7-AF53-BDEE22D36746}", RPI::FullscreenTrianglePass); AZ_CLASS_ALLOCATOR(DeferredFogPass, SystemAllocator, 0); ~DeferredFogPass() = default; - void Init() override; static RPI::Ptr Create(const RPI::PassDescriptor& descriptor); @@ -57,12 +55,16 @@ namespace AZ virtual bool IsEnabled() const override; - void SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) override; - void CompileResources(const RHI::FrameGraphCompileContext& context) override; - protected: DeferredFogPass(const RPI::PassDescriptor& descriptor); + // Pass behavior overrides... + void InitializeInternal() override; + + // Scope producer functions... + void SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph) override; + void CompileResources(const RHI::FrameGraphCompileContext& context) override; + //! Set the binding indices of all members of the SRG void SetSrgBindIndices(); diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/FullscreenTrianglePass.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/FullscreenTrianglePass.h index fdb3241b44..616fc4639a 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/FullscreenTrianglePass.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/FullscreenTrianglePass.h @@ -44,14 +44,11 @@ namespace AZ //! Creates a FullscreenTrianglePass static Ptr Create(const PassDescriptor& descriptor); - // Clears the initialized flag so that the next time PrepareFrameInternal is called, it will update the pipeline state - void Invalidate(); - protected: FullscreenTrianglePass(const PassDescriptor& descriptor); - virtual void Init(); // Pass behavior overrides... + void InitializeInternal() override; void FrameBeginInternal(FramePrepareParams params) override; RHI::Viewport m_viewportState; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h index 1cfd2e759e..70af161e18 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Pass/Pass.h @@ -262,6 +262,15 @@ namespace AZ PassState GetPassState() const; + + + + // Update all bindings on this pass that are connected to bindings on other passes + void UpdateConnectedBindings(); + + + + protected: explicit Pass(const PassDescriptor& descriptor); @@ -393,7 +402,6 @@ namespace AZ uint64_t m_enabled : 1; uint64_t m_parentEnabled : 1; - uint64_t m_initialized : 1; uint64_t m_alreadyCreated : 1; uint64_t m_createChildren : 1; @@ -427,6 +435,12 @@ namespace AZ // fully custom sort implementations by overriding the SortDrawList() function. RHI::DrawListSortType m_drawListSortType = RHI::DrawListSortType::KeyThenDepth; + + + + + + private: // Return the Timestamp result of this pass virtual TimestampResult GetTimestampResultInternal() const; @@ -475,9 +489,6 @@ namespace AZ // This sets the binding's attachment pointer to the connected binding's attachment void UpdateConnectedBinding(PassAttachmentBinding& binding); - // Update all bindings on this pass that are connected to bindings on other passes - void UpdateConnectedBindings(); - // Process a PassFallbackConnection to connect an output to an input to act as a short-circuit for when Pass is disabled void ProcessFallbackConnection(const PassFallbackConnection& connection); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/FullscreenTrianglePass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/FullscreenTrianglePass.cpp index 1f8f361b8b..a854867998 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/FullscreenTrianglePass.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/FullscreenTrianglePass.cpp @@ -64,6 +64,8 @@ namespace AZ void FullscreenTrianglePass::LoadShader() { + AZ_Assert(GetPassState() != PassState::Rendering, "FullscreenTrianglePass - Reloading shader during Rendering phase!"); + // Load FullscreenTrianglePassData const FullscreenTrianglePassData* passData = PassUtils::GetPassData(m_passDescriptor); if (passData == nullptr) @@ -121,14 +123,16 @@ namespace AZ // Store stencil reference value for the draw call m_stencilRef = passData->m_stencilRef; - m_flags.m_initialized = false; + QueueForInitialization(); ShaderReloadNotificationBus::Handler::BusDisconnect(); ShaderReloadNotificationBus::Handler::BusConnect(shaderAsset.GetId()); } - void FullscreenTrianglePass::Init() + void FullscreenTrianglePass::InitializeInternal() { + RenderPass::InitializeInternal(); + // This draw item purposefully does not reference any geometry buffers. // Instead it's expected that the extended class uses a vertex shader // that generates a full-screen triangle completely from vertex ids. @@ -155,17 +159,10 @@ namespace AZ m_item.m_arguments = RHI::DrawArguments(draw); m_item.m_pipelineState = m_shader->AcquirePipelineState(pipelineStateDescriptor); m_item.m_stencilRef = m_stencilRef; - - m_flags.m_initialized = true; } void FullscreenTrianglePass::FrameBeginInternal(FramePrepareParams params) { - if (!m_flags.m_initialized) - { - Init(); - } - const PassAttachment* outputAttachment = nullptr; if (GetOutputCount() > 0) @@ -225,11 +222,6 @@ namespace AZ commandList->Submit(m_item); } - - void FullscreenTrianglePass::Invalidate() - { - m_flags.m_initialized = false; - } } // namespace RPI } // namespace AZ diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp index 78e30e7176..d03405dafd 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/Pass.cpp @@ -1088,6 +1088,12 @@ namespace AZ void Pass::QueueForInitialization() { + // Pass::FrameBegin - Pass [Root.LowEndPipeline.LowEndPipelineTemplate.LightAdaptation.LookModificationTransformPass.LookModificationComposite] is attempting to render, but is not in the Idle state. + if (m_path == Name("Root.LowEndPipeline.LowEndPipelineTemplate.LightAdaptation.LookModificationTransformPass.LookModificationComposite")) + { + __nop(); + } + // Only queue if the pass is not in any other queue if (m_queueState == PassQueueState::NoQueue) { @@ -1119,6 +1125,11 @@ namespace AZ void Pass::Reset() { + if (m_path == Name("Root.LowEndPipeline.LowEndPipelineTemplate.LightAdaptation.LookModificationTransformPass.LookModificationComposite")) + { + __nop(); + } + bool execute = (m_state == PassState::Idle); execute = execute || (m_state == PassState::Queued && m_queueState == PassQueueState::QueuedForBuild); execute = execute || (m_state == PassState::Queued && m_queueState == PassQueueState::QueuedForInitialization); @@ -1158,6 +1169,11 @@ namespace AZ void Pass::Build(bool calledFromPassSystem) { + if (m_path == Name("Root.LowEndPipeline.LowEndPipelineTemplate.LightAdaptation.LookModificationTransformPass.LookModificationComposite")) + { + __nop(); + } + AZ_RPI_BREAK_ON_TARGET_PASS; bool execute = (m_state == PassState::Idle || m_state == PassState::Reset); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassSystem.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassSystem.cpp index 76ea52b4a3..50a2c0db91 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassSystem.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Pass/PassSystem.cpp @@ -103,7 +103,7 @@ namespace AZ m_rootPass = CreatePass(Name{"Root"}); m_rootPass->m_flags.m_partOfHierarchy = true; - //m_targetedPassDebugName = "RPISamplePipeline"; + //m_targetedPassDebugName = "AcesOutputTransform"; m_state = PassSystemState::Idle; } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp index 2c4c61f5aa..8e624abe13 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/RenderPipeline.cpp @@ -107,8 +107,13 @@ namespace AZ pipeline->m_originalRenderSettings = desc.m_renderSettings; pipeline->m_activeRenderSettings = desc.m_renderSettings; pipeline->m_rootPass->SetRenderPipeline(pipeline); + + // Manually create the pipeline so we can gather the view tags from it's passes + pipeline->m_rootPass->Reset(); pipeline->m_rootPass->Build(); pipeline->m_rootPass->Initialize(); + pipeline->m_rootPass->OnInitializationFinished(); + pipeline->BuildPipelineViews(); }