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