From 8c34b3e95a3787e11c7876ce57408b0f1dca0309 Mon Sep 17 00:00:00 2001
From: Artur Wasmut <awasmut@uni-koblenz.de>
Date: Tue, 7 Sep 2021 13:49:04 +0200
Subject: [PATCH] [#105] fix variable descriptor count.

---
 projects/bindless_textures/src/main.cpp |  2 +-
 src/vkcv/DescriptorManager.cpp          | 15 +++++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/projects/bindless_textures/src/main.cpp b/projects/bindless_textures/src/main.cpp
index 789557bf..457f6f1c 100644
--- a/projects/bindless_textures/src/main.cpp
+++ b/projects/bindless_textures/src/main.cpp
@@ -157,7 +157,7 @@ int main(int argc, const char** argv) {
 	const std::unordered_map<uint32_t, vkcv::DescriptorBinding> &descriptorBindings = firstMeshProgram.getReflectedDescriptors().at(0);
 
     std::unordered_map<uint32_t, vkcv::DescriptorBinding> adjustedBindings = descriptorBindings;
-    adjustedBindings[1].descriptorCount = 5;
+    adjustedBindings[1].descriptorCount = 6;
 
     vkcv::DescriptorSetLayoutHandle descriptorSetLayout = core.createDescriptorSetLayout(adjustedBindings);
 	vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(descriptorSetLayout);
diff --git a/src/vkcv/DescriptorManager.cpp b/src/vkcv/DescriptorManager.cpp
index 2ea408a9..e695d6e3 100644
--- a/src/vkcv/DescriptorManager.cpp
+++ b/src/vkcv/DescriptorManager.cpp
@@ -113,6 +113,21 @@ namespace vkcv
         DescriptorSetLayout setLayout = m_DescriptorSetLayouts[setLayoutHandle.getId()];
         vk::DescriptorSet vulkanHandle = VK_NULL_HANDLE;
         vk::DescriptorSetAllocateInfo allocInfo(m_Pools.back(), 1, &setLayout.vulkanHandle);
+
+        uint32_t sumVariableDescriptorCounts = 0;
+        for (auto bindingElem : setLayout.descriptorBindings)
+        {
+            DescriptorBinding binding = bindingElem.second;
+            uint32_t bindingID = bindingElem.first;
+
+            if(binding.variableCount)
+                sumVariableDescriptorCounts += binding.descriptorCount;
+        }
+
+        vk::DescriptorSetVariableDescriptorCountAllocateInfo variableAllocInfo(1, &sumVariableDescriptorCounts);
+
+        allocInfo.setPNext(&variableAllocInfo);
+
         auto result = m_Device.allocateDescriptorSets(&allocInfo, &vulkanHandle);
         if(result != vk::Result::eSuccess)
         {
-- 
GitLab