aboutsummaryrefslogtreecommitdiff
path: root/src/queue_context.cc
diff options
context:
space:
mode:
authorNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-03-30 22:47:12 +1100
committerNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-03-30 22:47:12 +1100
commit108801fe96d855c5ccf532639a6db8ff0065310e (patch)
tree24f551fbffad9ec4fd842f56dd530d65a1150723 /src/queue_context.cc
parent7b17b60786d00c592f0ef18c8481148143baacbd (diff)
Move timestamp pool reacquisition to an asynchronous worker queue, fix device_context race during destructor
Diffstat (limited to 'src/queue_context.cc')
-rw-r--r--src/queue_context.cc15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/queue_context.cc b/src/queue_context.cc
index 437a183..0356c5c 100644
--- a/src/queue_context.cc
+++ b/src/queue_context.cc
@@ -59,6 +59,10 @@ void QueueContext::notify_submit(
if (submissions == nullptr) {
submissions =
std::make_shared<std::deque<std::unique_ptr<Submission>>>();
+
+ if (present_id) {
+ this->present_id_ring.emplace_back(present_id);
+ }
}
submissions->push_back(
@@ -66,12 +70,17 @@ void QueueContext::notify_submit(
.tail_handle = tail_handle,
.cpu_present_time = now}));
- // This is probably hit if our queue never actually presents to anything,
- // because the only time we manually evict our unpresent_submissions is
- // when we present to something.
+ // This is probably hit if our queue never actually presents to anything.
if (std::size(*submissions) > this->MAX_TRACKED_SUBMISSIONS) {
submissions->pop_front();
}
+
+ if (std::size(this->present_id_ring) > MAX_TRACKED_PRESENT_IDS) {
+ const auto evicted_present_id = this->present_id_ring.front();
+ this->present_id_ring.pop_front();
+
+ this->unpresented_submissions.erase(evicted_present_id);
+ }
}
void QueueContext::notify_present(const VkSwapchainKHR& swapchain,