summaryrefslogtreecommitdiff
path: root/chromium/gpu/vulkan/vulkan_fence_helper.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/gpu/vulkan/vulkan_fence_helper.cc')
-rw-r--r--chromium/gpu/vulkan/vulkan_fence_helper.cc32
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);