diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-06-01 16:41:17 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-06-02 16:58:47 -0600 |
| commit | ffaf95b453b9bd058f26bf0276f4010caaeabcf1 (patch) | |
| tree | 79603d75f38f98ea5e04225e39eeef9277c82d1f /layers | |
| parent | 974f7b081f055a05714ebc5a24d6465cba03f161 (diff) | |
| download | usermoji-ffaf95b453b9bd058f26bf0276f4010caaeabcf1.tar.xz | |
layers: Make layer_data visible to DescriptorSet
This is the start of migrating core_validation::layer_data to be
visible in DescriptorSet class.
DescriptorSet class can't see the contents of layer_data, so it also
needs the get<Object>() helper functions to look up items from the
maps. This first change only brings along getSetNode() utility
function so only set_map references can be removed.
Will add follow-on CLs to remove more maps from DescriptorSet class
and bring in more utility functions.
Diffstat (limited to 'layers')
| -rw-r--r-- | layers/core_validation.cpp | 15 | ||||
| -rw-r--r-- | layers/core_validation_types.h | 5 | ||||
| -rw-r--r-- | layers/descriptor_sets.cpp | 45 | ||||
| -rw-r--r-- | layers/descriptor_sets.h | 29 |
4 files changed, 49 insertions, 45 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 635f6c4b..66d3abd2 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -2625,11 +2625,12 @@ static bool validate_compute_pipeline(debug_report_data *report_data, PIPELINE_N } // Return Set node ptr for specified set or else NULL -static cvdescriptorset::DescriptorSet *getSetNode(layer_data *my_data, const VkDescriptorSet set) { - if (my_data->setMap.find(set) == my_data->setMap.end()) { +cvdescriptorset::DescriptorSet *getSetNode(const layer_data *my_data, const VkDescriptorSet set) { + auto set_it = my_data->setMap.find(set); + if (set_it == my_data->setMap.end()) { return NULL; } - return my_data->setMap[set]; + return set_it->second; } // For the given command buffer, verify and update the state for activeSetBindingsPairs // This includes: @@ -5880,7 +5881,7 @@ static void PostCallRecordAllocateDescriptorSets(layer_data *dev_data, const VkD const cvdescriptorset::AllocateDescriptorSetsData *common_data) { // All the updates are contained in a single cvdescriptorset function cvdescriptorset::PerformAllocateDescriptorSets( - pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, + pAllocateInfo, pDescriptorSets, common_data, &dev_data->descriptorPoolMap, &dev_data->setMap, dev_data, dev_data->descriptorSetLayoutMap, dev_data->bufferMap, dev_data->memObjMap, dev_data->bufferViewMap, dev_data->samplerMap, dev_data->imageViewMap, dev_data->imageMap, dev_data->device_extensions.imageToSwapchainMap, dev_data->device_extensions.swapchainMap); @@ -5976,14 +5977,14 @@ static bool PreCallValidateUpdateDescriptorSets(layer_data *dev_data, uint32_t d // Now make call(s) that validate state, but don't perform state updates in this function // Note, here DescriptorSets is unique in that we don't yet have an instance. Using a helper function in the // namespace which will parse params and make calls into specific class instances - return cvdescriptorset::ValidateUpdateDescriptorSets(dev_data->report_data, dev_data->setMap, descriptorWriteCount, - pDescriptorWrites, descriptorCopyCount, pDescriptorCopies); + return cvdescriptorset::ValidateUpdateDescriptorSets(dev_data->report_data, dev_data, descriptorWriteCount, pDescriptorWrites, + descriptorCopyCount, pDescriptorCopies); } // PostCallRecord* handles recording state updates following call down chain to UpdateDescriptorSets() static void PostCallRecordUpdateDescriptorSets(layer_data *dev_data, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies) { - cvdescriptorset::PerformUpdateDescriptorSets(dev_data->setMap, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, + cvdescriptorset::PerformUpdateDescriptorSets(dev_data, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies); } diff --git a/layers/core_validation_types.h b/layers/core_validation_types.h index 0b35fa16..901c1870 100644 --- a/layers/core_validation_types.h +++ b/layers/core_validation_types.h @@ -62,6 +62,11 @@ class BASE_NODE { std::atomic_int in_use; }; +namespace core_validation { +struct layer_data; +cvdescriptorset::DescriptorSet *getSetNode(const layer_data *, const VkDescriptorSet); +} + struct DESCRIPTOR_POOL_NODE { VkDescriptorPool pool; uint32_t maxSets; // Max descriptor sets allowed in this pool diff --git a/layers/descriptor_sets.cpp b/layers/descriptor_sets.cpp index 5cb38e56..97e21b5a 100644 --- a/layers/descriptor_sets.cpp +++ b/layers/descriptor_sets.cpp @@ -841,15 +841,16 @@ void cvdescriptorset::TexelDescriptor::CopyUpdate(const Descriptor *src) { // If the update hits an issue for which the callback returns "true", meaning that the call down the chain should // be skipped, then true is returned. // If there is no issue with the update, then false is returned. -bool cvdescriptorset::ValidateUpdateDescriptorSets( - const debug_report_data *report_data, const std::unordered_map<VkDescriptorSet, cvdescriptorset::DescriptorSet *> &set_map, - uint32_t write_count, const VkWriteDescriptorSet *p_wds, uint32_t copy_count, const VkCopyDescriptorSet *p_cds) { +bool cvdescriptorset::ValidateUpdateDescriptorSets(const debug_report_data *report_data, + const core_validation::layer_data *dev_data, uint32_t write_count, + const VkWriteDescriptorSet *p_wds, uint32_t copy_count, + const VkCopyDescriptorSet *p_cds) { bool skip_call = false; // Validate Write updates for (uint32_t i = 0; i < write_count; i++) { auto dest_set = p_wds[i].dstSet; - auto set_pair = set_map.find(dest_set); - if (set_pair == set_map.end()) { + auto set_node = core_validation::getSetNode(dev_data, dest_set); + if (!set_node) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast<uint64_t &>(dest_set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", @@ -857,7 +858,7 @@ bool cvdescriptorset::ValidateUpdateDescriptorSets( reinterpret_cast<uint64_t &>(dest_set)); } else { std::string error_str; - if (!set_pair->second->ValidateWriteUpdate(report_data, &p_wds[i], &error_str)) { + if (!set_node->ValidateWriteUpdate(report_data, &p_wds[i], &error_str)) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast<uint64_t &>(dest_set), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x%" PRIx64 @@ -870,15 +871,15 @@ bool cvdescriptorset::ValidateUpdateDescriptorSets( for (uint32_t i = 0; i < copy_count; ++i) { auto dst_set = p_cds[i].dstSet; auto src_set = p_cds[i].srcSet; - auto src_pair = set_map.find(src_set); - auto dst_pair = set_map.find(dst_set); - if (src_pair == set_map.end()) { + auto src_node = core_validation::getSetNode(dev_data, src_set); + auto dst_node = core_validation::getSetNode(dev_data, dst_set); + if (!src_node) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast<uint64_t &>(src_set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", "Cannot call vkUpdateDescriptorSets() to copy from descriptor set 0x%" PRIxLEAST64 " that has not been allocated.", reinterpret_cast<uint64_t &>(src_set)); - } else if (dst_pair == set_map.end()) { + } else if (!dst_node) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast<uint64_t &>(dst_set), __LINE__, DRAWSTATE_INVALID_DESCRIPTOR_SET, "DS", "Cannot call vkUpdateDescriptorSets() to copy to descriptor set 0x%" PRIxLEAST64 @@ -886,7 +887,7 @@ bool cvdescriptorset::ValidateUpdateDescriptorSets( reinterpret_cast<uint64_t &>(dst_set)); } else { std::string error_str; - if (!dst_pair->second->ValidateCopyUpdate(report_data, &p_cds[i], src_pair->second, &error_str)) { + if (!dst_node->ValidateCopyUpdate(report_data, &p_cds[i], src_node, &error_str)) { skip_call |= log_msg(report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, reinterpret_cast<uint64_t &>(dst_set), __LINE__, DRAWSTATE_INVALID_UPDATE_INDEX, "DS", @@ -904,26 +905,26 @@ bool cvdescriptorset::ValidateUpdateDescriptorSets( // with the same set of updates. // This is split from the validate code to allow validation prior to calling down the chain, and then update after // calling down the chain. -void cvdescriptorset::PerformUpdateDescriptorSets( - const std::unordered_map<VkDescriptorSet, cvdescriptorset::DescriptorSet *> &set_map, uint32_t write_count, - const VkWriteDescriptorSet *p_wds, uint32_t copy_count, const VkCopyDescriptorSet *p_cds) { +void cvdescriptorset::PerformUpdateDescriptorSets(const core_validation::layer_data *dev_data, uint32_t write_count, + const VkWriteDescriptorSet *p_wds, uint32_t copy_count, + const VkCopyDescriptorSet *p_cds) { // Write updates first uint32_t i = 0; for (i = 0; i < write_count; ++i) { auto dest_set = p_wds[i].dstSet; - auto set_pair = set_map.find(dest_set); - if (set_pair != set_map.end()) { - set_pair->second->PerformWriteUpdate(&p_wds[i]); + auto set_node = core_validation::getSetNode(dev_data, dest_set); + if (set_node) { + set_node->PerformWriteUpdate(&p_wds[i]); } } // Now copy updates for (i = 0; i < copy_count; ++i) { auto dst_set = p_cds[i].dstSet; auto src_set = p_cds[i].srcSet; - auto src_pair = set_map.find(src_set); - auto dst_pair = set_map.find(dst_set); - if (src_pair != set_map.end() && dst_pair != set_map.end()) { - dst_pair->second->PerformCopyUpdate(&p_cds[i], src_pair->second); + auto src_node = core_validation::getSetNode(dev_data, src_set); + auto dst_node = core_validation::getSetNode(dev_data, dst_set); + if (src_node && dst_node) { + dst_node->PerformCopyUpdate(&p_cds[i], src_node); } } } @@ -1286,7 +1287,7 @@ bool cvdescriptorset::ValidateAllocateDescriptorSets( void cvdescriptorset::PerformAllocateDescriptorSets( const VkDescriptorSetAllocateInfo *p_alloc_info, const VkDescriptorSet *descriptor_sets, const AllocateDescriptorSetsData *ds_data, std::unordered_map<VkDescriptorPool, DESCRIPTOR_POOL_NODE *> *pool_map, - std::unordered_map<VkDescriptorSet, cvdescriptorset::DescriptorSet *> *set_map, + std::unordered_map<VkDescriptorSet, cvdescriptorset::DescriptorSet *> *set_map, const core_validation::layer_data *dev_data, const std::unordered_map<VkDescriptorSetLayout, cvdescriptorset::DescriptorSetLayout *> &layout_map, const std::unordered_map<VkBuffer, BUFFER_NODE> &buffer_map, const std::unordered_map<VkDeviceMemory, DEVICE_MEM_INFO> &mem_obj_map, diff --git a/layers/descriptor_sets.h b/layers/descriptor_sets.h index bb5907ca..b11b5f87 100644 --- a/layers/descriptor_sets.h +++ b/layers/descriptor_sets.h @@ -253,30 +253,27 @@ struct AllocateDescriptorSetsData { }; // Helper functions for descriptor set functions that cross multiple sets // "Validate" will make sure an update is ok without actually performing it -bool ValidateUpdateDescriptorSets(const debug_report_data *, - const std::unordered_map<VkDescriptorSet, cvdescriptorset::DescriptorSet *> &, uint32_t, +bool ValidateUpdateDescriptorSets(const debug_report_data *, const core_validation::layer_data *, uint32_t, const VkWriteDescriptorSet *, uint32_t, const VkCopyDescriptorSet *); // "Perform" does the update with the assumption that ValidateUpdateDescriptorSets() has passed for the given update -void PerformUpdateDescriptorSets(const std::unordered_map<VkDescriptorSet, cvdescriptorset::DescriptorSet *> &, uint32_t, - const VkWriteDescriptorSet *, uint32_t, const VkCopyDescriptorSet *); +void PerformUpdateDescriptorSets(const core_validation::layer_data *, uint32_t, const VkWriteDescriptorSet *, uint32_t, + const VkCopyDescriptorSet *); // Validate that Allocation state is ok bool ValidateAllocateDescriptorSets(const debug_report_data *, const VkDescriptorSetAllocateInfo *, const std::unordered_map<VkDescriptorSetLayout, cvdescriptorset::DescriptorSetLayout *> &, const std::unordered_map<VkDescriptorPool, DESCRIPTOR_POOL_NODE *> &, AllocateDescriptorSetsData *); // Update state based on allocating new descriptorsets -void PerformAllocateDescriptorSets(const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, const AllocateDescriptorSetsData *, - std::unordered_map<VkDescriptorPool, DESCRIPTOR_POOL_NODE *> *, - std::unordered_map<VkDescriptorSet, cvdescriptorset::DescriptorSet *> *, - const std::unordered_map<VkDescriptorSetLayout, cvdescriptorset::DescriptorSetLayout *> &, - const std::unordered_map<VkBuffer, BUFFER_NODE> &, - const std::unordered_map<VkDeviceMemory, DEVICE_MEM_INFO> &, - const std::unordered_map<VkBufferView, VkBufferViewCreateInfo> &, - const std::unordered_map<VkSampler, std::unique_ptr<SAMPLER_NODE>> &, - const std::unordered_map<VkImageView, VkImageViewCreateInfo> &, - const std::unordered_map<VkImage, IMAGE_NODE> &, - const std::unordered_map<VkImage, VkSwapchainKHR> &, - const std::unordered_map<VkSwapchainKHR, SWAPCHAIN_NODE *> &); +void PerformAllocateDescriptorSets( + const VkDescriptorSetAllocateInfo *, const VkDescriptorSet *, const AllocateDescriptorSetsData *, + std::unordered_map<VkDescriptorPool, DESCRIPTOR_POOL_NODE *> *, + std::unordered_map<VkDescriptorSet, cvdescriptorset::DescriptorSet *> *, const core_validation::layer_data *, + const std::unordered_map<VkDescriptorSetLayout, cvdescriptorset::DescriptorSetLayout *> &, + const std::unordered_map<VkBuffer, BUFFER_NODE> &, const std::unordered_map<VkDeviceMemory, DEVICE_MEM_INFO> &, + const std::unordered_map<VkBufferView, VkBufferViewCreateInfo> &, + const std::unordered_map<VkSampler, std::unique_ptr<SAMPLER_NODE>> &, + const std::unordered_map<VkImageView, VkImageViewCreateInfo> &, const std::unordered_map<VkImage, IMAGE_NODE> &, + const std::unordered_map<VkImage, VkSwapchainKHR> &, const std::unordered_map<VkSwapchainKHR, SWAPCHAIN_NODE *> &); /* * DescriptorSet class |
