diff options
| author | Tobin Ehlis <tobin@lunarg.com> | 2015-09-14 13:25:57 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobin@lunarg.com> | 2015-09-16 08:19:26 -0600 |
| commit | 777a1f12448aebf40f56a36116849349baad376b (patch) | |
| tree | 35f72c7de83e81d5f07f1ad17313e526f9a85e75 /layers/mem_tracker.cpp | |
| parent | da65f45418bbe9d60ed2df5ce301d55676c0a9a7 (diff) | |
| download | usermoji-777a1f12448aebf40f56a36116849349baad376b.tar.xz | |
layers: Migrate Fence checks from ObjectTracker to MemTracker
Diffstat (limited to 'layers/mem_tracker.cpp')
| -rw-r--r-- | layers/mem_tracker.cpp | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp index 6042f8e6..1373419c 100644 --- a/layers/mem_tracker.cpp +++ b/layers/mem_tracker.cpp @@ -2049,10 +2049,30 @@ VK_LAYER_EXPORT VkResult VKAPI vkResetFences( return result; } +static inline VkBool32 verifyFenceStatus(VkDevice device, VkFence fence, const char* apiCall) +{ + VkBool32 skipCall = VK_FALSE; + auto pFenceInfo = fenceMap.find(fence.handle); + if (pFenceInfo != fenceMap.end()) { + if (pFenceInfo->second.createInfo.flags & VK_FENCE_CREATE_SIGNALED_BIT) { + skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, fence.handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", + "%s specified fence %#" PRIxLEAST64 " already in SIGNALED state.", apiCall, fence.handle); + } + if (!pFenceInfo->second.queue) { // Checking status of unsubmitted fence + skipCall |= log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, fence.handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", + "%s called for fence %#" PRIxLEAST64 " which has not been submitted on a Queue.", apiCall, fence.handle); + } + } + return skipCall; +} + VK_LAYER_EXPORT VkResult VKAPI vkGetFenceStatus( VkDevice device, VkFence fence) { + VkBool32 skipCall = verifyFenceStatus(device, fence, "vkGetFenceStatus"); + if (skipCall) + return VK_ERROR_VALIDATION_FAILED; VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->GetFenceStatus(device, fence); if (VK_SUCCESS == result) { loader_platform_thread_lock_mutex(&globalLock); @@ -2069,16 +2089,13 @@ VK_LAYER_EXPORT VkResult VKAPI vkWaitForFences( VkBool32 waitAll, uint64_t timeout) { + VkBool32 skipCall = VK_FALSE; // Verify fence status of submitted fences for(uint32_t i = 0; i < fenceCount; i++) { - auto pFenceInfo = fenceMap.find(pFences[i].handle); - if (pFenceInfo != fenceMap.end()) { - if (pFenceInfo->second.createInfo.flags & VK_FENCE_CREATE_SIGNALED_BIT) { - log_msg(mdd(device), VK_DBG_REPORT_WARN_BIT, VK_OBJECT_TYPE_FENCE, pFences[i].handle, 0, MEMTRACK_INVALID_FENCE_STATE, "MEM", - "VkWaitForFences specified fence %#" PRIxLEAST64 " already in SIGNALED state.", pFences[i].handle); - } - } + skipCall |= verifyFenceStatus(device, pFences[i], "vkWaitForFences"); } + if (skipCall) + return VK_ERROR_VALIDATION_FAILED; VkResult result = get_dispatch_table(mem_tracker_device_table_map, device)->WaitForFences(device, fenceCount, pFences, waitAll, timeout); loader_platform_thread_lock_mutex(&globalLock); |
