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