aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 08dc5136..e799ad40 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -5302,17 +5302,33 @@ VKAPI_ATTR void VKAPI_CALL GetDeviceQueue(VkDevice device, uint32_t queueFamilyI
}
}
+static bool PreCallValidateQueueWaitIdle(layer_data *dev_data, VkQueue queue,
+ QUEUE_NODE **queue_state) {
+ *queue_state = getQueueNode(dev_data, queue);
+ return VerifyQueueStateToSeq(
+ dev_data, *queue_state,
+ (*queue_state)->seq + (*queue_state)->submissions.size());
+}
+
+static void PostCallRecordQueueWaitIdle(layer_data *dev_data,
+ QUEUE_NODE *queue_state) {
+ RetireWorkOnQueue(dev_data, queue_state,
+ queue_state->seq + queue_state->submissions.size());
+}
+
VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
layer_data *dev_data = get_my_data_ptr(get_dispatch_key(queue), layer_data_map);
- bool skip_call = false;
+ QUEUE_NODE *queue_state = nullptr;
std::unique_lock<std::mutex> lock(global_lock);
- auto pQueue = getQueueNode(dev_data, queue);
- skip_call |= VerifyQueueStateToSeq(dev_data, pQueue, pQueue->seq + pQueue->submissions.size());
- RetireWorkOnQueue(dev_data, pQueue, pQueue->seq + pQueue->submissions.size());
+ bool skip = PreCallValidateQueueWaitIdle(dev_data, queue, &queue_state);
lock.unlock();
- if (skip_call)
- return VK_ERROR_VALIDATION_FAILED_EXT;
+ if (skip) return VK_ERROR_VALIDATION_FAILED_EXT;
VkResult result = dev_data->dispatch_table.QueueWaitIdle(queue);
+ if (VK_SUCCESS == result) {
+ lock.lock();
+ PostCallRecordQueueWaitIdle(dev_data, queue_state);
+ lock.unlock();
+ }
return result;
}