diff options
Diffstat (limited to 'chromium/gpu/vulkan/vulkan_fence_helper.cc')
-rw-r--r-- | chromium/gpu/vulkan/vulkan_fence_helper.cc | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/chromium/gpu/vulkan/vulkan_fence_helper.cc b/chromium/gpu/vulkan/vulkan_fence_helper.cc index d7d902a42b7..c8338a4afc2 100644 --- a/chromium/gpu/vulkan/vulkan_fence_helper.cc +++ b/chromium/gpu/vulkan/vulkan_fence_helper.cc @@ -5,6 +5,7 @@ #include "gpu/vulkan/vulkan_fence_helper.h" #include "base/bind.h" +#include "base/logging.h" #include "gpu/vulkan/vulkan_device_queue.h" #include "gpu/vulkan/vulkan_function_pointers.h" @@ -75,32 +76,38 @@ void VulkanFenceHelper::EnqueueCleanupTaskForSubmittedWork(CleanupTask task) { tasks_pending_fence_.emplace_back(std::move(task)); } -void VulkanFenceHelper::ProcessCleanupTasks() { +void VulkanFenceHelper::ProcessCleanupTasks(uint64_t retired_generation_id) { VkDevice device = device_queue_->GetVulkanDevice(); + if (!retired_generation_id) + retired_generation_id = current_generation_; + // Iterate over our pending cleanup fences / tasks, advancing // |current_generation_| as far as possible. for (const auto& tasks_for_fence : cleanup_tasks_) { - // If we're already ahead of this task (callback modified |generation_id_|), - // continue. - if (tasks_for_fence.generation_id <= current_generation_) - continue; - // Callback based tasks have no actual fence to wait on, keep checking // future fences, as a callback may be delayed. if (tasks_for_fence.UsingCallback()) continue; VkResult result = vkGetFenceStatus(device, tasks_for_fence.fence); - if (result == VK_NOT_READY) + if (result == VK_NOT_READY) { + retired_generation_id = + std::min(retired_generation_id, tasks_for_fence.generation_id - 1); break; - if (result != VK_SUCCESS) { - PerformImmediateCleanup(); - return; } - current_generation_ = tasks_for_fence.generation_id; + if (result == VK_SUCCESS) { + retired_generation_id = + std::max(tasks_for_fence.generation_id, retired_generation_id); + continue; + } + DLOG(ERROR) << "vkGetFenceStatus() failed: " << result; + PerformImmediateCleanup(); + return; } + current_generation_ = retired_generation_id; + // Runs any cleanup tasks for generations that have passed. Create a temporary // vector of tasks to run to avoid reentrancy issues. std::vector<CleanupTask> tasks_to_run; @@ -161,8 +168,7 @@ base::OnceClosure VulkanFenceHelper::CreateExternalCallback() { // If |current_generation_| is ahead of the callback's // |generation_id|, the callback came late. Ignore it. if (generation_id > fence_helper->current_generation_) { - fence_helper->current_generation_ = generation_id; - fence_helper->ProcessCleanupTasks(); + fence_helper->ProcessCleanupTasks(generation_id); } }, weak_factory_.GetWeakPtr(), generation_id); |