From 3a562af5555e8682af4bf033fa45a77f945bc368 Mon Sep 17 00:00:00 2001 From: Artur Wasmut <awasmut@uni-koblenz.de> Date: Mon, 30 Aug 2021 20:19:07 +0200 Subject: [PATCH] [#90] check insertion into maps in shader reflection stage. print nicely formatted warning message on collision. Check existing descriptor set layouts and return handle to it, before creating it anew. --- include/vkcv/DescriptorConfig.hpp | 10 ++++--- projects/first_mesh/src/main.cpp | 6 +++++ src/vkcv/DescriptorConfig.cpp | 18 +++++++++---- src/vkcv/DescriptorManager.cpp | 11 ++++++++ src/vkcv/ShaderProgram.cpp | 45 +++++++++++++++++++++++++++---- 5 files changed, 76 insertions(+), 14 deletions(-) diff --git a/include/vkcv/DescriptorConfig.hpp b/include/vkcv/DescriptorConfig.hpp index 71b14ba8..c3d9ec51 100644 --- a/include/vkcv/DescriptorConfig.hpp +++ b/include/vkcv/DescriptorConfig.hpp @@ -65,10 +65,12 @@ namespace vkcv ShaderStages shaderStages ) noexcept; - uint32_t bindingID; - DescriptorType descriptorType; - uint32_t descriptorCount; - ShaderStages shaderStages; + uint32_t bindingID; + DescriptorType descriptorType; + uint32_t descriptorCount; + ShaderStages shaderStages; + + bool DescriptorBinding::operator ==(const DescriptorBinding &other) const; }; typedef std::unordered_map<uint32_t, DescriptorBinding> DescriptorBindings; diff --git a/projects/first_mesh/src/main.cpp b/projects/first_mesh/src/main.cpp index 15c17349..a7c2d8ea 100644 --- a/projects/first_mesh/src/main.cpp +++ b/projects/first_mesh/src/main.cpp @@ -106,9 +106,15 @@ int main(int argc, const char** argv) { const vkcv::VertexLayout firstMeshLayout (bindings); + // since we only use one descriptor set (namely, desc set 0), directly address it + // recreate copies of the bindings and the handles (to check whether they are properly reused instead of actually recreated) std::unordered_map<uint32_t, vkcv::DescriptorBinding> set0Bindings = firstMeshProgram.getReflectedDescriptors().at(0); + auto set0BindingsExplicitCopy = set0Bindings; + vkcv::DescriptorSetLayoutHandle setLayoutHandle = core.createDescriptorSetLayout(set0Bindings); + vkcv::DescriptorSetLayoutHandle setLayoutHandleCopy = core.createDescriptorSetLayout(set0BindingsExplicitCopy); + vkcv::DescriptorSetHandle descriptorSet = core.createDescriptorSet(setLayoutHandle); const vkcv::PipelineConfig firstMeshPipelineConfig { diff --git a/src/vkcv/DescriptorConfig.cpp b/src/vkcv/DescriptorConfig.cpp index a9a127fe..91a9c24d 100644 --- a/src/vkcv/DescriptorConfig.cpp +++ b/src/vkcv/DescriptorConfig.cpp @@ -1,15 +1,23 @@ #include "vkcv/DescriptorConfig.hpp" -namespace vkcv { +namespace vkcv +{ DescriptorBinding::DescriptorBinding( uint32_t bindingID, DescriptorType descriptorType, uint32_t descriptorCount, - ShaderStages shaderStages) noexcept - : + ShaderStages shaderStages) noexcept: bindingID(bindingID), descriptorType(descriptorType), descriptorCount(descriptorCount), - shaderStages(shaderStages) {} - + shaderStages(shaderStages) + {} + + bool DescriptorBinding::operator==(const DescriptorBinding &other) const + { + return (this->bindingID == other.bindingID) && + (this->descriptorType == other.descriptorType) && + (this->descriptorCount == other.descriptorCount) && + (this->shaderStages == other.shaderStages); + } } diff --git a/src/vkcv/DescriptorManager.cpp b/src/vkcv/DescriptorManager.cpp index a1c2dd54..78c9c0a7 100644 --- a/src/vkcv/DescriptorManager.cpp +++ b/src/vkcv/DescriptorManager.cpp @@ -44,6 +44,17 @@ namespace vkcv DescriptorSetLayoutHandle DescriptorManager::createDescriptorSetLayout(const DescriptorBindings &setBindingsMap) { + for (auto i = 0; i < m_DescriptorSetLayouts.size(); i++) + { + if(m_DescriptorSetLayouts[i].descriptorBindings.size() != setBindingsMap.size()) + continue; + + if (m_DescriptorSetLayouts[i].descriptorBindings == setBindingsMap) + { + return DescriptorSetLayoutHandle(i, [&](uint64_t id) { destroyDescriptorSetLayoutById(id); }); + } + } + //create the descriptor set's layout by iterating over its bindings std::vector<vk::DescriptorSetLayoutBinding> bindingsVector = {}; for (auto bindingElem : setBindingsMap) diff --git a/src/vkcv/ShaderProgram.cpp b/src/vkcv/ShaderProgram.cpp index 363981f4..a1634c23 100644 --- a/src/vkcv/ShaderProgram.cpp +++ b/src/vkcv/ShaderProgram.cpp @@ -155,7 +155,14 @@ namespace vkcv { base_type.vecsize, shaderStage); - m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding)); + auto insertionResult = m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding)); + if(!insertionResult.second) + { + vkcv_log(LogLevel::WARNING, + "Attempting to overwrite already existing binding %u at set ID %u.", + bindingID, + setID); + } } for (uint32_t i = 0; i < resources.storage_buffers.size(); i++) @@ -171,7 +178,14 @@ namespace vkcv { base_type.vecsize, shaderStage); - m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding)); + auto insertionResult = m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding)); + if(!insertionResult.second) + { + vkcv_log(LogLevel::WARNING, + "Attempting to overwrite already existing binding %u at set ID %u.", + bindingID, + setID); + } } for (uint32_t i = 0; i < resources.separate_samplers.size(); i++) { @@ -186,7 +200,14 @@ namespace vkcv { base_type.vecsize, shaderStage); - m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding)); + auto insertionResult = m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding)); + if(!insertionResult.second) + { + vkcv_log(LogLevel::WARNING, + "Attempting to overwrite already existing binding %u at set ID %u.", + bindingID, + setID); + } } for (uint32_t i = 0; i < resources.separate_images.size(); i++) { @@ -201,7 +222,14 @@ namespace vkcv { base_type.vecsize, shaderStage); - m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding)); + auto insertionResult = m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding)); + if(!insertionResult.second) + { + vkcv_log(LogLevel::WARNING, + "Attempting to overwrite already existing binding %u at set ID %u.", + bindingID, + setID); + } } for (uint32_t i = 0; i < resources.storage_images.size(); i++) { @@ -216,7 +244,14 @@ namespace vkcv { base_type.vecsize, shaderStage); - m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding)); + auto insertionResult = m_DescriptorSets[setID].insert(std::make_pair(bindingID, binding)); + if(!insertionResult.second) + { + vkcv_log(LogLevel::WARNING, + "Attempting to overwrite already existing binding %u at set ID %u.", + bindingID, + setID); + } } //reflect push constants -- GitLab