aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2016-04-13 16:18:28 -0600
committerTobin Ehlis <tobine@google.com>2016-04-13 16:39:01 -0600
commita82b9de2a98c3f65e40586747a9f9fb5486d0f04 (patch)
tree5ee0ef4c052493462701897938cc9dcb1f303a33 /layers/core_validation.cpp
parent3732cf72aa666873d2f31cbddf3a53e74efad2c8 (diff)
downloadusermoji-a82b9de2a98c3f65e40586747a9f9fb5486d0f04.tar.xz
layers: Validate correct vkSetEvent() use
Make sure vkSetEvent() is not called on an event that's in use by and in-flight cmd buffer. Such use violates queue forward progress.
Diffstat (limited to 'layers/core_validation.cpp')
-rw-r--r--layers/core_validation.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp
index 65f8a1ca..e6b5b7a7 100644
--- a/layers/core_validation.cpp
+++ b/layers/core_validation.cpp
@@ -10064,10 +10064,21 @@ VKAPI_ATTR VkResult VKAPI_CALL vkBindImageMemory(VkDevice device, VkImage image,
}
VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
+ bool skip_call = false;
+ VkResult result = VK_ERROR_VALIDATION_FAILED_EXT;
layer_data *dev_data = get_my_data_ptr(get_dispatch_key(device), layer_data_map);
loader_platform_thread_lock_mutex(&globalLock);
- dev_data->eventMap[event].needsSignaled = false;
- dev_data->eventMap[event].stageMask = VK_PIPELINE_STAGE_HOST_BIT;
+ 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.in_use.load()) {
+ 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 %" PRIxLEAST64 " that is already in use by a command buffer.",
+ reinterpret_cast<const uint64_t &>(event));
+ }
+ }
loader_platform_thread_unlock_mutex(&globalLock);
// Host setting event is visible to all queues immediately so update stageMask for any queue that's seen this event
// TODO : For correctness this needs separate fix to verify that app doesn't make incorrect assumptions about the
@@ -10078,7 +10089,8 @@ VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
event_entry->second |= VK_PIPELINE_STAGE_HOST_BIT;
}
}
- VkResult result = dev_data->device_dispatch_table->SetEvent(device, event);
+ if (!skip_call)
+ result = dev_data->device_dispatch_table->SetEvent(device, event);
return result;
}