summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorassiduous <assiduous@diligentgraphics.com>2021-01-27 02:15:20 +0000
committerassiduous <assiduous@diligentgraphics.com>2021-01-27 02:15:20 +0000
commitdc464e82e60b730ade948307e9c28b96843646f0 (patch)
tree984c2e240b054973ba43f774121b5fbc30c25862 /Graphics/GraphicsEngineVulkan
parentPipelineResourceSignatureTest: added SingleVarType test (diff)
downloadDiligentCore-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.hpp13
-rw-r--r--Graphics/GraphicsEngineVulkan/src/PipelineResourceSignatureVkImpl.cpp38
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;