layers: GH241 vkSetEvent should affect queue stageMasks
authorTobin Ehlis <tobine@google.com>
Thu, 7 Apr 2016 17:35:46 +0000 (11:35 -0600)
committerTobin Ehlis <tobine@google.com>
Thu, 7 Apr 2016 20:56:53 +0000 (14:56 -0600)
vkSetEvent may occur asynchronously from cmd buffer execution
and the results of vkSetEvent should be immediately visible
across all queues of a device.

This fix will update any event that a queue has seen so that
its VK_PIPELINE_STAGE_HOST_BIT is set at vkSetEvent() time.

layers/core_validation.cpp

index 13e3845..f8f1e78 100644 (file)
@@ -10234,6 +10234,15 @@ VKAPI_ATTR VkResult VKAPI_CALL vkSetEvent(VkDevice device, VkEvent event) {
     dev_data->eventMap[event].needsSignaled = false;
     dev_data->eventMap[event].stageMask = VK_PIPELINE_STAGE_HOST_BIT;
     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
+    // ordering of this command in relation to vkCmd[Set|Reset]Events (see GH297)
+    for (auto queue_data : dev_data->queueMap) {
+        auto event_entry = queue_data.second.eventToStageMap.find(event);
+        if (event_entry != queue_data.second.eventToStageMap.end()) {
+            event_entry->second |= VK_PIPELINE_STAGE_HOST_BIT;
+        }
+    }
     VkResult result = dev_data->device_dispatch_table->SetEvent(device, event);
     return result;
 }