diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-05-10 12:09:30 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-05-10 16:41:39 -0600 |
| commit | f2917409c02b4ea197348b7abfe30f22892c9438 (patch) | |
| tree | 578711fa0d8f499edb630e79e5f688d2bd4d7d30 /layers/core_validation.cpp | |
| parent | 245bf8c1f43bf8cd601ae81d41701a99928b5cfa (diff) | |
| download | usermoji-f2917409c02b4ea197348b7abfe30f22892c9438.tar.xz | |
layers: Update fence to track all queues associated with it
Semaphore's can create cross-queue dependencies between fences.
This change updates the FENCE_NODE object to have an unordered_set
of all queues that a fence is tied to instead of just tracking the
last queue on which a fence has been submitted.
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index f1f2f5fb..78ede930 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4265,12 +4265,14 @@ static bool decrementResources(layer_data *my_data, uint32_t fenceCount, const V fence_data->second.priorFences.clear(); } for (auto fence_pair : fence_pairs) { - auto queue_pair = my_data->queueMap.find(fence_pair.second->queue); - if (queue_pair != my_data->queueMap.end()) { - auto last_fence_data = - std::find(queue_pair->second.lastFences.begin(), queue_pair->second.lastFences.end(), fence_pair.first); - if (last_fence_data != queue_pair->second.lastFences.end()) - queue_pair->second.lastFences.erase(last_fence_data); + for (auto queue : fence_pair.second->queues) { + auto queue_pair = my_data->queueMap.find(queue); + if (queue_pair != my_data->queueMap.end()) { + auto last_fence_data = + std::find(queue_pair->second.lastFences.begin(), queue_pair->second.lastFences.end(), fence_pair.first); + if (last_fence_data != queue_pair->second.lastFences.end()) + queue_pair->second.lastFences.erase(last_fence_data); + } } } return skip_call; @@ -4307,6 +4309,10 @@ static void updateTrackedCommandBuffers(layer_data *dev_data, VkQueue queue, VkQ } for (auto fenceInner : other_queue_data->second.lastFences) { queue_data->second.lastFences.push_back(fenceInner); + auto fence_node = dev_data->fenceMap.find(fenceInner); + if (fence_node != dev_data->fenceMap.end()) { + fence_node->second.queues.insert(other_queue_data->first); + } } if (fence != VK_NULL_HANDLE) { auto fence_data = dev_data->fenceMap.find(fence); @@ -4357,7 +4363,7 @@ static void trackCommandBuffers(layer_data *my_data, VkQueue queue, uint32_t sub } fence_data->second.priorFences = prior_fences; fence_data->second.needsSignaled = true; - fence_data->second.queue = queue; + fence_data->second.queues.insert(queue); fence_data->second.in_use.fetch_add(1); for (uint32_t submit_idx = 0; submit_idx < submitCount; submit_idx++) { const VkSubmitInfo *submit = &pSubmits[submit_idx]; @@ -4531,7 +4537,6 @@ QueueSubmit(VkQueue queue, uint32_t submitCount, const VkSubmitInfo *pSubmits, V std::unique_lock<std::mutex> lock(global_lock); // First verify that fence is not in use if (fence != VK_NULL_HANDLE) { - dev_data->fenceMap[fence].queue = queue; if ((submitCount != 0) && dev_data->fenceMap[fence].in_use.load()) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, (uint64_t)(fence), __LINE__, DRAWSTATE_INVALID_FENCE, "DS", @@ -4754,7 +4759,7 @@ static inline bool verifyWaitFenceState(VkDevice device, VkFence fence, const ch (uint64_t)fence, __LINE__, MEMTRACK_INVALID_FENCE_STATE, "MEM", "%s specified fence %#" PRIxLEAST64 " already in SIGNALED state.", apiCall, (uint64_t)fence); } - if (!pFenceInfo->second.queue && !pFenceInfo->second.swapchain) { // Checking status of unsubmitted fence + if (pFenceInfo->second.queues.empty() && !pFenceInfo->second.swapchain) { // Checking status of unsubmitted fence skipCall |= log_msg(my_data->report_data, VK_DEBUG_REPORT_WARNING_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, reinterpret_cast<uint64_t &>(fence), __LINE__, MEMTRACK_INVALID_FENCE_STATE, "MEM", "%s called for fence %#" PRIxLEAST64 " which has not been submitted on a Queue or during " @@ -5425,6 +5430,7 @@ VKAPI_ATTR VkResult VKAPI_CALL ResetFences(VkDevice device, uint32_t fenceCount, auto fence_item = dev_data->fenceMap.find(pFences[i]); if (fence_item != dev_data->fenceMap.end()) { fence_item->second.needsSignaled = true; + fence_item->second.queues.clear(); if (fence_item->second.in_use.load()) { skipCall |= log_msg(dev_data->report_data, VK_DEBUG_REPORT_ERROR_BIT_EXT, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, |
