diff options
| author | assiduous <assiduous@diligentgraphics.com> | 2021-01-27 02:15:20 +0000 |
|---|---|---|
| committer | assiduous <assiduous@diligentgraphics.com> | 2021-01-27 02:15:20 +0000 |
| commit | dc464e82e60b730ade948307e9c28b96843646f0 (patch) | |
| tree | 984c2e240b054973ba43f774121b5fbc30c25862 /Graphics/GraphicsEngineVulkan | |
| parent | PipelineResourceSignatureTest: added SingleVarType test (diff) | |
| download | DiligentCore-dc464e82e60b730ade948307e9c28b96843646f0.tar.gz DiligentCore-dc464e82e60b730ade948307e9c28b96843646f0.zip | |
Optimized PipelineResourceSignatureVkImpl::CommitDynamicResources by storing ArraySize in ResourceAttribs
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp | 13 | ||||
| -rw-r--r-- | Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp | 38 |
2 files changed, 32 insertions, 19 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp b/Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp index 895b13cf..90ad576f 100644 --- a/Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp +++ b/Graphics/GraphicsEngineVulkan/include/PipelineResourceSignatureVkImpl.hpp @@ -97,12 +97,15 @@ public: struct ResourceAttribs { private: - static constexpr Uint32 _DescrTypeBits = 4; - static constexpr Uint32 _DescrSetBits = 1; static constexpr Uint32 _BindingIndexBits = 16; static constexpr Uint32 _SamplerIndBits = 16; + static constexpr Uint32 _ArraySizeBits = 26; + static constexpr Uint32 _DescrTypeBits = 4; + static constexpr Uint32 _DescrSetBits = 1; static constexpr Uint32 _SamplerAssignedBits = 1; + static_assert((_BindingIndexBits + _ArraySizeBits + _SamplerIndBits + _DescrTypeBits + _DescrSetBits + _SamplerAssignedBits) % 4 == 0, "Bits are not optimally packed"); + static_assert((1u << _DescrTypeBits) >= static_cast<Uint32>(DescriptorType::Count), "Not enough bits to store DescriptorType values"); static_assert((1u << _DescrSetBits) >= MAX_DESCR_SET_PER_SIGNATURE, "Not enough bits to store descriptor set index"); static_assert((1u << _BindingIndexBits) >= MAX_RESOURCES_IN_SIGNATURE, "Not enough bits to store resource binding index"); @@ -113,6 +116,7 @@ public: // clang-format off const Uint32 BindingIndex : _BindingIndexBits; // Binding in the descriptor set const Uint32 SamplerInd : _SamplerIndBits; // Index in m_Desc.Resources and m_pResourceAttribs + const Uint32 ArraySize : _ArraySizeBits; // Array size const Uint32 DescrType : _DescrTypeBits; // Descriptor type (DescriptorType) const Uint32 DescrSet : _DescrSetBits; // Descriptor set (0 or 1) const Uint32 ImtblSamplerAssigned : _SamplerAssignedBits; // Immutable sampler flag @@ -122,14 +126,16 @@ public: ResourceAttribs(Uint32 _BindingIndex, Uint32 _SamplerInd, + Uint32 _ArraySize, DescriptorType _DescrType, Uint32 _DescrSet, bool ImtblSamplerAssigned, Uint32 _SRBCacheOffset, Uint32 _StaticCacheOffset) noexcept : // clang-format off - BindingIndex {_BindingIndex }, + BindingIndex {_BindingIndex }, SamplerInd {_SamplerInd }, + ArraySize {_ArraySize }, DescrType {static_cast<Uint32>(_DescrType)}, DescrSet {_DescrSet }, ImtblSamplerAssigned {ImtblSamplerAssigned ? 1u : 0u }, @@ -138,6 +144,7 @@ public: // clang-format on { VERIFY(BindingIndex == _BindingIndex, "Binding index (", _BindingIndex, ") exceeds maximum representable value"); + VERIFY(ArraySize == _ArraySize, "Array size (", _ArraySize, ") exceeds maximum representable value"); VERIFY(SamplerInd == _SamplerInd, "Sampler index (", _SamplerInd, ") exceeds maximum representable value"); VERIFY(Type() == _DescrType, "Descriptor type (", static_cast<Uint32>(_DescrType), ") exceeds maximum representable value"); VERIFY(DescrSet == _DescrSet, "Descriptor set (", _DescrSet, ") exceeds maximum representable value"); diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp index b5a1dc96..5a6236bd 100644 --- a/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp +++ b/Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp @@ -468,6 +468,7 @@ void PipelineResourceSignatureVkImpl::CreateLayout(const CacheOffsetsType& Cache { BindingIndices[CacheGroup], AssignedSamplerInd, + ResDesc.ArraySize, DescrType, DSMapping[SetIdx], pVkImmutableSamplers != nullptr, @@ -851,7 +852,7 @@ SHADER_TYPE PipelineResourceSignatureVkImpl::GetShaderStageType(Uint32 StageInde Uint32 PipelineResourceSignatureVkImpl::GetNumDescriptorSets() const { - return Uint32{m_VkDescSetLayouts[0] != VK_NULL_HANDLE} + Uint32{m_VkDescSetLayouts[1] != VK_NULL_HANDLE}; + return (m_VkDescSetLayouts[0] != VK_NULL_HANDLE ? 1 : 0) + (m_VkDescSetLayouts[1] != VK_NULL_HANDLE ? 1 : 0); } void PipelineResourceSignatureVkImpl::InitializeResourceMemoryInCache(ShaderResourceCacheVk& ResourceCache) const @@ -919,7 +920,7 @@ Uint32 PipelineResourceSignatureVkImpl::GetStaticDescrSetIndex() const Uint32 PipelineResourceSignatureVkImpl::GetDynamicDescrSetIndex() const { - return m_VkDescSetLayouts[1] != VK_NULL_HANDLE ? Uint32{m_VkDescSetLayouts[0] != VK_NULL_HANDLE} : ~0u; + return m_VkDescSetLayouts[1] != VK_NULL_HANDLE ? (m_VkDescSetLayouts[0] != VK_NULL_HANDLE ? 1 : 0) : ~0u; } void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourceCacheVk& ResourceCache, @@ -959,17 +960,22 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc const auto& SetResources = ResourceCache.GetDescriptorSet(GetDynamicDescrSetIndex()); const auto& LogicalDevice = GetDevice()->GetLogicalDevice(); const auto ResIdxRange = GetResourceIndexRange(SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC); - const auto CacheType = CacheContentType::SRB; + + constexpr auto CacheType = CacheContentType::SRB; for (Uint32 ResNum = ResIdxRange.first, ArrElem = 0; ResNum < ResIdxRange.second;) { - const auto& Res = GetResourceDesc(ResNum); const auto& Attr = GetAttribs(ResNum); const auto CacheOffset = Attr.CacheOffset(CacheType); + const auto ArraySize = Attr.ArraySize; - // AZ TODO: put ArraySize to attributes to make it more cache friendly - - VERIFY_EXPR(Res.VarType == SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC); +#ifdef DILIGENT_DEBUG + { + const auto& Res = GetResourceDesc(ResNum); + VERIFY_EXPR(ArraySize == GetResourceDesc(ResNum).ArraySize); + VERIFY_EXPR(Res.VarType == SHADER_RESOURCE_VARIABLE_TYPE_DYNAMIC); + } +#endif WriteDescrSetIt->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; WriteDescrSetIt->pNext = nullptr; @@ -989,7 +995,7 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc case DescriptorType::UniformBuffer: case DescriptorType::UniformBufferDynamic: WriteDescrSetIt->pBufferInfo = &(*DescrBuffIt); - while (ArrElem < Res.ArraySize && DescrBuffIt != DescrBuffInfoArr.end()) + while (ArrElem < ArraySize && DescrBuffIt != DescrBuffInfoArr.end()) { const auto& CachedRes = SetResources.GetResource(CacheOffset + ArrElem); *DescrBuffIt = CachedRes.GetUniformBufferDescriptorWriteInfo(); @@ -1003,7 +1009,7 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc case DescriptorType::StorageBuffer_ReadOnly: case DescriptorType::StorageBufferDynamic_ReadOnly: WriteDescrSetIt->pBufferInfo = &(*DescrBuffIt); - while (ArrElem < Res.ArraySize && DescrBuffIt != DescrBuffInfoArr.end()) + while (ArrElem < ArraySize && DescrBuffIt != DescrBuffInfoArr.end()) { const auto& CachedRes = SetResources.GetResource(CacheOffset + ArrElem); *DescrBuffIt = CachedRes.GetStorageBufferDescriptorWriteInfo(); @@ -1016,7 +1022,7 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc case DescriptorType::StorageTexelBuffer: case DescriptorType::StorageTexelBuffer_ReadOnly: WriteDescrSetIt->pTexelBufferView = &(*BuffViewIt); - while (ArrElem < Res.ArraySize && BuffViewIt != DescrBuffViewArr.end()) + while (ArrElem < ArraySize && BuffViewIt != DescrBuffViewArr.end()) { const auto& CachedRes = SetResources.GetResource(CacheOffset + ArrElem); *BuffViewIt = CachedRes.GetBufferViewWriteInfo(); @@ -1030,7 +1036,7 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc case DescriptorType::StorageImage: case DescriptorType::InputAttachment: WriteDescrSetIt->pImageInfo = &(*DescrImgIt); - while (ArrElem < Res.ArraySize && DescrImgIt != DescrImgInfoArr.end()) + while (ArrElem < ArraySize && DescrImgIt != DescrImgInfoArr.end()) { const auto& CachedRes = SetResources.GetResource(CacheOffset + ArrElem); *DescrImgIt = CachedRes.GetImageDescriptorWriteInfo(Attr.IsImmutableSamplerAssigned()); @@ -1045,7 +1051,7 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc if (!Attr.IsImmutableSamplerAssigned()) { WriteDescrSetIt->pImageInfo = &(*DescrImgIt); - while (ArrElem < Res.ArraySize && DescrImgIt != DescrImgInfoArr.end()) + while (ArrElem < ArraySize && DescrImgIt != DescrImgInfoArr.end()) { const auto& CachedRes = SetResources.GetResource(CacheOffset + ArrElem); *DescrImgIt = CachedRes.GetSamplerDescriptorWriteInfo(); @@ -1055,14 +1061,14 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc } else { - ArrElem = Res.ArraySize; - WriteDescrSetIt->dstArrayElement = Res.ArraySize; + ArrElem = ArraySize; + WriteDescrSetIt->dstArrayElement = ArraySize; } break; case DescriptorType::AccelerationStructure: WriteDescrSetIt->pNext = &(*AccelStructIt); - while (ArrElem < Res.ArraySize && AccelStructIt != DescrAccelStructArr.end()) + while (ArrElem < ArraySize && AccelStructIt != DescrAccelStructArr.end()) { const auto& CachedRes = SetResources.GetResource(CacheOffset + ArrElem); *AccelStructIt = CachedRes.GetAccelerationStructureWriteInfo(); @@ -1076,7 +1082,7 @@ void PipelineResourceSignatureVkImpl::CommitDynamicResources(const ShaderResourc } WriteDescrSetIt->descriptorCount = ArrElem - WriteDescrSetIt->dstArrayElement; - if (ArrElem == Res.ArraySize) + if (ArrElem == ArraySize) { ArrElem = 0; ++ResNum; |
