diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-10-25 09:36:53 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-10-25 21:01:49 -0600 |
| commit | 82177dbd6a4da311c2447a51414f31145d3e2fc0 (patch) | |
| tree | a1a9fc7f7edd02ae849187b6ac2a6870dd04c388 /layers/descriptor_sets.cpp | |
| parent | 532eb6def55bd1247ef3d2be71bc846610501d4b (diff) | |
| download | usermoji-82177dbd6a4da311c2447a51414f31145d3e2fc0.tar.xz | |
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.
Diffstat (limited to 'layers/descriptor_sets.cpp')
| -rw-r--r-- | layers/descriptor_sets.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
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 <sstream> // 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<uint64_t &>(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<uint32_t> 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<uint32_t> *binding_set) const { for (auto binding_index_pair : binding_to_index_map_) |
