syncval: Adding race hazard support

Add support for detecting asynchronous access "race" hazards.

Change-Id: I9a2905fe4002551396532415baffbe0d46d5d76d
diff --git a/layers/synchronization_validation.cpp b/layers/synchronization_validation.cpp
index ac97852..077d382 100644
--- a/layers/synchronization_validation.cpp
+++ b/layers/synchronization_validation.cpp
@@ -24,7 +24,7 @@
 static const char *string_SyncHazardVUID(SyncHazard hazard) {
     switch (hazard) {
         case SyncHazard::NONE:
-            return "SYNC-NONE";
+            return "SYNC-HAZARD-NONE";
             break;
         case SyncHazard::READ_AFTER_WRITE:
             return "SYNC-HAZARD-READ_AFTER_WRITE";
@@ -35,6 +35,15 @@
         case SyncHazard::WRITE_AFTER_WRITE:
             return "SYNC-HAZARD-WRITE_AFTER_WRITE";
             break;
+        case SyncHazard::READ_RACING_WRITE:
+            return "SYNC-HAZARD-READ-RACING-WRITE";
+            break;
+        case SyncHazard::WRITE_RACING_WRITE:
+            return "SYNC-HAZARD-WRITE-RACING-WRITE";
+            break;
+        case SyncHazard::WRITE_RACING_READ:
+            return "SYNC-HAZARD-WRITE-RACING-READ";
+            break;
         default:
             assert(0);
     }
@@ -55,6 +64,15 @@
         case SyncHazard::WRITE_AFTER_WRITE:
             return "WRITE_AFTER_WRITE";
             break;
+        case SyncHazard::READ_RACING_WRITE:
+            return "READ_RACING_WRITE";
+            break;
+        case SyncHazard::WRITE_RACING_WRITE:
+            return "WRITE_RACING_WRITE";
+            break;
+        case SyncHazard::WRITE_RACING_READ:
+            return "WRITE_RACING_READ";
+            break;
         default:
             assert(0);
     }
@@ -346,6 +364,24 @@
     return hazard;
 }
 
+// Asynchronous Hazards occur between subpasses with no connection through the DAG
+HazardResult ResourceAccessState::DetectAsynchronousHazard(SyncStageAccessIndex usage_index) const {
+    HazardResult hazard;
+    auto usage = FlagBit(usage_index);
+    if (IsRead(usage)) {
+        if (last_write != 0) {
+            hazard.Set(READ_RACING_WRITE, write_tag);
+        }
+    } else {
+        if (last_write != 0) {
+            hazard.Set(WRITE_RACING_WRITE, write_tag);
+        } else if (last_read_count > 0) {
+            hazard.Set(WRITE_RACING_READ, last_reads[0].tag);
+        }
+    }
+    return hazard;
+}
+
 HazardResult ResourceAccessState::DetectBarrierHazard(SyncStageAccessIndex usage_index, VkPipelineStageFlags src_exec_scope,
                                                       SyncStageAccessFlags src_access_scope) const {
     // Only supporting image layout transitions for now