aboutsummaryrefslogtreecommitdiff
path: root/layers/mem_tracker.cpp
diff options
context:
space:
mode:
authorTobin Ehlis <tobin@lunarg.com>2015-09-14 13:25:57 -0600
committerTobin Ehlis <tobin@lunarg.com>2015-09-16 08:19:26 -0600
commit777a1f12448aebf40f56a36116849349baad376b (patch)
tree35f72c7de83e81d5f07f1ad17313e526f9a85e75 /layers/mem_tracker.cpp
parentda65f45418bbe9d60ed2df5ce301d55676c0a9a7 (diff)
downloadusermoji-777a1f12448aebf40f56a36116849349baad376b.tar.xz
layers: Migrate Fence checks from ObjectTracker to MemTracker
Diffstat (limited to 'layers/mem_tracker.cpp')
-rw-r--r--layers/mem_tracker.cpp31
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);