From a3a7fd6cb59a00866de2b46763522351d0d1f7c5 Mon Sep 17 00:00:00 2001 From: Michael Lentine Date: Wed, 27 Jan 2016 17:02:39 -0600 Subject: layers: MR171, Validate pool cannot be reset when buffer in use in draw_state --- layers/draw_state.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp index 46b6d8fa..e3b9e218 100644 --- a/layers/draw_state.cpp +++ b/layers/draw_state.cpp @@ -3665,6 +3665,23 @@ VK_LAYER_EXPORT VKAPI_ATTR VkResult VKAPI_CALL vkResetCommandPool( layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map); VkResult result = VK_ERROR_VALIDATION_FAILED_EXT; + bool skip_call = false; + loader_platform_thread_lock_mutex(&globalLock); + auto pool_data = dev_data->commandPoolMap.find(commandPool); + if (pool_data != dev_data->commandPoolMap.end()) { + for (auto cmdBuffer : pool_data->second.commandBuffers) { + if (dev_data->inFlightCmdBuffers.count(cmdBuffer)) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT, reinterpret_cast(commandPool), + __LINE__, DRAWSTATE_OBJECT_INUSE, "DS", "Cannot reset command pool %" PRIx64 " when allocated command buffer %" PRIx64 " is in use.", + reinterpret_cast(commandPool), reinterpret_cast(cmdBuffer)); + } + } + } + loader_platform_thread_unlock_mutex(&globalLock); + + if (skip_call) + return VK_ERROR_VALIDATION_FAILED_EXT; + result = dev_data->device_dispatch_table->ResetCommandPool(device, commandPool, flags); // Reset all of the CBs allocated from this pool if (VK_SUCCESS == result) { -- cgit v1.2.3