diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-09-07 11:09:01 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-09-08 09:21:49 -0600 |
| commit | 31d9f4a475cdff6bd6d0a08cacacea57fb733dfa (patch) | |
| tree | 3d9030119c53babe92f7d5591114980c75a839a6 /layers/core_validation.cpp | |
| parent | de8cee535dc2d83e0fc0eda4418d7ba55e92d437 (diff) | |
| download | usermoji-31d9f4a475cdff6bd6d0a08cacacea57fb733dfa.tar.xz | |
layers: Update bound object increment and decrement functions
Unify the handling of in-use increment/decrement for QueryPool, Pipeline,
Image, Buffer, and Event objects.
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 111 |
1 files changed, 92 insertions, 19 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index 5d8ac64e..1fb8197e 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4493,7 +4493,7 @@ static bool ValidateCmdBufImageLayouts(layer_data *dev_data, GLOBAL_CB_NODE *pCB // Loop through bound objects and increment their in_use counts // For any unknown objects, flag an error -static bool ValidateAndIncrementBoundObjects(layer_data const *dev_data, GLOBAL_CB_NODE const *cb_node) { +static bool ValidateAndIncrementBoundObjects(layer_data *dev_data, GLOBAL_CB_NODE const *cb_node) { bool skip_call = false; for (auto obj : cb_node->object_bindings) { switch (obj.type) { @@ -4520,6 +4520,61 @@ static bool ValidateAndIncrementBoundObjects(layer_data const *dev_data, GLOBAL_ } break; } + case VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT: { + auto qp_node = getQueryPoolNode(dev_data, reinterpret_cast<VkQueryPool &>(obj.handle)); + if (!qp_node) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, + VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT, obj.handle, __LINE__, MEMTRACK_INVALID_OBJECT, + "DS", "Cannot submit cmd buffer using deleted query pool 0x%" PRIx64 ".", obj.handle); + } else { + qp_node->in_use.fetch_add(1); + } + break; + } + case VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT: { + auto pipe_node = getPipeline(dev_data, reinterpret_cast<VkPipeline &>(obj.handle)); + if (!pipe_node) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, + obj.handle, __LINE__, DRAWSTATE_INVALID_PIPELINE, "DS", + "Cannot submit cmd buffer using deleted pipeline 0x%" PRIx64 ".", obj.handle); + } else { + pipe_node->in_use.fetch_add(1); + } + break; + } + case VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT: { + auto buff_node = getBufferNode(dev_data, reinterpret_cast<VkBuffer &>(obj.handle)); + if (!buff_node) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, + obj.handle, __LINE__, DRAWSTATE_INVALID_BUFFER, "DS", + "Cannot submit cmd buffer using deleted buffer 0x%" PRIx64 ".", obj.handle); + } else { + buff_node->in_use.fetch_add(1); + } + break; + } + case VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT: { + auto image_node = getImageNode(dev_data, reinterpret_cast<VkImage &>(obj.handle)); + if (!image_node) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, + obj.handle, __LINE__, DRAWSTATE_INVALID_IMAGE, "DS", + "Cannot submit cmd buffer using deleted image 0x%" PRIx64 ".", obj.handle); + } else { + image_node->in_use.fetch_add(1); + } + break; + } + case VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT: { + auto event_node = getEventNode(dev_data, reinterpret_cast<VkEvent &>(obj.handle)); + if (!event_node) { + skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, + obj.handle, __LINE__, DRAWSTATE_INVALID_EVENT, "DS", + "Cannot submit cmd buffer using deleted event 0x%" PRIx64 ".", obj.handle); + } else { + event_node->in_use.fetch_add(1); + } + break; + } default: // TODO : Merge handling of other objects types into this code break; @@ -4552,17 +4607,6 @@ static bool validateAndIncrementResources(layer_data *dev_data, GLOBAL_CB_NODE * } } } - for (auto event : cb_node->events) { - auto event_node = getEventNode(dev_data, event); - if (!event_node) { - skip_call |= - log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, - reinterpret_cast<uint64_t &>(event), __LINE__, DRAWSTATE_INVALID_EVENT, "DS", - "Cannot submit cmd buffer using deleted event 0x%" PRIx64 ".", reinterpret_cast<uint64_t &>(event)); - } else { - event_node->in_use.fetch_add(1); - } - } for (auto event : cb_node->writeEventsBeforeWait) { auto event_node = getEventNode(dev_data, event); if (event_node) @@ -4605,7 +4649,7 @@ static inline void removeInFlightCmdBuffer(layer_data *dev_data, VkCommandBuffer } // Decrement in-use count for objects bound to command buffer -static void DecrementBoundResources(layer_data const *dev_data, GLOBAL_CB_NODE const *cb_node) { +static void DecrementBoundResources(layer_data *dev_data, GLOBAL_CB_NODE const *cb_node) { for (auto obj : cb_node->object_bindings) { switch (obj.type) { case VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT: { @@ -4622,6 +4666,41 @@ static void DecrementBoundResources(layer_data const *dev_data, GLOBAL_CB_NODE c } break; } + case VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT: { + auto qp_node = getQueryPoolNode(dev_data, reinterpret_cast<VkQueryPool &>(obj.handle)); + if (qp_node) { + qp_node->in_use.fetch_sub(1); + } + break; + } + case VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT: { + auto pipe_node = getPipeline(dev_data, reinterpret_cast<VkPipeline &>(obj.handle)); + if (pipe_node) { + pipe_node->in_use.fetch_sub(1); + } + break; + } + case VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT: { + auto buff_node = getBufferNode(dev_data, reinterpret_cast<VkBuffer &>(obj.handle)); + if (buff_node) { + buff_node->in_use.fetch_sub(1); + } + break; + } + case VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT: { + auto image_node = getImageNode(dev_data, reinterpret_cast<VkImage &>(obj.handle)); + if (image_node) { + image_node->in_use.fetch_sub(1); + } + break; + } + case VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT: { + auto event_node = getEventNode(dev_data, reinterpret_cast<VkEvent &>(obj.handle)); + if (event_node) { + event_node->in_use.fetch_sub(1); + } + break; + } default: // TODO : Merge handling of other objects types into this code break; @@ -4662,12 +4741,6 @@ static bool RetireWorkOnQueue(layer_data *dev_data, QUEUE_NODE *pQueue, uint64_t } } } - for (auto event : cb_node->events) { - auto eventNode = dev_data->eventMap.find(event); - if (eventNode != dev_data->eventMap.end()) { - eventNode->second.in_use.fetch_sub(1); - } - } for (auto event : cb_node->writeEventsBeforeWait) { auto eventNode = dev_data->eventMap.find(event); if (eventNode != dev_data->eventMap.end()) { |
