diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-04-13 16:18:28 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-04-13 16:39:01 -0600 |
| commit | a82b9de2a98c3f65e40586747a9f9fb5486d0f04 (patch) | |
| tree | 5ee0ef4c052493462701897938cc9dcb1f303a33 /layers/core_validation.cpp | |
| parent | 3732cf72aa666873d2f31cbddf3a53e74efad2c8 (diff) | |
| download | usermoji-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.cpp | 18 |
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; } |
