summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-06-17 03:37:37 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-06-17 03:37:37 +0000
commit7d8f5979a22038aac622a303be75e72bc3c0ec30 (patch)
tree55c35bb9a3a3efb45bfbd0c74ebab690c0c61f1d /Graphics/GraphicsEngineVulkan
parentImplemented forced wait when allocation from dynamic heap fails in Vulkan (diff)
downloadDiligentCore-7d8f5979a22038aac622a303be75e72bc3c0ec30.tar.gz
DiligentCore-7d8f5979a22038aac622a303be75e72bc3c0ec30.zip
Performance optimizations in Vulkan backend
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/include/PipelineLayout.h14
-rw-r--r--Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.h2
-rw-r--r--Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp2
-rw-r--r--Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp35
-rw-r--r--Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp4
5 files changed, 37 insertions, 20 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h b/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h
index a0810ab7..947f27dc 100644
--- a/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h
+++ b/Graphics/GraphicsEngineVulkan/include/PipelineLayout.h
@@ -87,20 +87,26 @@ public:
std::vector<uint32_t> DynamicOffsets;
ShaderResourceCacheVk* pResourceCache = nullptr;
VkPipelineBindPoint BindPoint = VK_PIPELINE_BIND_POINT_MAX_ENUM;
-
+ Uint32 SetCout = 0;
+ Uint32 DynamicOffsetCount = 0;
#ifdef _DEBUG
const PipelineLayout *pDbgPipelineLayout = nullptr;
#endif
- DescriptorSetBindInfo()
+ DescriptorSetBindInfo() :
+ vkSets(2),
+ DynamicOffsets(64)
{
- vkSets.reserve(2);
- DynamicOffsets.reserve(64);
}
void Reset()
{
+ SetCout = 0;
+ DynamicOffsetCount = 0;
+#ifdef _DEBUG
+ // In release mode, do not clear vectors as this causes unnecessary work
vkSets.clear();
DynamicOffsets.clear();
+#endif
pResourceCache = nullptr;
BindPoint = VK_PIPELINE_BIND_POINT_MAX_ENUM;
#ifdef _DEBUG
diff --git a/Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.h b/Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.h
index 92f01236..5bd7eebc 100644
--- a/Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.h
+++ b/Graphics/GraphicsEngineVulkan/include/ShaderResourceCacheVk.h
@@ -173,7 +173,7 @@ public:
template<bool VerifyOnly>
void TransitionResources(DeviceContextVkImpl *pCtxVkImpl);
- void GetDynamicBufferOffsets(Uint32 CtxId, std::vector<uint32_t>& Offsets)const;
+ Uint32 GetDynamicBufferOffsets(Uint32 CtxId, std::vector<uint32_t>& Offsets)const;
private:
diff --git a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
index 7709a821..d1f88d0d 100644
--- a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
@@ -444,7 +444,7 @@ namespace Diligent
else
CommitVkVertexBuffers();
- if(!m_DesrSetBindInfo.DynamicOffsets.empty())
+ if(m_DesrSetBindInfo.DynamicOffsetCount != 0)
pPipelineStateVk->BindDescriptorSetsWithDynamicOffsets(this, m_DesrSetBindInfo);
#if 0
#ifdef _DEBUG
diff --git a/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp b/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp
index 8c746f5d..e3d88771 100644
--- a/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/PipelineLayout.cpp
@@ -430,18 +430,25 @@ void PipelineLayout::PrepareDescriptorSets(DeviceContextVkImpl* pCtxVkImpl,
ShaderResourceCacheVk& ResourceCache,
DescriptorSetBindInfo& BindInfo)const
{
+#ifdef _DEBUG
BindInfo.vkSets.clear();
+#endif
+
+ // Do not use vector::resize for BindInfo.vkSets and BindInfo.DynamicOffsets as this
+ // causes unnecessary work to zero-initialize new elements
VERIFY(m_LayoutMgr.GetDescriptorSet(SHADER_VARIABLE_TYPE_STATIC).SetIndex == m_LayoutMgr.GetDescriptorSet(SHADER_VARIABLE_TYPE_MUTABLE).SetIndex,
"Static and mutable variables are expected to share the same descriptor set");
Uint32 TotalDynamicDescriptors = 0;
+ BindInfo.SetCout = 0;
for(SHADER_VARIABLE_TYPE VarType = SHADER_VARIABLE_TYPE_MUTABLE; VarType <= SHADER_VARIABLE_TYPE_DYNAMIC; VarType = static_cast<SHADER_VARIABLE_TYPE>(VarType+1))
{
const auto &Set = m_LayoutMgr.GetDescriptorSet(VarType);
if(Set.SetIndex >= 0)
{
- if(Set.SetIndex >= BindInfo.vkSets.size())
- BindInfo.vkSets.resize(Set.SetIndex + 1);
+ BindInfo.SetCout = std::max(BindInfo.SetCout, static_cast<Uint32>(Set.SetIndex + 1));
+ if(BindInfo.SetCout > BindInfo.vkSets.size())
+ BindInfo.vkSets.resize(BindInfo.SetCout);
VERIFY_EXPR(BindInfo.vkSets[Set.SetIndex] == VK_NULL_HANDLE);
BindInfo.vkSets[Set.SetIndex] = ResourceCache.GetDescriptorSet(Set.SetIndex).GetVkDescriptorSet();
VERIFY(BindInfo.vkSets[Set.SetIndex] != VK_NULL_HANDLE, "Descriptor set must not be null");
@@ -454,7 +461,9 @@ void PipelineLayout::PrepareDescriptorSets(DeviceContextVkImpl* pCtxVkImpl,
VERIFY(set != VK_NULL_HANDLE, "Descriptor set must not be null");
#endif
- BindInfo.DynamicOffsets.resize(TotalDynamicDescriptors);
+ BindInfo.DynamicOffsetCount = TotalDynamicDescriptors;
+ if(TotalDynamicDescriptors > BindInfo.DynamicOffsets.size())
+ BindInfo.DynamicOffsets.resize(TotalDynamicDescriptors);
BindInfo.BindPoint = IsCompute ? VK_PIPELINE_BIND_POINT_COMPUTE : VK_PIPELINE_BIND_POINT_GRAPHICS;
BindInfo.pResourceCache = &ResourceCache;
#ifdef _DEBUG
@@ -468,8 +477,8 @@ void PipelineLayout::PrepareDescriptorSets(DeviceContextVkImpl* pCtxVkImpl,
CmdBuffer.BindDescriptorSets(BindInfo.BindPoint,
m_LayoutMgr.GetVkPipelineLayout(),
0, // First set
- static_cast<uint32_t>(BindInfo.vkSets.size()),
- !BindInfo.vkSets.empty() ? BindInfo.vkSets.data() : nullptr,
+ BindInfo.SetCout,
+ BindInfo.vkSets.data(), // BindInfo.vkSets is never empty
0,
nullptr);
}
@@ -480,7 +489,7 @@ void PipelineLayout::BindDescriptorSetsWithDynamicOffsets(DeviceContextVkImpl*
{
VERIFY(BindInfo.pDbgPipelineLayout != nullptr, "Pipeline layout is not initialized, which most likely means that CommitShaderResources() has never been called");
VERIFY(BindInfo.pDbgPipelineLayout->IsSameAs(*this), "Inconsistent pipeline layout");
- VERIFY(!BindInfo.DynamicOffsets.empty(), "This function should only be called for pipelines that contain dynamic descriptors");
+ VERIFY(BindInfo.DynamicOffsetCount > 0, "This function should only be called for pipelines that contain dynamic descriptors");
VERIFY_EXPR(BindInfo.pResourceCache != nullptr);
#ifdef _DEBUG
@@ -490,10 +499,12 @@ void PipelineLayout::BindDescriptorSetsWithDynamicOffsets(DeviceContextVkImpl*
const auto &Set = m_LayoutMgr.GetDescriptorSet(VarType);
TotalDynamicDescriptors += Set.NumDynamicDescriptors;
}
- VERIFY(BindInfo.DynamicOffsets.size() == TotalDynamicDescriptors, "Incosistent dynamic buffer size");
+ VERIFY(BindInfo.DynamicOffsetCount == TotalDynamicDescriptors, "Incosistent dynamic buffer size");
+ VERIFY_EXPR(BindInfo.DynamicOffsets.size() >= BindInfo.DynamicOffsetCount);
#endif
- BindInfo.pResourceCache->GetDynamicBufferOffsets(pCtxVkImpl->GetContextId(), BindInfo.DynamicOffsets);
+ auto NumOffsetsWritten = BindInfo.pResourceCache->GetDynamicBufferOffsets(pCtxVkImpl->GetContextId(), BindInfo.DynamicOffsets);
+ VERIFY_EXPR(NumOffsetsWritten == BindInfo.DynamicOffsetCount);
auto& CmdBuffer = pCtxVkImpl->GetCommandBuffer();
// vkCmdBindDescriptorSets causes the sets numbered [firstSet .. firstSet+descriptorSetCount-1] to use the
@@ -503,11 +514,11 @@ void PipelineLayout::BindDescriptorSetsWithDynamicOffsets(DeviceContextVkImpl*
CmdBuffer.BindDescriptorSets(BindInfo.BindPoint,
m_LayoutMgr.GetVkPipelineLayout(),
0, // First set
- static_cast<uint32_t>(BindInfo.vkSets.size()),
- !BindInfo.vkSets.empty() ? BindInfo.vkSets.data() : nullptr,
+ BindInfo.SetCout,
+ BindInfo.vkSets.data(), // BindInfo.vkSets is never empty
// dynamicOffsetCount must equal the total number of dynamic descriptors in the sets being bound (13.2.5)
- static_cast<uint32_t>(BindInfo.DynamicOffsets.size()),
- !BindInfo.DynamicOffsets.empty() ? BindInfo.DynamicOffsets.data() : nullptr);
+ BindInfo.DynamicOffsetCount,
+ BindInfo.DynamicOffsets.data());
}
}
diff --git a/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp b/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp
index 4b16539e..f282426e 100644
--- a/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/ShaderResourceCacheVk.cpp
@@ -284,7 +284,7 @@ VkDescriptorImageInfo ShaderResourceCacheVk::Resource::GetSamplerDescriptorWrite
return DescrImgInfo;
}
-void ShaderResourceCacheVk::GetDynamicBufferOffsets(Uint32 CtxId, std::vector<uint32_t>& Offsets)const
+Uint32 ShaderResourceCacheVk::GetDynamicBufferOffsets(Uint32 CtxId, std::vector<uint32_t>& Offsets)const
{
// If any of the sets being bound include dynamic uniform or storage buffers, then
// pDynamicOffsets includes one element for each array element in each dynamic descriptor
@@ -337,7 +337,7 @@ void ShaderResourceCacheVk::GetDynamicBufferOffsets(Uint32 CtxId, std::vector<ui
}
#endif
}
- VERIFY(OffsetInd == Offsets.size(), "Incorrect number of dynamic offsets written");
+ return OffsetInd;
}
}