diff options
| author | Dustin Graves <dustin@lunarg.com> | 2016-03-11 16:06:39 -0700 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-03-15 07:32:11 -0600 |
| commit | 6b4324727ea2fc35f229db1093727987e66db2a4 (patch) | |
| tree | ea1433abec20e6ee568de4342072cac41f744ead | |
| parent | ef0889b9c5261b43e56a995dd09cdf0eee6254fc (diff) | |
| download | usermoji-6b4324727ea2fc35f229db1093727987e66db2a4.tar.xz | |
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
| -rw-r--r-- | layers/draw_state.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
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); } |
