summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngine
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-02-20 04:01:22 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-03-19 00:38:09 +0000
commitb9c44f8f6e98ff7a9cbeeb0d82ecbd41afae563d (patch)
treeb9e3f4a7e3d7436e2219c03d2a27930b15589ede /Graphics/GraphicsEngine
parentUpdated accessing static variables through PSO (diff)
downloadDiligentCore-b9c44f8f6e98ff7a9cbeeb0d82ecbd41afae563d.tar.gz
DiligentCore-b9c44f8f6e98ff7a9cbeeb0d82ecbd41afae563d.zip
PipelineResourceSignatureD3D12Impl and PipelineResourceSignatureVkImpl: removed duplicate logic for hash calculation and compatiblitiy tests
Diffstat (limited to 'Graphics/GraphicsEngine')
-rw-r--r--Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp18
-rw-r--r--Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp64
2 files changed, 70 insertions, 12 deletions
diff --git a/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp b/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp
index b748df22..93659fa7 100644
--- a/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp
+++ b/Graphics/GraphicsEngine/include/PipelineResourceSignatureBase.hpp
@@ -58,18 +58,12 @@ Int32 FindImmutableSampler(const ImmutableSamplerDesc* ImtblSamplers,
const char* ResourceName,
const char* SamplerSuffix);
-/// Returns true if two pipeline resources are compatible
-inline bool PipelineResourcesCompatible(const PipelineResourceDesc& lhs, const PipelineResourceDesc& rhs)
-{
- // Ignore resource names.
- // clang-format off
- return lhs.ShaderStages == rhs.ShaderStages &&
- lhs.ArraySize == rhs.ArraySize &&
- lhs.ResourceType == rhs.ResourceType &&
- lhs.VarType == rhs.VarType &&
- lhs.Flags == rhs.Flags;
- // clang-format on
-}
+/// Returns true if two pipeline resource signature descriptions are compatible, and false otherwise
+bool PipelineResourceSignaturesCompatible(const PipelineResourceSignatureDesc& Desc0,
+ const PipelineResourceSignatureDesc& Desc1) noexcept;
+
+/// Calculates hash of the pipeline resource signature description.
+size_t CalculatePipelineResourceSignatureDescHash(const PipelineResourceSignatureDesc& Desc) noexcept;
/// Template class implementing base functionality of the pipeline resource signature object.
diff --git a/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp b/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp
index cd7e048c..29c069de 100644
--- a/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp
+++ b/Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp
@@ -245,5 +245,69 @@ Int32 FindImmutableSampler(const ImmutableSamplerDesc* ImtblSamplers,
return -1;
}
+/// Returns true if two pipeline resources are compatible
+inline bool PipelineResourcesCompatible(const PipelineResourceDesc& lhs, const PipelineResourceDesc& rhs)
+{
+ // Ignore resource names.
+ // clang-format off
+ return lhs.ShaderStages == rhs.ShaderStages &&
+ lhs.ArraySize == rhs.ArraySize &&
+ lhs.ResourceType == rhs.ResourceType &&
+ lhs.VarType == rhs.VarType &&
+ lhs.Flags == rhs.Flags;
+ // clang-format on
+}
+
+bool PipelineResourceSignaturesCompatible(const PipelineResourceSignatureDesc& Desc0,
+ const PipelineResourceSignatureDesc& Desc1) noexcept
+{
+ if (Desc0.BindingIndex != Desc1.BindingIndex)
+ return false;
+
+ if (Desc0.NumResources != Desc1.NumResources)
+ return false;
+
+ for (Uint32 r = 0; r < Desc0.NumResources; ++r)
+ {
+ if (!PipelineResourcesCompatible(Desc0.Resources[r], Desc1.Resources[r]))
+ return false;
+ }
+
+ if (Desc0.NumImmutableSamplers != Desc1.NumImmutableSamplers)
+ return false;
+
+ for (Uint32 s = 0; s < Desc0.NumImmutableSamplers; ++s)
+ {
+ const auto& Samp0 = Desc0.ImmutableSamplers[s];
+ const auto& Samp1 = Desc1.ImmutableSamplers[s];
+
+ if (Samp0.ShaderStages != Samp1.ShaderStages ||
+ !(Samp0.Desc == Samp1.Desc))
+ return false;
+ }
+
+ return true;
+}
+
+size_t CalculatePipelineResourceSignatureDescHash(const PipelineResourceSignatureDesc& Desc) noexcept
+{
+ if (Desc.NumResources == 0 && Desc.NumImmutableSamplers == 0)
+ return 0;
+
+ size_t Hash = ComputeHash(Desc.NumResources, Desc.NumImmutableSamplers, Desc.BindingIndex);
+
+ for (Uint32 i = 0; i < Desc.NumResources; ++i)
+ {
+ const auto& Res = Desc.Resources[i];
+ HashCombine(Hash, Uint32{Res.ShaderStages}, Res.ArraySize, Uint32{Res.ResourceType}, Uint32{Res.VarType}, Uint32{Res.Flags});
+ }
+
+ for (Uint32 i = 0; i < Desc.NumImmutableSamplers; ++i)
+ {
+ HashCombine(Hash, Uint32{Desc.ImmutableSamplers[i].ShaderStages}, Desc.ImmutableSamplers[i].Desc);
+ }
+
+ return Hash;
+}
} // namespace Diligent