summaryrefslogtreecommitdiffstats
path: root/Graphics
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-03-10 05:47:39 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-03-19 00:38:19 +0000
commitfa545a9faeaf884dc1b1bf53bedb2046025bb0a8 (patch)
tree78b9182aa90158adbcbd5d21ca7c108f4904ed7d /Graphics
parentRenamed Texture*_OGL to Texture*_GL (diff)
downloadDiligentCore-fa545a9faeaf884dc1b1bf53bedb2046025bb0a8.tar.gz
DiligentCore-fa545a9faeaf884dc1b1bf53bedb2046025bb0a8.zip
Unified PRS hash calculation
Diffstat (limited to 'Graphics')
-rw-r--r--Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp13
-rw-r--r--Graphics/GraphicsEngineD3D12/include/PipelineResourceAttribsD3D12.hpp19
-rw-r--r--Graphics/GraphicsEngineD3D12/include/PipelineResourceSignatureD3D12Impl.hpp2
-rw-r--r--Graphics/GraphicsEngineD3D12/src/PipelineResourceSignatureD3D12Impl.cpp36
-rw-r--r--Graphics/GraphicsEngineOpenGL/include/PipelineResourceAttribsGL.hpp15
-rw-r--r--Graphics/GraphicsEngineOpenGL/include/PipelineResourceSignatureGLImpl.hpp2
-rw-r--r--Graphics/GraphicsEngineOpenGL/src/PipelineResourceSignatureGLImpl.cpp37
-rw-r--r--Graphics/GraphicsEngineVulkan/include/PipelineResourceAttribsVk.hpp18
-rw-r--r--Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp2
-rw-r--r--Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp35
10 files changed, 77 insertions, 102 deletions
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<const PipelineResourceSignatureImplType*>(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<void, STDDeleterRawMem<void>> 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<Uint32, D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER + 1>;
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<Uint32>(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<Uint32>(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;
}