From db50be7872385b1c21d471d4665510f0fa61fa54 Mon Sep 17 00:00:00 2001 From: Michael Lentine Date: Fri, 29 Apr 2016 18:37:32 -0500 Subject: Remove fences once they have been waited on. --- layers/core_validation.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'layers/core_validation.cpp') diff --git a/layers/core_validation.cpp b/layers/core_validation.cpp index e2f04d7c..2cadc628 100644 --- a/layers/core_validation.cpp +++ b/layers/core_validation.cpp @@ -4834,12 +4834,16 @@ 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; 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; - fence_data->second.in_use.fetch_sub(1); + if (fence_data->second.in_use.load()) { + fences.push_back(pFences[i]); + fence_data->second.in_use.fetch_sub(1); + } decrementResources(my_data, static_cast(fence_data->second.priorFences.size()), fence_data->second.priorFences.data()); for (auto cmdBuffer : fence_data->second.cmdBuffers) { @@ -4848,6 +4852,15 @@ static bool decrementResources(layer_data *my_data, uint32_t fenceCount, const V removeInFlightCmdBuffer(my_data, cmdBuffer); } } + 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; + } + } + } return skip_call; } // Decrement in_use for all outstanding cmd buffers that were submitted on this queue -- cgit v1.2.3