syncval: Store CMD_TYPE in SyncOp
Add the CMD_TYPE of the command to the SyncOpBase for use in validation
messages, tagging, and command variant differences.
Change-Id: Ic7a246f8f9479bab24c7d0320f1810c31b440f3c
diff --git a/layers/synchronization_validation.cpp b/layers/synchronization_validation.cpp
index b6d5806..b79c9da 100644
--- a/layers/synchronization_validation.cpp
+++ b/layers/synchronization_validation.cpp
@@ -3341,9 +3341,10 @@
assert(cb_access_context);
if (!cb_access_context) return skip;
- SyncOpPipelineBarrier pipeline_barrier(*this, cb_access_context->GetQueueFlags(), srcStageMask, dstStageMask, dependencyFlags,
- memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
- imageMemoryBarrierCount, pImageMemoryBarriers);
+ SyncOpPipelineBarrier pipeline_barrier(CMD_PIPELINEBARRIER, *this, cb_access_context->GetQueueFlags(), srcStageMask,
+ dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
+ bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount,
+ pImageMemoryBarriers);
skip = pipeline_barrier.Validate(*cb_access_context);
return skip;
}
@@ -3359,10 +3360,11 @@
assert(cb_access_context);
if (!cb_access_context) return;
- SyncOpPipelineBarrier pipeline_barrier(*this, cb_access_context->GetQueueFlags(), srcStageMask, dstStageMask, dependencyFlags,
- memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
- imageMemoryBarrierCount, pImageMemoryBarriers);
- pipeline_barrier.Record(cb_access_context, cb_access_context->NextCommandTag(CMD_PIPELINEBARRIER));
+ SyncOpPipelineBarrier pipeline_barrier(CMD_PIPELINEBARRIER, *this, cb_access_context->GetQueueFlags(), srcStageMask,
+ dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
+ bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount,
+ pImageMemoryBarriers);
+ pipeline_barrier.Record(cb_access_context);
}
void SyncValidator::PostCallRecordCreateDevice(VkPhysicalDevice gpu, const VkDeviceCreateInfo *pCreateInfo,
@@ -4812,7 +4814,7 @@
assert(cb_context);
if (!cb_context) return skip;
- SyncOpSetEvent set_event_op(*this, cb_context->GetQueueFlags(), event, stageMask);
+ SyncOpSetEvent set_event_op(CMD_SETEVENT, *this, cb_context->GetQueueFlags(), event, stageMask);
return set_event_op.Validate(*cb_context);
}
@@ -4821,9 +4823,8 @@
auto *cb_context = GetAccessContext(commandBuffer);
assert(cb_context);
if (!cb_context) return;
- SyncOpSetEvent set_event_op(*this, cb_context->GetQueueFlags(), event, stageMask);
- const auto tag = cb_context->NextCommandTag(CMD_SETEVENT);
- set_event_op.Record(cb_context, tag);
+ SyncOpSetEvent set_event_op(CMD_SETEVENT, *this, cb_context->GetQueueFlags(), event, stageMask);
+ set_event_op.Record(cb_context);
}
bool SyncValidator::PreCallValidateCmdResetEvent(VkCommandBuffer commandBuffer, VkEvent event,
@@ -4833,7 +4834,7 @@
assert(cb_context);
if (!cb_context) return skip;
- SyncOpResetEvent reset_event_op(*this, cb_context->GetQueueFlags(), event, stageMask);
+ SyncOpResetEvent reset_event_op(CMD_RESETEVENT, *this, cb_context->GetQueueFlags(), event, stageMask);
return reset_event_op.Validate(*cb_context);
}
@@ -4843,9 +4844,8 @@
assert(cb_context);
if (!cb_context) return;
- const auto tag = cb_context->NextCommandTag(CMD_RESETEVENT);
- SyncOpResetEvent reset_event_op(*this, cb_context->GetQueueFlags(), event, stageMask);
- reset_event_op.Record(cb_context, tag);
+ SyncOpResetEvent reset_event_op(CMD_RESETEVENT, *this, cb_context->GetQueueFlags(), event, stageMask);
+ reset_event_op.Record(cb_context);
}
bool SyncValidator::PreCallValidateCmdWaitEvents(VkCommandBuffer commandBuffer, uint32_t eventCount, const VkEvent *pEvents,
@@ -4860,9 +4860,9 @@
assert(cb_context);
if (!cb_context) return skip;
- SyncOpWaitEvents wait_events_op(*this, cb_context->GetQueueFlags(), eventCount, pEvents, srcStageMask, dstStageMask,
- memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
- imageMemoryBarrierCount, pImageMemoryBarriers);
+ SyncOpWaitEvents wait_events_op(CMD_WAITEVENTS, *this, cb_context->GetQueueFlags(), eventCount, pEvents, srcStageMask,
+ dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
+ pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
return wait_events_op.Validate(*cb_context);
}
@@ -4881,11 +4881,10 @@
assert(cb_context);
if (!cb_context) return;
- const auto tag = cb_context->NextCommandTag(CMD_WAITEVENTS);
- SyncOpWaitEvents wait_events_op(*this, cb_context->GetQueueFlags(), eventCount, pEvents, srcStageMask, dstStageMask,
- memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers,
- imageMemoryBarrierCount, pImageMemoryBarriers);
- return wait_events_op.Record(cb_context, tag);
+ SyncOpWaitEvents wait_events_op(CMD_WAITEVENTS, *this, cb_context->GetQueueFlags(), eventCount, pEvents, srcStageMask,
+ dstStageMask, memoryBarrierCount, pMemoryBarriers, bufferMemoryBarrierCount,
+ pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers);
+ return wait_events_op.Record(cb_context);
}
void SyncEventState::ResetFirstScope() {
@@ -4917,12 +4916,14 @@
return has_barrier;
}
-SyncOpBarriers::SyncOpBarriers(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkPipelineStageFlags srcStageMask,
- VkPipelineStageFlags dstStageMask, VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
+SyncOpBarriers::SyncOpBarriers(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
+ VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
+ VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
const VkImageMemoryBarrier *pImageMemoryBarriers)
- : dependency_flags_(dependencyFlags),
+ : SyncOpBase(cmd),
+ dependency_flags_(dependencyFlags),
src_exec_scope_(SyncExecScope::MakeSrc(queue_flags, srcStageMask)),
dst_exec_scope_(SyncExecScope::MakeDst(queue_flags, dstStageMask)) {
// Translate the API parameters into structures SyncVal understands directly, and dehandle for safer/faster replay.
@@ -4933,13 +4934,13 @@
pImageMemoryBarriers);
}
-SyncOpPipelineBarrier::SyncOpPipelineBarrier(const SyncValidator &sync_state, VkQueueFlags queue_flags,
+SyncOpPipelineBarrier::SyncOpPipelineBarrier(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags,
VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
VkDependencyFlags dependencyFlags, uint32_t memoryBarrierCount,
const VkMemoryBarrier *pMemoryBarriers, uint32_t bufferMemoryBarrierCount,
const VkBufferMemoryBarrier *pBufferMemoryBarriers, uint32_t imageMemoryBarrierCount,
const VkImageMemoryBarrier *pImageMemoryBarriers)
- : SyncOpBarriers(sync_state, queue_flags, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
+ : SyncOpBarriers(cmd, sync_state, queue_flags, srcStageMask, dstStageMask, dependencyFlags, memoryBarrierCount, pMemoryBarriers,
bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount, pImageMemoryBarriers) {}
bool SyncOpPipelineBarrier::Validate(const CommandBufferAccessContext &cb_context) const {
@@ -5030,9 +5031,10 @@
}
}
-void SyncOpPipelineBarrier::Record(CommandBufferAccessContext *cb_context, const ResourceUsageTag &tag) const {
+void SyncOpPipelineBarrier::Record(CommandBufferAccessContext *cb_context) const {
SyncOpPipelineBarrierFunctorFactory factory;
auto *access_context = cb_context->GetCurrentAccessContext();
+ const auto tag = cb_context->NextCommandTag(cmd_);
ApplyBarriers(buffer_memory_barriers_, factory, tag, access_context);
ApplyBarriers(image_memory_barriers_, factory, tag, access_context);
ApplyGlobalBarriers(memory_barriers_, factory, tag, access_context);
@@ -5091,29 +5093,27 @@
}
}
-SyncOpWaitEvents::SyncOpWaitEvents(const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
+SyncOpWaitEvents::SyncOpWaitEvents(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, uint32_t eventCount,
const VkEvent *pEvents, VkPipelineStageFlags srcStageMask, VkPipelineStageFlags dstStageMask,
uint32_t memoryBarrierCount, const VkMemoryBarrier *pMemoryBarriers,
uint32_t bufferMemoryBarrierCount, const VkBufferMemoryBarrier *pBufferMemoryBarriers,
uint32_t imageMemoryBarrierCount, const VkImageMemoryBarrier *pImageMemoryBarriers)
- : SyncOpBarriers(sync_state, queue_flags, srcStageMask, dstStageMask, VkDependencyFlags(0U), memoryBarrierCount,
+ : SyncOpBarriers(cmd, sync_state, queue_flags, srcStageMask, dstStageMask, VkDependencyFlags(0U), memoryBarrierCount,
pMemoryBarriers, bufferMemoryBarrierCount, pBufferMemoryBarriers, imageMemoryBarrierCount,
pImageMemoryBarriers) {
MakeEventsList(sync_state, eventCount, pEvents);
}
bool SyncOpWaitEvents::Validate(const CommandBufferAccessContext &cb_context) const {
- const auto cmd = CMD_WAITEVENTS;
const char *const ignored = "Wait operation is ignored for this event.";
bool skip = false;
const auto &sync_state = cb_context.GetSyncState();
const auto command_buffer_handle = cb_context.GetCBState().commandBuffer;
if (src_exec_scope_.mask_param & VK_PIPELINE_STAGE_HOST_BIT) {
- const char *const cmd_name = CommandTypeString(cmd);
const char *const vuid = "SYNC-vkCmdWaitEvents-hostevent-unsupported";
skip = sync_state.LogInfo(command_buffer_handle, vuid,
- "%s, srcStageMask includes %s, unsupported by synchronization validaton.", cmd_name,
+ "%s, srcStageMask includes %s, unsupported by synchronization validaton.", CmdName(),
string_VkPipelineStageFlagBits(VK_PIPELINE_STAGE_HOST_BIT), ignored);
}
@@ -5139,37 +5139,37 @@
if (ignore_reason) {
switch (ignore_reason) {
case SyncEventState::ResetWaitRace: {
- const char *const cmd_name = CommandTypeString(cmd);
const char *const vuid = "SYNC-vkCmdWaitEvents-missingbarrier-reset";
const char *const message =
"%s: %s %s operation following %s without intervening execution barrier, may cause race condition. %s";
- skip |= sync_state.LogError(event, vuid, message, cmd_name, sync_state.report_data->FormatHandle(event).c_str(),
- cmd_name, CommandTypeString(sync_event->last_command), ignored);
+ skip |=
+ sync_state.LogError(event, vuid, message, CmdName(), sync_state.report_data->FormatHandle(event).c_str(),
+ CmdName(), CommandTypeString(sync_event->last_command), ignored);
break;
}
case SyncEventState::SetRace: {
// Issue error message that Wait is waiting on an signal subject to race condition, and is thus ignored for this
// event
- const char *const cmd_name = CommandTypeString(cmd);
const char *const vuid = "SYNC-vkCmdWaitEvents-unsynchronized-setops";
const char *const message =
"%s: %s Unsychronized %s calls result in race conditions w.r.t. event signalling, %s %s";
const char *const reason = "First synchronization scope is undefined.";
- skip |= sync_state.LogError(event, vuid, message, cmd_name, sync_state.report_data->FormatHandle(event).c_str(),
- CommandTypeString(sync_event->last_command), reason, ignored);
+ skip |=
+ sync_state.LogError(event, vuid, message, CmdName(), sync_state.report_data->FormatHandle(event).c_str(),
+ CommandTypeString(sync_event->last_command), reason, ignored);
break;
}
case SyncEventState::MissingStageBits: {
const VkPipelineStageFlags missing_bits = sync_event->scope.mask_param & ~src_exec_scope_.mask_param;
// Issue error message that event waited for is not in wait events scope
- const char *const cmd_name = CommandTypeString(cmd);
const char *const vuid = "VUID-vkCmdWaitEvents-srcStageMask-01158";
const char *const message =
"%s: %s stageMask 0x%" PRIx32 " includes bits not present in srcStageMask 0x%" PRIx32
". Bits missing from srcStageMask %s. %s";
- skip |= sync_state.LogError(event, vuid, message, cmd_name, sync_state.report_data->FormatHandle(event).c_str(),
- sync_event->scope.mask_param, src_exec_scope_.mask_param,
- string_VkPipelineStageFlags(missing_bits).c_str(), ignored);
+ skip |=
+ sync_state.LogError(event, vuid, message, CmdName(), sync_state.report_data->FormatHandle(event).c_str(),
+ sync_event->scope.mask_param, src_exec_scope_.mask_param,
+ string_VkPipelineStageFlags(missing_bits).c_str(), ignored);
break;
}
default:
@@ -5188,9 +5188,8 @@
context->DetectImageBarrierHazard(*image_state, sync_event->scope.exec_scope, src_access_scope,
subresource_range, *sync_event, AccessContext::DetectOptions::kDetectAll);
if (hazard.hazard) {
- const char *const cmd_name = CommandTypeString(cmd);
skip |= sync_state.LogError(image_state->image, string_SyncHazardVUID(hazard.hazard),
- "%s: Hazard %s for image barrier %" PRIu32 " %s. Access info %s.", cmd_name,
+ "%s: Hazard %s for image barrier %" PRIu32 " %s. Access info %s.", CmdName(),
string_SyncHazard(hazard.hazard), image_memory_barrier.index,
sync_state.report_data->FormatHandle(image_state->image).c_str(),
cb_context.FormatUsage(hazard).c_str());
@@ -5204,16 +5203,15 @@
const auto extra_stage_bits = (src_exec_scope_.mask_param & ~VK_PIPELINE_STAGE_HOST_BIT) & ~event_stage_masks;
if (extra_stage_bits) {
// Issue error message that event waited for is not in wait events scope
- const char *const cmd_name = CommandTypeString(cmd);
const char *const vuid = "VUID-vkCmdWaitEvents-srcStageMask-01158";
const char *const message =
"%s: srcStageMask 0x%" PRIx32 " contains stages not present in pEvents stageMask. Extra stages are %s.%s";
if (events_not_found) {
- skip |= sync_state.LogInfo(command_buffer_handle, vuid, message, cmd_name, src_exec_scope_.mask_param,
+ skip |= sync_state.LogInfo(command_buffer_handle, vuid, message, CmdName(), src_exec_scope_.mask_param,
string_VkPipelineStageFlags(extra_stage_bits).c_str(),
" vkCmdSetEvent may be in previously submitted command buffer.");
} else {
- skip |= sync_state.LogError(command_buffer_handle, vuid, message, cmd_name, src_exec_scope_.mask_param,
+ skip |= sync_state.LogError(command_buffer_handle, vuid, message, CmdName(), src_exec_scope_.mask_param,
string_VkPipelineStageFlags(extra_stage_bits).c_str(), "");
}
}
@@ -5272,7 +5270,8 @@
SyncEventState *sync_event;
};
-void SyncOpWaitEvents::Record(CommandBufferAccessContext *cb_context, const ResourceUsageTag &tag) const {
+void SyncOpWaitEvents::Record(CommandBufferAccessContext *cb_context) const {
+ const auto tag = cb_context->NextCommandTag(cmd_);
auto *access_context = cb_context->GetCurrentAccessContext();
assert(access_context);
if (!access_context) return;
@@ -5325,12 +5324,13 @@
}
}
-SyncOpResetEvent::SyncOpResetEvent(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
+SyncOpResetEvent::SyncOpResetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
VkPipelineStageFlags stageMask)
- : event_(sync_state.GetShared<EVENT_STATE>(event)), exec_scope_(SyncExecScope::MakeSrc(queue_flags, stageMask)) {}
+ : SyncOpBase(cmd),
+ event_(sync_state.GetShared<EVENT_STATE>(event)),
+ exec_scope_(SyncExecScope::MakeSrc(queue_flags, stageMask)) {}
bool SyncOpResetEvent::Validate(const CommandBufferAccessContext &cb_context) const {
- const auto cmd = CMD_RESETEVENT;
auto *events_context = cb_context.GetCurrentEventsContext();
assert(events_context);
bool skip = false;
@@ -5362,18 +5362,15 @@
break;
}
if (vuid) {
- const char *const cmd_name = CommandTypeString(cmd);
- skip |= sync_state.LogError(event_->event, vuid, message, cmd_name,
- sync_state.report_data->FormatHandle(event_->event).c_str(), cmd_name,
+ skip |= sync_state.LogError(event_->event, vuid, message, CmdName(),
+ sync_state.report_data->FormatHandle(event_->event).c_str(), CmdName(),
CommandTypeString(sync_event->last_command));
}
}
return skip;
}
-void SyncOpResetEvent::Record(CommandBufferAccessContext *cb_context, const ResourceUsageTag &tag) const {
- const auto cmd = CMD_RESETEVENT;
-
+void SyncOpResetEvent::Record(CommandBufferAccessContext *cb_context) const {
auto *events_context = cb_context->GetCurrentEventsContext();
assert(events_context);
if (!events_context) return;
@@ -5382,19 +5379,20 @@
if (!sync_event) return; // Core, Lifetimes, or Param check needs to catch invalid events.
// Update the event state
- sync_event->last_command = cmd;
+ sync_event->last_command = cmd_;
sync_event->unsynchronized_set = CMD_NONE;
sync_event->ResetFirstScope();
sync_event->barriers = 0U;
}
-SyncOpSetEvent::SyncOpSetEvent(const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
+SyncOpSetEvent::SyncOpSetEvent(CMD_TYPE cmd, const SyncValidator &sync_state, VkQueueFlags queue_flags, VkEvent event,
VkPipelineStageFlags stageMask)
- : event_(sync_state.GetShared<EVENT_STATE>(event)), src_exec_scope_(SyncExecScope::MakeSrc(queue_flags, stageMask)) {}
+ : SyncOpBase(cmd),
+ event_(sync_state.GetShared<EVENT_STATE>(event)),
+ src_exec_scope_(SyncExecScope::MakeSrc(queue_flags, stageMask)) {}
bool SyncOpSetEvent::Validate(const CommandBufferAccessContext &cb_context) const {
// I'll put this here just in case we need to pass this in for future extension support
- const auto cmd = CMD_SETEVENT;
bool skip = false;
const auto &sync_state = cb_context.GetSyncState();
@@ -5437,9 +5435,8 @@
}
if (vuid) {
assert(nullptr != message);
- const char *const cmd_name = CommandTypeString(cmd);
- skip |= sync_state.LogError(event_->event, vuid, message, cmd_name,
- sync_state.report_data->FormatHandle(event_->event).c_str(), cmd_name,
+ skip |= sync_state.LogError(event_->event, vuid, message, CmdName(),
+ sync_state.report_data->FormatHandle(event_->event).c_str(), CmdName(),
CommandTypeString(sync_event->last_command));
}
}
@@ -5447,7 +5444,8 @@
return skip;
}
-void SyncOpSetEvent::Record(CommandBufferAccessContext *cb_context, const ResourceUsageTag &tag) const {
+void SyncOpSetEvent::Record(CommandBufferAccessContext *cb_context) const {
+ const auto tag = cb_context->NextCommandTag(cmd_);
auto *events_context = cb_context->GetCurrentEventsContext();
auto *access_context = cb_context->GetCurrentAccessContext();
assert(events_context);