From 3e4994ec893b691461312c4377328b27f241e87b Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Mon, 5 Jul 2021 16:42:05 +0200
Subject: [PATCH] [#56] Added free()-call to descriptor-sets and fixed wrong
 descriptor-pool in list

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 include/vkcv/DescriptorConfig.hpp          |  1 +
 modules/scene/include/vkcv/scene/Scene.hpp |  2 +-
 modules/scene/src/vkcv/scene/Scene.cpp     |  4 +--
 src/vkcv/DescriptorManager.cpp             | 40 ++++++++++++++--------
 4 files changed, 30 insertions(+), 17 deletions(-)

diff --git a/include/vkcv/DescriptorConfig.hpp b/include/vkcv/DescriptorConfig.hpp
index c6d0dfd1..776322e6 100644
--- a/include/vkcv/DescriptorConfig.hpp
+++ b/include/vkcv/DescriptorConfig.hpp
@@ -11,6 +11,7 @@ namespace vkcv
     {
         vk::DescriptorSet       vulkanHandle;
         vk::DescriptorSetLayout layout;
+        size_t                  poolIndex;
     };
 
     /*
diff --git a/modules/scene/include/vkcv/scene/Scene.hpp b/modules/scene/include/vkcv/scene/Scene.hpp
index 6320d3db..eb14e99f 100644
--- a/modules/scene/include/vkcv/scene/Scene.hpp
+++ b/modules/scene/include/vkcv/scene/Scene.hpp
@@ -21,8 +21,8 @@ namespace vkcv::scene {
 		
 		Core* m_core;
 		
-		std::vector<Node> m_nodes;
 		std::vector<Material> m_materials;
+		std::vector<Node> m_nodes;
 		
 		explicit Scene(Core* core);
 		
diff --git a/modules/scene/src/vkcv/scene/Scene.cpp b/modules/scene/src/vkcv/scene/Scene.cpp
index ad75ae79..aa8c83b4 100644
--- a/modules/scene/src/vkcv/scene/Scene.cpp
+++ b/modules/scene/src/vkcv/scene/Scene.cpp
@@ -8,8 +8,8 @@ namespace vkcv::scene {
 	
 	Scene::Scene(Core* core) :
 	m_core(core),
-	m_nodes(),
-	m_materials() {}
+	m_materials(),
+	m_nodes() {}
 	
 	Scene::~Scene() {
 		m_nodes.clear();
diff --git a/src/vkcv/DescriptorManager.cpp b/src/vkcv/DescriptorManager.cpp
index 8e565a76..07ca97b5 100644
--- a/src/vkcv/DescriptorManager.cpp
+++ b/src/vkcv/DescriptorManager.cpp
@@ -16,7 +16,8 @@ namespace vkcv
 													vk::DescriptorPoolSize(vk::DescriptorType::eUniformBuffer, 1000),
 													vk::DescriptorPoolSize(vk::DescriptorType::eStorageBuffer, 1000) };
 
-		m_PoolInfo = vk::DescriptorPoolCreateInfo({},
+		m_PoolInfo = vk::DescriptorPoolCreateInfo(
+				vk::DescriptorPoolCreateFlagBits::eFreeDescriptorSet,
 			1000,
 			static_cast<uint32_t>(m_PoolSizes.size()),
 			m_PoolSizes.data());
@@ -29,9 +30,13 @@ namespace vkcv
         for (uint64_t id = 0; id < m_DescriptorSets.size(); id++) {
 			destroyDescriptorSetById(id);
         }
+        
 		m_DescriptorSets.clear();
+  
 		for (const auto &pool : m_Pools) {
-			m_Device.destroy(pool);
+			if (pool) {
+				m_Device.destroy(pool);
+			}
 		}
     }
 
@@ -40,12 +45,12 @@ namespace vkcv
         std::vector<vk::DescriptorSetLayoutBinding> setBindings = {};
 
         //create each set's binding
-        for (uint32_t i = 0; i < bindings.size(); i++) {
+        for (auto binding : bindings) {
             vk::DescriptorSetLayoutBinding descriptorSetLayoutBinding(
-                bindings[i].bindingID,
-                convertDescriptorTypeFlag(bindings[i].descriptorType),
-                bindings[i].descriptorCount,
-                convertShaderStageFlag(bindings[i].shaderStage));
+                binding.bindingID,
+                convertDescriptorTypeFlag(binding.descriptorType),
+                binding.descriptorCount,
+                convertShaderStageFlag(binding.shaderStage));
             setBindings.push_back(descriptorSetLayoutBinding);
         }
 
@@ -53,8 +58,7 @@ namespace vkcv
 
         //create the descriptor set's layout from the bindings gathered above
         vk::DescriptorSetLayoutCreateInfo layoutInfo({}, setBindings);
-        if(m_Device.createDescriptorSetLayout(&layoutInfo, nullptr, &set.layout) != vk::Result::eSuccess)
-        {
+        if (m_Device.createDescriptorSetLayout(&layoutInfo, nullptr, &set.layout) != vk::Result::eSuccess) {
 			vkcv_log(LogLevel::ERROR, "Failed to create descriptor set layout");
             return DescriptorSetHandle();
         };
@@ -70,6 +74,7 @@ namespace vkcv
 				allocInfo.setDescriptorPool(m_Pools.back());
 				result = m_Device.allocateDescriptorSets(&allocInfo, &set.vulkanHandle);
 			}
+			
 			if (result != vk::Result::eSuccess) {
 				vkcv_log(LogLevel::ERROR, "Failed to create descriptor set (%s)",
 						 vk::to_string(result).c_str());
@@ -78,6 +83,8 @@ namespace vkcv
 				return DescriptorSetHandle();
 			}
         };
+	
+		set.poolIndex = (m_Pools.size() - 1);
 
         const uint64_t id = m_DescriptorSets.size();
 
@@ -277,17 +284,22 @@ namespace vkcv
 			m_Device.destroyDescriptorSetLayout(set.layout);
 			set.layout = nullptr;
 		}
-		// FIXME: descriptor set itself not destroyed
+		
+		if (set.vulkanHandle) {
+			m_Device.freeDescriptorSets(m_Pools[set.poolIndex], 1, &(set.vulkanHandle));
+			set.vulkanHandle = nullptr;
+		}
 	}
 
 	vk::DescriptorPool DescriptorManager::allocateDescriptorPool() {
 		vk::DescriptorPool pool;
-		if (m_Device.createDescriptorPool(&m_PoolInfo, nullptr, &pool) != vk::Result::eSuccess)
-		{
+		if (m_Device.createDescriptorPool(&m_PoolInfo, nullptr, &pool) != vk::Result::eSuccess) {
 			vkcv_log(LogLevel::WARNING, "Failed to allocate descriptor pool");
 			pool = nullptr;
-		};
-		m_Pools.push_back(pool);
+		} else {
+			m_Pools.push_back(pool);
+		}
+		
 		return pool;
 	}
 
-- 
GitLab