diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-12-06 13:08:18 -0700 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-12-07 12:16:49 -0700 |
| commit | 78460c7e5e49485776b78a31d73c29cb335d9888 (patch) | |
| tree | 3e8806e9ad96322856ab0045d4c83c6e2edaf9cf /layers/core_validation.cpp | |
| parent | 38c0eea8b613517205732b29e8727978c4dd9cc8 (diff) | |
| download | usermoji-78460c7e5e49485776b78a31d73c29cb335d9888.tar.xz | |
layers:Refactor DeviceWaitIdle
Update DeviceWaitIdle in core_validation to use Pre/Post pattern.
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 27 |
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; } |
