From d0ade2c8da447d87bb9b09b4bd6db96d26929718 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Thu, 29 Sep 2016 18:47:50 +1300 Subject: layers: Fix ResetDescriptorPool in OT Previously this didn't bother to clean up the descriptor sets associated with the pool. Signed-off-by: Chris Forbes --- layers/object_tracker.cpp | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/layers/object_tracker.cpp b/layers/object_tracker.cpp index cbf5f3cd..2177dca8 100644 --- a/layers/object_tracker.cpp +++ b/layers/object_tracker.cpp @@ -1498,14 +1498,25 @@ VKAPI_ATTR VkResult VKAPI_CALL CreateDescriptorPool(VkDevice device, const VkDes VKAPI_ATTR VkResult VKAPI_CALL ResetDescriptorPool(VkDevice device, VkDescriptorPool descriptorPool, VkDescriptorPoolResetFlags flags) { bool skip_call = false; - { - std::lock_guard lock(global_lock); - skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false); - skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false); - } + std::unique_lock lock(global_lock); + layer_data *device_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); + skip_call |= ValidateObject(device, descriptorPool, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT, false); + skip_call |= ValidateObject(device, device, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT, false); if (skip_call) { return VK_ERROR_VALIDATION_FAILED_EXT; } + // A DescriptorPool's descriptor sets are implicitly deleted when the pool is reset. + // Remove this pool's descriptor sets from our descriptorSet map. + auto itr = device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].begin(); + while (itr != device_data->object_map[VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT].end()) { + OBJTRACK_NODE *pNode = (*itr).second; + auto del_itr = itr++; + if (pNode->parent_object == reinterpret_cast(descriptorPool)) { + DestroyObject(device, (VkDescriptorSet)((*del_itr).first), + VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, false); + } + } + lock.unlock(); VkResult result = get_dispatch_table(ot_device_table_map, device)->ResetDescriptorPool(device, descriptorPool, flags); return result; } -- cgit v1.2.3