From fa545a9faeaf884dc1b1bf53bedb2046025bb0a8 Mon Sep 17 00:00:00 2001 From: assiduous Date: Tue, 9 Mar 2021 21:47:39 -0800 Subject: Unified PRS hash calculation --- .../include/PipelineResourceSignatureBase.hpp | 13 ++++++++ .../include/PipelineResourceAttribsD3D12.hpp | 19 +++++++++++ .../include/PipelineResourceSignatureD3D12Impl.hpp | 2 -- .../src/PipelineResourceSignatureD3D12Impl.cpp | 36 +++------------------ .../include/PipelineResourceAttribsGL.hpp | 15 +++++++++ .../include/PipelineResourceSignatureGLImpl.hpp | 2 -- .../src/PipelineResourceSignatureGLImpl.cpp | 37 +++------------------- .../include/PipelineResourceAttribsVk.hpp | 18 +++++++++++ .../include/PipelineResourceSignatureVkImpl.hpp | 2 -- .../src/PipelineResourceSignatureVkImpl.cpp | 35 +++----------------- 10 files changed, 77 insertions(+), 102 deletions(-) (limited to 'Graphics') diff --git a/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp b/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp index c2f3e2bc..cf0870fc 100644 --- a/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp +++ b/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp @@ -45,6 +45,7 @@ #include "PlatformMisc.hpp" #include "SRBMemoryAllocator.hpp" #include "ShaderResourceCacheCommon.hpp" +#include "HashUtils.hpp" namespace Diligent { @@ -593,6 +594,18 @@ protected: return SamplerInd; } + void CalculateHash() + { + const auto* const pThisImpl = static_cast(this); + + m_Hash = CalculatePipelineResourceSignatureDescHash(this->m_Desc); + for (Uint32 i = 0; i < this->m_Desc.NumResources; ++i) + { + const auto& Attr = pThisImpl->GetResourceAttribs(i); + HashCombine(m_Hash, Attr.GetHash()); + } + } + protected: std::unique_ptr> m_pRawMemory; diff --git a/Graphics/GraphicsEngineD3D12/include/PipelineResourceAttribsD3D12.hpp b/Graphics/GraphicsEngineD3D12/include/PipelineResourceAttribsD3D12.hpp index 7f7daad5..5d497c79 100644 --- a/Graphics/GraphicsEngineD3D12/include/PipelineResourceAttribsD3D12.hpp +++ b/Graphics/GraphicsEngineD3D12/include/PipelineResourceAttribsD3D12.hpp @@ -34,6 +34,7 @@ #include "PrivateConstants.h" #include "ShaderResourceCacheCommon.hpp" #include "DebugUtilities.hpp" +#include "HashUtils.hpp" namespace Diligent { @@ -130,6 +131,24 @@ public: GetD3D12RootParamType() == D3D12_ROOT_PARAMETER_TYPE_SRV || GetD3D12RootParamType() == D3D12_ROOT_PARAMETER_TYPE_UAV); } + + bool IsCompatibleWith(const PipelineResourceAttribsD3D12& rhs) const + { + // Ignore sampler index, signature root index & offset. + // clang-format off + return Register == rhs.Register && + Space == rhs.Space && + SRBRootIndex == rhs.SRBRootIndex && + SRBOffsetFromTableStart == rhs.SRBOffsetFromTableStart && + ImtblSamplerAssigned == rhs.ImtblSamplerAssigned && + RootParamType == rhs.RootParamType; + // clang-format on + } + + size_t GetHash() const + { + return ComputeHash(Register, Space, SRBRootIndex, SRBOffsetFromTableStart, ImtblSamplerAssigned, RootParamType); + } }; } // namespace Diligent diff --git a/Graphics/GraphicsEngineD3D12/include/PipelineResourceSignatureD3D12Impl.hpp b/Graphics/GraphicsEngineD3D12/include/PipelineResourceSignatureD3D12Impl.hpp index 497c57c3..3340de6c 100644 --- a/Graphics/GraphicsEngineD3D12/include/PipelineResourceSignatureD3D12Impl.hpp +++ b/Graphics/GraphicsEngineD3D12/include/PipelineResourceSignatureD3D12Impl.hpp @@ -192,8 +192,6 @@ private: using StaticResCacheTblSizesArrayType = std::array; void AllocateRootParameters(StaticResCacheTblSizesArrayType& StaticResCacheTblSizes); - size_t CalculateHash() const; - void Destruct(); private: diff --git a/Graphics/GraphicsEngineD3D12/src/PipelineResourceSignatureD3D12Impl.cpp b/Graphics/GraphicsEngineD3D12/src/PipelineResourceSignatureD3D12Impl.cpp index 3375cf2c..b9edc267 100644 --- a/Graphics/GraphicsEngineD3D12/src/PipelineResourceSignatureD3D12Impl.cpp +++ b/Graphics/GraphicsEngineD3D12/src/PipelineResourceSignatureD3D12Impl.cpp @@ -47,20 +47,6 @@ namespace Diligent namespace { -inline bool ResourcesCompatible(const PipelineResourceSignatureD3D12Impl::ResourceAttribs& lhs, - const PipelineResourceSignatureD3D12Impl::ResourceAttribs& rhs) -{ - // Ignore sampler index, signature root index & offset. - // clang-format off - return lhs.Register == rhs.Register && - lhs.Space == rhs.Space && - lhs.SRBRootIndex == rhs.SRBRootIndex && - lhs.SRBOffsetFromTableStart == rhs.SRBOffsetFromTableStart && - lhs.ImtblSamplerAssigned == rhs.ImtblSamplerAssigned && - lhs.RootParamType == rhs.RootParamType; - // clang-format on -} - void ValidatePipelineResourceSignatureDescD3D12(const PipelineResourceSignatureDesc& Desc) noexcept(false) { { @@ -192,7 +178,7 @@ PipelineResourceSignatureD3D12Impl::PipelineResourceSignatureD3D12Impl(IReferenc m_SRBMemAllocator.Initialize(m_Desc.SRBAllocationGranularity, GetNumActiveShaderStages(), ShaderVariableDataSizes.data(), 1, &CacheMemorySize.TotalSize); } - m_Hash = CalculateHash(); + CalculateHash(); } catch (...) { @@ -404,29 +390,15 @@ bool PipelineResourceSignatureD3D12Impl::IsCompatibleWith(const PipelineResource VERIFY_EXPR(ResCount == Other.GetTotalResourceCount()); for (Uint32 r = 0; r < ResCount; ++r) { - if (!ResourcesCompatible(GetResourceAttribs(r), Other.GetResourceAttribs(r))) + const auto& Res = GetResourceAttribs(r); + const auto& OtherRes = Other.GetResourceAttribs(r); + if (!Res.IsCompatibleWith(OtherRes)) return false; } return true; } -size_t PipelineResourceSignatureD3D12Impl::CalculateHash() const -{ - if (m_Desc.NumResources == 0 && m_Desc.NumImmutableSamplers == 0) - return 0; - - auto Hash = CalculatePipelineResourceSignatureDescHash(m_Desc); - for (Uint32 i = 0; i < m_Desc.NumResources; ++i) - { - const auto& Attr = m_pResourceAttribs[i]; - HashCombine(Hash, Attr.Register, Attr.Space, Attr.SRBRootIndex, Attr.SRBOffsetFromTableStart, - Attr.RootParamType, Attr.IsImmutableSamplerAssigned()); - } - - return Hash; -} - void PipelineResourceSignatureD3D12Impl::InitSRBResourceCache(ShaderResourceCacheD3D12& ResourceCache) { ResourceCache.Initialize(m_SRBMemAllocator.GetResourceCacheDataAllocator(0), m_pDevice, m_RootParams); diff --git a/Graphics/GraphicsEngineOpenGL/include/PipelineResourceAttribsGL.hpp b/Graphics/GraphicsEngineOpenGL/include/PipelineResourceAttribsGL.hpp index 9130f0fa..b668411c 100644 --- a/Graphics/GraphicsEngineOpenGL/include/PipelineResourceAttribsGL.hpp +++ b/Graphics/GraphicsEngineOpenGL/include/PipelineResourceAttribsGL.hpp @@ -32,6 +32,7 @@ #include "BasicTypes.h" #include "DebugUtilities.hpp" +#include "HashUtils.hpp" namespace Diligent { @@ -77,6 +78,20 @@ public: { return ImtblSamplerAssigned != 0; } + + bool IsCompatibleWith(const PipelineResourceAttribsGL& rhs) const + { + // Ignore sampler index. + // clang-format off + return CacheOffset == rhs.CacheOffset && + ImtblSamplerAssigned == rhs.ImtblSamplerAssigned; + // clang-format on + } + + size_t GetHash() const + { + return ComputeHash(CacheOffset, ImtblSamplerAssigned); + } }; } // namespace Diligent diff --git a/Graphics/GraphicsEngineOpenGL/include/PipelineResourceSignatureGLImpl.hpp b/Graphics/GraphicsEngineOpenGL/include/PipelineResourceSignatureGLImpl.hpp index d4e159ae..db8f0246 100644 --- a/Graphics/GraphicsEngineOpenGL/include/PipelineResourceSignatureGLImpl.hpp +++ b/Graphics/GraphicsEngineOpenGL/include/PipelineResourceSignatureGLImpl.hpp @@ -152,8 +152,6 @@ private: void Destruct(); - size_t CalculateHash() const; - private: TBindings m_BindingCount = {}; diff --git a/Graphics/GraphicsEngineOpenGL/src/PipelineResourceSignatureGLImpl.cpp b/Graphics/GraphicsEngineOpenGL/src/PipelineResourceSignatureGLImpl.cpp index f48f82e5..8df6dccf 100644 --- a/Graphics/GraphicsEngineOpenGL/src/PipelineResourceSignatureGLImpl.cpp +++ b/Graphics/GraphicsEngineOpenGL/src/PipelineResourceSignatureGLImpl.cpp @@ -32,22 +32,6 @@ namespace Diligent { -namespace -{ - -inline bool ResourcesCompatible(const PipelineResourceSignatureGLImpl::ResourceAttribs& lhs, - const PipelineResourceSignatureGLImpl::ResourceAttribs& rhs) -{ - // Ignore sampler index. - // clang-format off - return lhs.CacheOffset == rhs.CacheOffset && - lhs.ImtblSamplerAssigned == rhs.ImtblSamplerAssigned; - // clang-format on -} - -} // namespace - - const char* GetBindingRangeName(BINDING_RANGE Range) { static_assert(BINDING_RANGE_COUNT == 4, "Please update the switch below to handle the new shader resource range"); @@ -139,7 +123,7 @@ PipelineResourceSignatureGLImpl::PipelineResourceSignatureGLImpl(IReferenceCount m_SRBMemAllocator.Initialize(m_Desc.SRBAllocationGranularity, GetNumActiveShaderStages(), ShaderVariableDataSizes.data(), 1, &CacheMemorySize); } - m_Hash = CalculateHash(); + CalculateHash(); } catch (...) { @@ -209,21 +193,6 @@ void PipelineResourceSignatureGLImpl::CreateLayout() } } -size_t PipelineResourceSignatureGLImpl::CalculateHash() const -{ - if (m_Desc.NumResources == 0 && m_Desc.NumImmutableSamplers == 0) - return 0; - - auto Hash = CalculatePipelineResourceSignatureDescHash(m_Desc); - for (Uint32 i = 0; i < m_Desc.NumResources; ++i) - { - const auto& Attr = m_pResourceAttribs[i]; - HashCombine(Hash, Attr.CacheOffset); - } - - return Hash; -} - PipelineResourceSignatureGLImpl::~PipelineResourceSignatureGLImpl() { Destruct(); @@ -529,7 +498,9 @@ bool PipelineResourceSignatureGLImpl::IsCompatibleWith(const PipelineResourceSig VERIFY_EXPR(ResCount == Other.GetTotalResourceCount()); for (Uint32 r = 0; r < ResCount; ++r) { - if (!ResourcesCompatible(GetResourceAttribs(r), Other.GetResourceAttribs(r))) + const auto& Res = GetResourceAttribs(r); + const auto& OtherRes = Other.GetResourceAttribs(r); + if (!Res.IsCompatibleWith(OtherRes)) return false; } diff --git a/Graphics/GraphicsEngineVulkan/include/PipelineResourceAttribsVk.hpp b/Graphics/GraphicsEngineVulkan/include/PipelineResourceAttribsVk.hpp index a597cb54..34a19796 100644 --- a/Graphics/GraphicsEngineVulkan/include/PipelineResourceAttribsVk.hpp +++ b/Graphics/GraphicsEngineVulkan/include/PipelineResourceAttribsVk.hpp @@ -34,6 +34,7 @@ #include "ShaderResourceCacheCommon.hpp" #include "PrivateConstants.h" #include "DebugUtilities.hpp" +#include "HashUtils.hpp" namespace Diligent { @@ -142,6 +143,23 @@ public: { return SamplerInd != InvalidSamplerInd; } + + bool IsCompatibleWith(const PipelineResourceAttribsVk& rhs) const + { + // Ignore sampler index and cache offsets. + // clang-format off + return BindingIndex == rhs.BindingIndex && + ArraySize == rhs.ArraySize && + DescrType == rhs.DescrType && + DescrSet == rhs.DescrSet && + ImtblSamplerAssigned == rhs.ImtblSamplerAssigned; + // clang-format on + } + + size_t GetHash() const + { + return ComputeHash(BindingIndex, ArraySize, DescrType, DescrSet, ImtblSamplerAssigned); + } }; } // namespace Diligent diff --git a/Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp b/Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp index 9d4633f6..80b6c2f2 100644 --- a/Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp +++ b/Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp @@ -194,8 +194,6 @@ private: void CreateSetLayouts(); - size_t CalculateHash() const; - static inline CACHE_GROUP GetResourceCacheGroup(const PipelineResourceDesc& Res); static inline DESCRIPTOR_SET_ID VarTypeToDescriptorSetId(SHADER_RESOURCE_VARIABLE_TYPE VarType); diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp index 421bbe26..36f72f89 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp @@ -44,19 +44,6 @@ namespace Diligent namespace { -inline bool ResourcesCompatible(const PipelineResourceSignatureVkImpl::ResourceAttribs& lhs, - const PipelineResourceSignatureVkImpl::ResourceAttribs& rhs) -{ - // Ignore sampler index and cache offsets. - // clang-format off - return lhs.BindingIndex == rhs.BindingIndex && - lhs.ArraySize == rhs.ArraySize && - lhs.DescrType == rhs.DescrType && - lhs.DescrSet == rhs.DescrSet && - lhs.ImtblSamplerAssigned == rhs.ImtblSamplerAssigned; - // clang-format on -} - inline VkDescriptorType GetVkDescriptorType(DescriptorType Type) { static_assert(static_cast(DescriptorType::Count) == 15, "Please update the switch below to handle the new descriptor type"); @@ -270,7 +257,7 @@ PipelineResourceSignatureVkImpl::PipelineResourceSignatureVkImpl(IReferenceCount } } - m_Hash = CalculateHash(); + CalculateHash(); } catch (...) { @@ -552,22 +539,6 @@ void PipelineResourceSignatureVkImpl::CreateSetLayouts() VERIFY_EXPR(NumSets == GetNumDescriptorSets()); } -size_t PipelineResourceSignatureVkImpl::CalculateHash() const -{ - if (m_Desc.NumResources == 0 && m_Desc.NumImmutableSamplers == 0) - return 0; - - auto Hash = CalculatePipelineResourceSignatureDescHash(m_Desc); - for (Uint32 i = 0; i < m_Desc.NumResources; ++i) - { - const auto& Attr = m_pResourceAttribs[i]; - HashCombine(Hash, static_cast(Attr.GetDescriptorType()), Attr.BindingIndex, Attr.DescrType, - Attr.DescrSet, Attr.IsImmutableSamplerAssigned(), Attr.SRBCacheOffset); - } - - return Hash; -} - PipelineResourceSignatureVkImpl::~PipelineResourceSignatureVkImpl() { Destruct(); @@ -610,7 +581,9 @@ bool PipelineResourceSignatureVkImpl::IsCompatibleWith(const PipelineResourceSig VERIFY_EXPR(ResCount == Other.GetTotalResourceCount()); for (Uint32 r = 0; r < ResCount; ++r) { - if (!ResourcesCompatible(GetResourceAttribs(r), Other.GetResourceAttribs(r))) + const auto& Res = GetResourceAttribs(r); + const auto& OtherRes = Other.GetResourceAttribs(r); + if (!Res.IsCompatibleWith(OtherRes)) return false; } -- cgit v1.2.3