aboutsummaryrefslogtreecommitdiff
path: root/layers/core_validation.cpp
diff options
context:
space:
mode:
authorTobin Ehlis <tobine@google.com>2016-05-10 10:16:23 -0600
committerTobin Ehlis <tobine@google.com>2016-05-10 16:41:39 -0600
commit245bf8c1f43bf8cd601ae81d41701a99928b5cfa (patch)
tree7c512a976dbea4a7bc7c46c1dcfb16dac121ee4f /layers/core_validation.cpp
parent25b9b8c8f9478097e5ed2288939685c5a6487d6b (diff)
downloadusermoji-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.cpp18
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;