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.cpp27
1 files changed, 21 insertions, 6 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 9d199f3e..08dc5136 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -5316,18 +5316,33 @@ VKAPI_ATTR VkResult VKAPI_CALL QueueWaitIdle(VkQueue queue) {
return result;
}
+static bool PreCallValidateDeviceWaitIdle(layer_data *dev_data) {
+ bool skip = false;
+ for (auto &queue : dev_data->queueMap) {
+ skip |= VerifyQueueStateToSeq(dev_data, &queue.second, queue.second.seq + queue.second.submissions.size());
+ }
+ return skip;
+}
+
+static void PostCallRecordDeviceWaitIdle(layer_data *dev_data) {
+ for (auto &queue : dev_data->queueMap) {
+ RetireWorkOnQueue(dev_data, &queue.second, queue.second.seq + queue.second.submissions.size());
+ }
+}
+
VKAPI_ATTR VkResult VKAPI_CALL DeviceWaitIdle(VkDevice device) {
- bool skip_call = false;
layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
std::unique_lock<std::mutex> lock(global_lock);
- for (auto & queue : dev_data->queueMap) {
- skip_call |= VerifyQueueStateToSeq(dev_data, &queue.second, queue.second.seq + queue.second.submissions.size());
- RetireWorkOnQueue(dev_data, &queue.second, queue.second.seq + queue.second.submissions.size());
- }
+ bool skip = PreCallValidateDeviceWaitIdle(dev_data);
lock.unlock();
- if (skip_call)
+ if (skip)
return VK_ERROR_VALIDATION_FAILED_EXT;
VkResult result = dev_data->dispatch_table.DeviceWaitIdle(device);
+ if (VK_SUCCESS == result) {
+ lock.lock();
+ PostCallRecordDeviceWaitIdle(dev_data);
+ lock.unlock();
+ }
return result;
}