diff options
| author | Tobin Ehlis <tobine@google.com> | 2016-05-10 10:16:23 -0600 |
|---|---|---|
| committer | Tobin Ehlis <tobine@google.com> | 2016-05-10 16:41:39 -0600 |
| commit | 245bf8c1f43bf8cd601ae81d41701a99928b5cfa (patch) | |
| tree | 7c512a976dbea4a7bc7c46c1dcfb16dac121ee4f /layers/core_validation.cpp | |
| parent | 25b9b8c8f9478097e5ed2288939685c5a6487d6b (diff) | |
| download | usermoji-245bf8c1f43bf8cd601ae81d41701a99928b5cfa.tar.xz | |
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.
Diffstat (limited to 'layers/core_validation.cpp')
| -rw-r--r-- | layers/core_validation.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
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<VkFence> fences; + std::vector<std::pair<VkFence, FENCE_NODE *>> 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<uint32_t>(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; |
