layers: Migrate Fence checks from ObjectTracker to MemTracker
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 6042f8e..1373419 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -2049,10 +2049,30 @@
     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 @@
     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);