return &it->second;
}
+EVENT_NODE *getEventNode(layer_data *dev_data, VkEvent event) {
+ auto it = dev_data->eventMap.find(event);
+ if (it == dev_data->eventMap.end()) {
+ return nullptr;
+ }
+ return &it->second;
+}
+
QUEUE_NODE *getQueueNode(layer_data *dev_data, VkQueue queue) {
auto it = dev_data->queueMap.find(queue);
if (it == dev_data->queueMap.end()) {
return "descriptor set";
case VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT:
return "buffer";
+ case VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT:
+ return "event";
default:
return "unknown";
}
}
}
for (auto event : pCB->events) {
- auto eventNode = my_data->eventMap.find(event);
- if (eventNode == my_data->eventMap.end()) {
+ auto event_node = getEventNode(my_data, event);
+ if (!event_node) {
skip_call |=
log_msg(my_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
reinterpret_cast<uint64_t &>(event), __LINE__, DRAWSTATE_INVALID_EVENT, "DS",
"Cannot submit cmd buffer using deleted event 0x%" PRIx64 ".", reinterpret_cast<uint64_t &>(event));
} else {
- eventNode->second.in_use.fetch_add(1);
+ event_node->in_use.fetch_add(1);
}
}
for (auto event : pCB->writeEventsBeforeWait) {
- auto eventNode = my_data->eventMap.find(event);
- eventNode->second.write_in_use++;
+ auto event_node = getEventNode(my_data, event);
+ if (event_node)
+ event_node->write_in_use++;
}
return skip_call;
}
layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
bool skip_call = false;
std::unique_lock<std::mutex> lock(global_lock);
- auto event_data = dev_data->eventMap.find(event);
- if (event_data != dev_data->eventMap.end()) {
- if (event_data->second.in_use.load()) {
+ auto event_node = getEventNode(dev_data, event);
+ if (event_node) {
+ if (event_node->in_use.load()) {
skip_call |= log_msg(
dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT,
reinterpret_cast<uint64_t &>(event), __LINE__, DRAWSTATE_INVALID_EVENT, "DS",
"Cannot delete event 0x%" PRIx64 " which is in use by a command buffer.", reinterpret_cast<uint64_t &>(event));
}
- dev_data->eventMap.erase(event_data);
}
lock.unlock();
if (!skip_call)
dev_data->device_dispatch_table->DestroyEvent(device, event, pAllocator);
- // TODO : Clean up any internal data structures using this obj.
+
+ if (event_node) {
+ // Any bound cmd buffers are now invalid
+ invalidateCommandBuffers(event_node->cb_bindings,
+ {reinterpret_cast<uint64_t &>(event), VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT});
+ dev_data->eventMap.erase(event);
+ }
}
VKAPI_ATTR void VKAPI_CALL
if (pCB) {
skip_call |= addCmd(dev_data, pCB, CMD_SETEVENT, "vkCmdSetEvent()");
skip_call |= insideRenderPass(dev_data, pCB, "vkCmdSetEvent");
+ auto event_node = getEventNode(dev_data, event);
+ if (event_node) {
+ event_node->cb_bindings.insert(pCB);
+ }
pCB->events.push_back(event);
if (!pCB->waitedEvents.count(event)) {
pCB->writeEventsBeforeWait.push_back(event);
if (pCB) {
skip_call |= addCmd(dev_data, pCB, CMD_RESETEVENT, "vkCmdResetEvent()");
skip_call |= insideRenderPass(dev_data, pCB, "vkCmdResetEvent");
+ auto event_node = getEventNode(dev_data, event);
+ if (event_node) {
+ event_node->cb_bindings.insert(pCB);
+ }
pCB->events.push_back(event);
if (!pCB->waitedEvents.count(event)) {
pCB->writeEventsBeforeWait.push_back(event);
if (event_data != queue_data->second.eventToStageMap.end()) {
stageMask |= event_data->second;
} else {
- auto global_event_data = dev_data->eventMap.find(event);
- if (global_event_data == dev_data->eventMap.end()) {
+ auto global_event_data = getEventNode(dev_data, event);
+ if (!global_event_data) {
skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT,
reinterpret_cast<const uint64_t &>(event), __LINE__, DRAWSTATE_INVALID_EVENT, "DS",
"Event 0x%" PRIx64 " cannot be waited on if it has never been set.",
reinterpret_cast<const uint64_t &>(event));
} else {
- stageMask |= global_event_data->second.stageMask;
+ stageMask |= global_event_data->stageMask;
}
}
}
if (pCB) {
auto firstEventIndex = pCB->events.size();
for (uint32_t i = 0; i < eventCount; ++i) {
+ auto event_node = getEventNode(dev_data, pEvents[i]);
+ if (event_node) {
+ event_node->cb_bindings.insert(pCB);
+ }
pCB->waitedEvents.insert(pEvents[i]);
pCB->events.push_back(pEvents[i]);
}
VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
std::unique_lock<std::mutex> lock(global_lock);
- auto event_node = dev_data->eventMap.find(event);
- if (event_node != dev_data->eventMap.end()) {
- event_node->second.needsSignaled = false;
- event_node->second.stageMask = VK_PIPELINE_STAGE_HOST_BIT;
- if (event_node->second.write_in_use) {
+ auto event_node = getEventNode(dev_data, event);
+ if (event_node) {
+ event_node->needsSignaled = false;
+ event_node->stageMask = VK_PIPELINE_STAGE_HOST_BIT;
+ if (event_node->write_in_use) {
skip_call |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT,
reinterpret_cast<const uint64_t &>(event), __LINE__, DRAWSTATE_QUEUE_FORWARD_PROGRESS, "DS",
"Cannot call vkSetEvent() on event 0x%" PRIxLEAST64 " that is already in use by a command buffer.",