From 6b4324727ea2fc35f229db1093727987e66db2a4 Mon Sep 17 00:00:00 2001 From: Dustin Graves Date: Fri, 11 Mar 2016 16:06:39 -0700 Subject: layers: draw state image/layout cleanup Remove tracked device memory, subresource, and layout data associated with an image when that image is destroyed. Eliminates spurious draw state messages that report invalid layout issues when the destroyed image's handle is recylced and the new image state is validated with the old image's data. Change-Id: Ia956a3f7c60a34e6357f4d0d4d9dfe760910e97c --- layers/draw_state.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index bae914ce..6dca5c5b 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -3889,6 +3889,9 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyDevice(VkDevice device, cons deleteLayouts(dev_data); dev_data->imageViewMap.clear(); dev_data->imageMap.clear(); + dev_data->imageSubresourceMap.clear(); + dev_data->imageLayoutMap.clear(); + dev_data->memImageMap.clear(); dev_data->bufferViewMap.clear(); dev_data->bufferMap.clear(); loader_platform_thread_unlock_mutex(&globalLock); @@ -4610,7 +4613,18 @@ VK_LAYER_EXPORT VKAPI_ATTR void VKAPI_CALL vkDestroyImage(VkDevice device, VkIma layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); dev_data->device_dispatch_table->DestroyImage(device, image, pAllocator); loader_platform_thread_lock_mutex(&globalLock); - dev_data->imageMap.erase(image); + const auto& entry = dev_data->imageMap.find(image); + if (entry != dev_data->imageMap.end()) { + dev_data->memImageMap.erase(entry->second.mem); + dev_data->imageMap.erase(entry); + } + const auto& subEntry = dev_data->imageSubresourceMap.find(image); + if (subEntry != dev_data->imageSubresourceMap.end()) { + for (const auto& pair : subEntry->second) { + dev_data->imageLayoutMap.erase(pair); + } + dev_data->imageSubresourceMap.erase(subEntry); + } loader_platform_thread_unlock_mutex(&globalLock); } -- cgit v1.2.3