@@ -63,20 +63,34 @@ void ScreenSpaceAmbientOcclusion::PrepareResources(IRenderDevice* pDevice, IDevi
6363 DEV_CHECK_ERR (pDevice != nullptr , " pDevice must not be null" );
6464 DEV_CHECK_ERR (pPostFXContext != nullptr , " pPostFXContext must not be null" );
6565
66- const PostFXContext::FrameDesc& FrameDesc = pPostFXContext->GetFrameDesc ();
67- const PostFXContext::SupportedDeviceFeatures& SupportedFeatures = pPostFXContext->GetSupportedFeatures ();
66+ const PostFXContext::FrameDesc& FrameDesc = pPostFXContext->GetFrameDesc ();
67+ const PostFXContext::SupportedDeviceFeatures& SupportedFeatures = pPostFXContext->GetSupportedFeatures ();
68+ const PostFXContext::FEATURE_FLAGS PostFXFeatureFlags = pPostFXContext->GetFeatureFlags ();
6869
6970 m_CurrentFrameIdx = FrameDesc.Index ;
7071
71- if (m_BackBufferWidth == FrameDesc.Width && m_BackBufferHeight == FrameDesc.Height && m_FeatureFlags == FeatureFlags)
72- return ;
72+ const bool UseReverseDepth = (PostFXFeatureFlags & PostFXContext::FEATURE_FLAG_REVERSED_DEPTH) != 0 ;
73+ if (m_FeatureFlags != FeatureFlags || m_UseReverseDepth != UseReverseDepth)
74+ {
75+ for (auto & Iter : m_RenderTech)
76+ Iter.second .SRB .Release ();
77+
78+ if ((m_FeatureFlags & (FEATURE_FLAG_HALF_PRECISION_DEPTH | FEATURE_FLAG_HALF_RESOLUTION)) !=
79+ (FeatureFlags & (FEATURE_FLAG_HALF_PRECISION_DEPTH | FEATURE_FLAG_HALF_RESOLUTION)))
80+ {
81+ m_BackBufferWidth = 0 ;
82+ m_BackBufferHeight = 0 ;
83+ }
7384
74- for (auto & Iter : m_RenderTech)
75- Iter.second .SRB .Release ();
85+ m_FeatureFlags = FeatureFlags;
86+ m_UseReverseDepth = UseReverseDepth;
87+ }
88+
89+ if (m_BackBufferWidth == FrameDesc.Width && m_BackBufferHeight == FrameDesc.Height )
90+ return ;
7691
7792 m_BackBufferWidth = FrameDesc.Width ;
7893 m_BackBufferHeight = FrameDesc.Height ;
79- m_FeatureFlags = FeatureFlags;
8094
8195 bool Unorm16Supported = pDevice->GetTextureFormatInfoExt (TEX_FORMAT_R16_UNORM).BindFlags & BIND_RENDER_TARGET;
8296 m_BackBufferFormats.ConvolutionDepth = (FeatureFlags & FEATURE_FLAG_HALF_PRECISION_DEPTH) && Unorm16Supported ? TEX_FORMAT_R16_UNORM : TEX_FORMAT_R32_FLOAT;
@@ -346,7 +360,7 @@ void ScreenSpaceAmbientOcclusion::Execute(const RenderAttributes& RenderAttribs)
346360
347361 ScopedDebugGroup DebugGroupGlobal{RenderAttribs.pDeviceContext , " ScreenSpaceAmbientOcclusion" };
348362
349- bool AllPSOsReady = PrepareShadersAndPSO (RenderAttribs, m_FeatureFlags ) && RenderAttribs.pPostFXContext ->IsPSOsReady ();
363+ bool AllPSOsReady = PrepareShadersAndPSO (RenderAttribs) && RenderAttribs.pPostFXContext ->IsPSOsReady ();
350364 UpdateConstantBuffer (RenderAttribs, !AllPSOsReady);
351365
352366 if (AllPSOsReady)
@@ -436,25 +450,23 @@ ITextureView* ScreenSpaceAmbientOcclusion::GetAmbientOcclusionSRV() const
436450 return m_Resources[RESOURCE_IDENTIFIER_OCCLUSION_HISTORY_RESOLVED].GetTextureSRV ();
437451}
438452
439- bool ScreenSpaceAmbientOcclusion::PrepareShadersAndPSO (const RenderAttributes& RenderAttribs, FEATURE_FLAGS FeatureFlags )
453+ bool ScreenSpaceAmbientOcclusion::PrepareShadersAndPSO (const RenderAttributes& RenderAttribs)
440454{
441- const PostFXContext::SupportedDeviceFeatures& SupportedFeatures = RenderAttribs.pPostFXContext ->GetSupportedFeatures ();
442- const PostFXContext::FEATURE_FLAGS PostFXFeatureFlags = RenderAttribs.pPostFXContext ->GetFeatureFlags ();
443-
444- const SHADER_COMPILE_FLAGS ShaderFlags = RenderAttribs.pPostFXContext ->GetShaderCompileFlags (m_Settings.EnableAsyncCreation );
445- const PSO_CREATE_FLAGS PSOFlags = m_Settings.EnableAsyncCreation ? PSO_CREATE_FLAG_ASYNCHRONOUS : PSO_CREATE_FLAG_NONE;
455+ const PostFXContext::SupportedDeviceFeatures& SupportedFeatures = RenderAttribs.pPostFXContext ->GetSupportedFeatures ();
456+ const SHADER_COMPILE_FLAGS ShaderFlags = RenderAttribs.pPostFXContext ->GetShaderCompileFlags (m_Settings.EnableAsyncCreation );
457+ const PSO_CREATE_FLAGS PSOFlags = m_Settings.EnableAsyncCreation ? PSO_CREATE_FLAG_ASYNCHRONOUS : PSO_CREATE_FLAG_NONE;
446458
447459 ShaderMacroHelper Macros;
448- Macros.Add (" SSAO_OPTION_INVERTED_DEPTH" , (PostFXFeatureFlags & PostFXContext::FEATURE_FLAG_REVERSED_DEPTH) != 0 );
460+ Macros.Add (" SSAO_OPTION_INVERTED_DEPTH" , m_UseReverseDepth );
449461 Macros.Add (" SUPPORTED_SHADER_SRV" , SupportedFeatures.TextureSubresourceViews );
450- Macros.Add (" SSAO_OPTION_UNIFORM_WEIGHTING" , (FeatureFlags & FEATURE_FLAG_UNIFORM_WEIGHTING) != 0 );
451- Macros.Add (" SSAO_OPTION_HALF_RESOLUTION" , (FeatureFlags & FEATURE_FLAG_HALF_RESOLUTION) != 0 );
452- Macros.Add (" SSAO_OPTION_HALF_PRECISION_DEPTH" , (FeatureFlags & FEATURE_FLAG_HALF_PRECISION_DEPTH) != 0 );
462+ Macros.Add (" SSAO_OPTION_UNIFORM_WEIGHTING" , (m_FeatureFlags & FEATURE_FLAG_UNIFORM_WEIGHTING) != 0 );
463+ Macros.Add (" SSAO_OPTION_HALF_RESOLUTION" , (m_FeatureFlags & FEATURE_FLAG_HALF_RESOLUTION) != 0 );
464+ Macros.Add (" SSAO_OPTION_HALF_PRECISION_DEPTH" , (m_FeatureFlags & FEATURE_FLAG_HALF_PRECISION_DEPTH) != 0 );
453465
454466 bool AllPSOsReady = true ;
455467
456468 {
457- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_DOWNSAMPLED_DEPTH_BUFFER, FeatureFlags );
469+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_DOWNSAMPLED_DEPTH_BUFFER);
458470
459471 if (!RenderTech.IsInitializedPSO ())
460472 {
@@ -478,7 +490,7 @@ bool ScreenSpaceAmbientOcclusion::PrepareShadersAndPSO(const RenderAttributes& R
478490 }
479491
480492 {
481- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_PREFILTERED_DEPTH_BUFFER, FeatureFlags );
493+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_PREFILTERED_DEPTH_BUFFER);
482494 if (!RenderTech.IsInitializedPSO ())
483495 {
484496 RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {}, ShaderFlags);
@@ -514,7 +526,7 @@ bool ScreenSpaceAmbientOcclusion::PrepareShadersAndPSO(const RenderAttributes& R
514526 }
515527
516528 {
517- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_AMBIENT_OCCLUSION, FeatureFlags );
529+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_AMBIENT_OCCLUSION);
518530 if (!RenderTech.IsInitializedPSO ())
519531 {
520532 RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {}, ShaderFlags);
@@ -542,7 +554,7 @@ bool ScreenSpaceAmbientOcclusion::PrepareShadersAndPSO(const RenderAttributes& R
542554 }
543555
544556 {
545- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_BILATERAL_UPSAMPLING, FeatureFlags );
557+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_BILATERAL_UPSAMPLING);
546558 if (!RenderTech.IsInitializedPSO ())
547559 {
548560 RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {}, ShaderFlags);
@@ -573,7 +585,7 @@ bool ScreenSpaceAmbientOcclusion::PrepareShadersAndPSO(const RenderAttributes& R
573585 }
574586
575587 {
576- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_TEMPORAL_ACCUMULATION, FeatureFlags );
588+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_TEMPORAL_ACCUMULATION);
577589 if (!RenderTech.IsInitializedPSO ())
578590 {
579591 RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {}, ShaderFlags);
@@ -606,7 +618,7 @@ bool ScreenSpaceAmbientOcclusion::PrepareShadersAndPSO(const RenderAttributes& R
606618 }
607619
608620 {
609- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_CONVOLUTED_DEPTH_HISTORY, FeatureFlags );
621+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_CONVOLUTED_DEPTH_HISTORY);
610622 if (!RenderTech.IsInitializedPSO ())
611623 {
612624 RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {}, ShaderFlags);
@@ -643,7 +655,7 @@ bool ScreenSpaceAmbientOcclusion::PrepareShadersAndPSO(const RenderAttributes& R
643655 }
644656
645657 {
646- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_RESAMPLED_HISTORY, FeatureFlags );
658+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_RESAMPLED_HISTORY);
647659 if (!RenderTech.IsInitializedPSO ())
648660 {
649661 RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {}, ShaderFlags);
@@ -673,7 +685,7 @@ bool ScreenSpaceAmbientOcclusion::PrepareShadersAndPSO(const RenderAttributes& R
673685 }
674686
675687 {
676- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_SPATIAL_RECONSTRUCTION, FeatureFlags );
688+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_SPATIAL_RECONSTRUCTION);
677689 if (!RenderTech.IsInitializedPSO ())
678690 {
679691 RefCntAutoPtr<IShader> VS = PostFXRenderTechnique::CreateShader (RenderAttribs.pDevice , RenderAttribs.pStateCache , " FullScreenTriangleVS.fx" , " FullScreenTriangleVS" , SHADER_TYPE_VERTEX, {}, ShaderFlags);
@@ -737,7 +749,7 @@ void ScreenSpaceAmbientOcclusion::ComputeDepthCheckerboard(const RenderAttribute
737749 if (!(m_FeatureFlags & FEATURE_FLAG_HALF_RESOLUTION))
738750 return ;
739751
740- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_DOWNSAMPLED_DEPTH_BUFFER, m_FeatureFlags );
752+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_DOWNSAMPLED_DEPTH_BUFFER);
741753
742754 if (!RenderTech.IsInitializedSRB ())
743755 RenderTech.InitializeSRB (false );
@@ -759,7 +771,7 @@ void ScreenSpaceAmbientOcclusion::ComputeDepthCheckerboard(const RenderAttribute
759771
760772void ScreenSpaceAmbientOcclusion::ComputePrefilteredDepth (const RenderAttributes& RenderAttribs)
761773{
762- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_PREFILTERED_DEPTH_BUFFER, m_FeatureFlags );
774+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_PREFILTERED_DEPTH_BUFFER);
763775 const PostFXContext::SupportedDeviceFeatures& SupportedFeatures = RenderAttribs.pPostFXContext ->GetSupportedFeatures ();
764776
765777 if (!RenderTech.IsInitializedSRB ())
@@ -877,7 +889,7 @@ void ScreenSpaceAmbientOcclusion::ComputePrefilteredDepth(const RenderAttributes
877889
878890void ScreenSpaceAmbientOcclusion::ComputeAmbientOcclusion (const RenderAttributes& RenderAttribs)
879891{
880- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_AMBIENT_OCCLUSION, m_FeatureFlags );
892+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_AMBIENT_OCCLUSION);
881893
882894 if (!RenderTech.IsInitializedSRB ())
883895 {
@@ -911,7 +923,7 @@ void ScreenSpaceAmbientOcclusion::ComputeBilateralUpsampling(const RenderAttribu
911923 if (!(m_FeatureFlags & FEATURE_FLAG_HALF_RESOLUTION))
912924 return ;
913925
914- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_BILATERAL_UPSAMPLING, m_FeatureFlags );
926+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_BILATERAL_UPSAMPLING);
915927
916928 if (!RenderTech.IsInitializedSRB ())
917929 {
@@ -948,7 +960,7 @@ void ScreenSpaceAmbientOcclusion::ComputePlaceholderTexture(const RenderAttribut
948960
949961void ScreenSpaceAmbientOcclusion::ComputeTemporalAccumulation (const RenderAttributes& RenderAttribs)
950962{
951- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_TEMPORAL_ACCUMULATION, m_FeatureFlags );
963+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_TEMPORAL_ACCUMULATION);
952964
953965 if (!RenderTech.IsInitializedSRB ())
954966 {
@@ -991,7 +1003,7 @@ void ScreenSpaceAmbientOcclusion::ComputeTemporalAccumulation(const RenderAttrib
9911003
9921004void ScreenSpaceAmbientOcclusion::ComputeConvolutedDepthHistory (const RenderAttributes& RenderAttribs)
9931005{
994- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_CONVOLUTED_DEPTH_HISTORY, m_FeatureFlags );
1006+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_CONVOLUTED_DEPTH_HISTORY);
9951007 const PostFXContext::SupportedDeviceFeatures& SupportedFeatures = RenderAttribs.pPostFXContext ->GetSupportedFeatures ();
9961008
9971009 if (!RenderTech.IsInitializedSRB ())
@@ -1173,7 +1185,7 @@ void ScreenSpaceAmbientOcclusion::ComputeConvolutedDepthHistory(const RenderAttr
11731185
11741186void ScreenSpaceAmbientOcclusion::ComputeResampledHistory (const RenderAttributes& RenderAttribs)
11751187{
1176- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_RESAMPLED_HISTORY, m_FeatureFlags );
1188+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_RESAMPLED_HISTORY);
11771189
11781190 if (!RenderTech.IsInitializedSRB ())
11791191 {
@@ -1204,7 +1216,7 @@ void ScreenSpaceAmbientOcclusion::ComputeResampledHistory(const RenderAttributes
12041216
12051217void ScreenSpaceAmbientOcclusion::ComputeSpatialReconstruction (const RenderAttributes& RenderAttribs)
12061218{
1207- RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_SPATIAL_RECONSTRUCTION, m_FeatureFlags );
1219+ RenderTechnique& RenderTech = GetRenderTechnique (RENDER_TECH_COMPUTE_SPATIAL_RECONSTRUCTION);
12081220
12091221 if (!RenderTech.IsInitializedSRB ())
12101222 {
@@ -1245,14 +1257,9 @@ void ScreenSpaceAmbientOcclusion::ComputeSpatialReconstruction(const RenderAttri
12451257 RenderAttribs.pDeviceContext ->CopyTexture (CopyAttribs);
12461258}
12471259
1248- ScreenSpaceAmbientOcclusion::RenderTechnique& ScreenSpaceAmbientOcclusion::GetRenderTechnique (RENDER_TECH RenderTech, FEATURE_FLAGS FeatureFlags )
1260+ ScreenSpaceAmbientOcclusion::RenderTechnique& ScreenSpaceAmbientOcclusion::GetRenderTechnique (RENDER_TECH RenderTech)
12491261{
1250- auto Iter = m_RenderTech.find ({RenderTech, FeatureFlags});
1251- if (Iter != m_RenderTech.end ())
1252- return Iter->second ;
1253-
1254- auto Condition = m_RenderTech.emplace (RenderTechniqueKey{RenderTech, FeatureFlags}, RenderTechnique{});
1255- return Condition.first ->second ;
1262+ return m_RenderTech[{RenderTech, m_FeatureFlags, m_UseReverseDepth}];
12561263}
12571264
12581265} // namespace Diligent
0 commit comments