diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-12 14:27:29 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-10-13 09:35:20 +0000 |
commit | c30a6232df03e1efbd9f3b226777b07e087a1122 (patch) | |
tree | e992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/gpu/vulkan/vulkan_fence_helper.cc | |
parent | 7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff) | |
download | qtwebengine-chromium-85-based.tar.gz |
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
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); |