From 245bf8c1f43bf8cd601ae81d41701a99928b5cfa Mon Sep 17 00:00:00 2001 From: Tobin Ehlis Date: Tue, 10 May 2016 10:16:23 -0600 Subject: layers: GH458 Fix cleanup of queue lastFences When waiting on fences, they were not being correctly removed from the queue's lastFences vector. Updated the remove code and verified that it's now working correctly. --- layers/core_validation.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index ab978360..f1f2f5fb 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4244,14 +4244,14 @@ static void decrementResources(layer_data *my_data, VkCommandBuffer cmdBuffer) { // decrementResources for all priorFences and cmdBuffers associated with fence. static bool decrementResources(layer_data *my_data, uint32_t fenceCount, const VkFence *pFences) { bool skip_call = false; - std::vector fences; + std::vector> fence_pairs; for (uint32_t i = 0; i < fenceCount; ++i) { auto fence_data = my_data->fenceMap.find(pFences[i]); if (fence_data == my_data->fenceMap.end() || !fence_data->second.needsSignaled) return skip_call; fence_data->second.needsSignaled = false; if (fence_data->second.in_use.load()) { - fences.push_back(pFences[i]); + fence_pairs.push_back(std::make_pair(fence_data->first, &fence_data->second)); fence_data->second.in_use.fetch_sub(1); } decrementResources(my_data, static_cast(fence_data->second.priorFences.size()), @@ -4264,13 +4264,13 @@ static bool decrementResources(layer_data *my_data, uint32_t fenceCount, const V fence_data->second.cmdBuffers.clear(); fence_data->second.priorFences.clear(); } - for (auto fence : fences) { - for (auto queue_data : my_data->queueMap) { - auto last_fence_data = std::find(queue_data.second.lastFences.begin(), queue_data.second.lastFences.end(), fence); - if (last_fence_data != queue_data.second.lastFences.end()) { - queue_data.second.lastFences.erase(last_fence_data); - break; - } + 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); } } return skip_call; -- cgit v1.2.3