support and use VkSubmitInfo semaphore signaling and waiting
diff --git a/layers/mem_tracker.cpp b/layers/mem_tracker.cpp
index 272bbc5..d1a2173 100644
--- a/layers/mem_tracker.cpp
+++ b/layers/mem_tracker.cpp
@@ -1163,6 +1163,31 @@
             pCBInfo->lastSubmittedFence = fence;
             pCBInfo->lastSubmittedQueue = queue;
         }
+
+        for (uint32_t i = 0; i < submit->waitSemCount; i++) {
+            VkSemaphore sem = submit->pWaitSemaphores[i];
+
+            if (semaphoreMap.find(sem.handle) != semaphoreMap.end()) {
+                if (semaphoreMap[sem.handle] != MEMTRACK_SEMAPHORE_STATE_SIGNALLED) {
+                    skipCall = log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SEMAPHORE, sem.handle,
+                            0, MEMTRACK_NONE, "SEMAPHORE",
+                            "vkQueueSubmit: Semaphore must be in signaled state before passing to pWaitSemaphores");
+                }
+                semaphoreMap[sem.handle] = MEMTRACK_SEMAPHORE_STATE_WAIT;
+            }
+        }
+        for (uint32_t i = 0; i < submit->signalSemCount; i++) {
+            VkSemaphore sem = submit->pWaitSemaphores[i];
+
+            if (semaphoreMap.find(sem.handle) != semaphoreMap.end()) {
+                if (semaphoreMap[sem.handle] != MEMTRACK_SEMAPHORE_STATE_UNSET) {
+                    skipCall = log_msg(mdd(queue), VK_DBG_REPORT_ERROR_BIT, VK_OBJECT_TYPE_SEMAPHORE, sem.handle,
+                            0, MEMTRACK_NONE, "SEMAPHORE",
+                            "vkQueueSubmit: Semaphore must not be currently signaled or in a wait state");
+                }
+                semaphoreMap[sem.handle] = MEMTRACK_SEMAPHORE_STATE_SIGNALLED;
+            }
+        }
     }
 
     loader_platform_thread_unlock_mutex(&globalLock);
@@ -1170,6 +1195,20 @@
         result = get_dispatch_table(mem_tracker_device_table_map, queue)->QueueSubmit(
             queue, submitCount, pSubmitInfo, fence);
     }
+
+    loader_platform_thread_lock_mutex(&globalLock);
+    for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) {
+        const VkSubmitInfo *submit = &pSubmitInfo[submit_idx];
+        for (uint32_t i = 0; i < submit->waitSemCount; i++) {
+            VkSemaphore sem = submit->pWaitSemaphores[i];
+
+            if (semaphoreMap.find(sem.handle) != semaphoreMap.end()) {
+                semaphoreMap[sem.handle] = MEMTRACK_SEMAPHORE_STATE_UNSET;
+            }
+        }
+    }
+    loader_platform_thread_unlock_mutex(&globalLock);
+
     return result;
 }