diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2021-02-20 04:01:22 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-03-19 00:38:09 +0000 |
| commit | b9c44f8f6e98ff7a9cbeeb0d82ecbd41afae563d (patch) | |
| tree | b9e3f4a7e3d7436e2219c03d2a27930b15589ede /Graphics/GraphicsEngine | |
| parent | Updated accessing static variables through PSO (diff) | |
| download | DiligentCore-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.hpp | 18 | ||||
| -rw-r--r-- | Graphics/GraphicsEngine/src/PipelineResourceSignatureBase.cpp | 64 |
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 |
