From 4f43c5957650e7a8d9f93c0a629e0a97f9043d55 Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Thu, 7 Jul 2016 16:47:10 -0600 Subject: [PATCH] layers: Set cmd buffer invalid on event destroy When an event is destroyed, set any cmd buffers that it was bound to to the CB_INVALID state. Also added getEventNode() helper and made use of it where appropriate. --- layers/core_validation.cpp | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 0ac409a..7ac018f 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -5048,10 +5048,10 @@ VKAPI_ATTR void VKAPI_CALL DestroyEvent(VkDevice device, VkEvent event, const Vk auto event_node = getEventNode(dev_data, event); if (event_node) { if (event_node->in_use.load()) { - skip_call |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast(event), __LINE__, DRAWSTATE_INVALID_EVENT, "DS", - "Cannot delete event 0x%" PRIx64 " which is in use by a command buffer.", reinterpret_cast(event)); + skip_call |= log_msg( + dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, + reinterpret_cast(event), __LINE__, DRAWSTATE_INVALID_EVENT, "DS", + "Cannot delete event 0x%" PRIx64 " which is in use by a command buffer.", reinterpret_cast(event)); } // Any bound cmd buffers are now invalid invalidateCommandBuffers(event_node->cb_bindings, @@ -7713,8 +7713,12 @@ CmdSetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags s if (pCB) { skip_call |= addCmd(dev_data, pCB, CMD_SETEVENT, "vkCmdSetEvent()"); skip_call |= insideRenderPass(dev_data, pCB, "vkCmdSetEvent"); - addCommandBufferBinding(&getEventNode(dev_data, event)->cb_bindings, - {reinterpret_cast(event), VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT}, pCB); + auto event_node = getEventNode(dev_data, event); + if (event_node) { + addCommandBufferBinding(&event_node->cb_bindings, + {reinterpret_cast(event), VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT}, pCB); + event_node->cb_bindings.insert(pCB); + } pCB->events.push_back(event); if (!pCB->waitedEvents.count(event)) { pCB->writeEventsBeforeWait.push_back(event); @@ -7737,8 +7741,12 @@ CmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event, VkPipelineStageFlags if (pCB) { skip_call |= addCmd(dev_data, pCB, CMD_RESETEVENT, "vkCmdResetEvent()"); skip_call |= insideRenderPass(dev_data, pCB, "vkCmdResetEvent"); - addCommandBufferBinding(&getEventNode(dev_data, event)->cb_bindings, - {reinterpret_cast(event), VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT}, pCB); + auto event_node = getEventNode(dev_data, event); + if (event_node) { + addCommandBufferBinding(&event_node->cb_bindings, + {reinterpret_cast(event), VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT}, pCB); + event_node->cb_bindings.insert(pCB); + } pCB->events.push_back(event); if (!pCB->waitedEvents.count(event)) { pCB->writeEventsBeforeWait.push_back(event); @@ -8132,8 +8140,13 @@ CmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent if (pCB) { auto firstEventIndex = pCB->events.size(); for (uint32_t i = 0; i < eventCount; ++i) { - addCommandBufferBinding(&getEventNode(dev_data, pEvents[i])->cb_bindings, - {reinterpret_cast(pEvents[i]), VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT}, pCB); + auto event_node = getEventNode(dev_data, pEvents[i]); + if (event_node) { + addCommandBufferBinding(&event_node->cb_bindings, + {reinterpret_cast(pEvents[i]), VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT}, + pCB); + event_node->cb_bindings.insert(pCB); + } pCB->waitedEvents.insert(pEvents[i]); pCB->events.push_back(pEvents[i]); } -- 2.7.4