diff --git a/include/vkcv/DescriptorConfig.hpp b/include/vkcv/DescriptorConfig.hpp index c6d0dfd1bc60988afb8b6a9326a8d50d8a4ea32e..776322e6270431f9fa52fd7c3cb4551e5b4bf752 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 6320d3db9ad9097cd47d91c7f576400a30aee7cc..eb14e99ff0d4d602f5ead33f73850c55d6cc683d 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 ad75ae799b0e75ab71cfe18530a6ecdf859f96fa..aa8c83b4a5f9f280c81c4e78f01f5f3d52615c5d 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 8e565a766cd407dc33c0291d3d07b01d6d3066e7..07ca97b5ade9b69eed724000d9c7b388818d6725 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; }