From 82177dbd6a4da311c2447a51414f31145d3e2fc0 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 25 Oct 2016 09:36:53 -0600 Subject: layers:Refactor CreateDescriptorSetLayout Update CreateDescriptorSetLayout() to use Pre/Post pattern and split out validation of createInfo for the layout to occur before the creation of the layout. --- layers/descriptor_sets.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'layers/descriptor_sets.cpp') diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 0c6747d6..52c0b339 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -24,18 +24,13 @@ #include // Construct DescriptorSetLayout instance from given create info -cvdescriptorset::DescriptorSetLayout::DescriptorSetLayout(debug_report_data *report_data, - const VkDescriptorSetLayoutCreateInfo *p_create_info, +cvdescriptorset::DescriptorSetLayout::DescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo *p_create_info, const VkDescriptorSetLayout layout) : layout_(layout), binding_count_(p_create_info->bindingCount), descriptor_count_(0), dynamic_descriptor_count_(0) { uint32_t global_index = 0; for (uint32_t i = 0; i < binding_count_; ++i) { descriptor_count_ += p_create_info->pBindings[i].descriptorCount; - if (!binding_to_index_map_.emplace(p_create_info->pBindings[i].binding, i).second) { - log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, - reinterpret_cast(layout_), __LINE__, VALIDATION_ERROR_02345, "DS", - "duplicated binding number in VkDescriptorSetLayoutBinding. %s", validation_error_map[VALIDATION_ERROR_02345]); - } + binding_to_index_map_.emplace(p_create_info->pBindings[i].binding, i); binding_to_global_start_index_map_[p_create_info->pBindings[i].binding] = global_index; global_index += p_create_info->pBindings[i].descriptorCount ? p_create_info->pBindings[i].descriptorCount - 1 : 0; binding_to_global_end_index_map_[p_create_info->pBindings[i].binding] = global_index; @@ -53,6 +48,23 @@ cvdescriptorset::DescriptorSetLayout::DescriptorSetLayout(debug_report_data *rep } } } + +// Validate descriptor set layout create info +bool cvdescriptorset::DescriptorSetLayout::ValidateCreateInfo(debug_report_data *report_data, + const VkDescriptorSetLayoutCreateInfo *create_info) { + bool skip = false; + std::unordered_set bindings; + for (uint32_t i = 0; i < create_info->bindingCount; ++i) { + if (bindings.count(create_info->pBindings[i].binding)) { + skip |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT, 0, __LINE__, + VALIDATION_ERROR_02345, "DS", "duplicated binding number in VkDescriptorSetLayoutBinding. %s", + validation_error_map[VALIDATION_ERROR_02345]); + } + bindings.insert(create_info->pBindings[i].binding); + } + return skip; +} + // put all bindings into the given set void cvdescriptorset::DescriptorSetLayout::FillBindingSet(std::unordered_set *binding_set) const { for (auto binding_index_pair : binding_to_index_map_) -- cgit v1.2.3