aboutsummaryrefslogtreecommitdiff
path: root/src/queue_context.cc
diff options
context:
space:
mode:
authorNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-03-31 16:15:00 +1100
committerNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-03-31 16:15:00 +1100
commit5e3837cadac73ba5b7d4085cddc48b0e816d826a (patch)
treeced4c413506409f17806a5c6ea4864b4026ca924 /src/queue_context.cc
parentdf2933fd9c0ea2a99e89a6837123dfdf8b549d4a (diff)
Fix vram leak in Cyberpunk 2077, reduce duplicated logic + general cleanup
Diffstat (limited to 'src/queue_context.cc')
-rw-r--r--src/queue_context.cc56
1 files changed, 42 insertions, 14 deletions
diff --git a/src/queue_context.cc b/src/queue_context.cc
index 84b06fe..e9f9c3c 100644
--- a/src/queue_context.cc
+++ b/src/queue_context.cc
@@ -47,6 +47,45 @@ QueueContext::~QueueContext() {
this->timestamp_pool.reset();
}
+QueueContext::Submissions::Submissions() {}
+
+QueueContext::Submissions::~Submissions() {}
+
+void QueueContext::Submissions::add_submission(
+ const std::shared_ptr<TimestampPool::Handle> head,
+ const std::shared_ptr<TimestampPool::Handle> tail,
+ const DeviceClock::time_point_t& now) {
+
+ this->submissions.emplace_back(std::make_unique<Submission>(Submission{
+ .head_handle = head,
+ .tail_handle = tail,
+ .cpu_present_time = now,
+ }));
+
+ // Manual eviction of likely irrelevant timing information.
+ if (std::size(this->submissions) > this->MAX_TRACKED_SUBMISSIONS) {
+ this->submissions.pop_front();
+ }
+}
+
+bool QueueContext::Submissions::has_completed() const {
+ if (this->submissions.empty()) {
+ return true;
+ }
+
+ const auto& last_submission = this->submissions.back();
+ return last_submission->tail_handle->get_time().has_value();
+}
+
+void QueueContext::Submissions::await_completed() const {
+ if (this->submissions.empty()) {
+ return;
+ }
+
+ const auto& last_submission = this->submissions.back();
+ last_submission->tail_handle->await_time();
+}
+
void QueueContext::notify_submit(
const present_id_t& present_id,
const std::shared_ptr<TimestampPool::Handle> head_handle,
@@ -57,23 +96,13 @@ void QueueContext::notify_submit(
// mapping (might be empty, but handled with operator[]).
auto& submissions = this->unpresented_submissions[present_id];
if (submissions == nullptr) {
- submissions =
- std::make_shared<std::deque<std::unique_ptr<Submission>>>();
-
+ submissions = std::make_shared<Submissions>();
if (present_id) {
this->present_id_ring.emplace_back(present_id);
}
}
- submissions->push_back(
- std::make_unique<Submission>(Submission{.head_handle = head_handle,
- .tail_handle = tail_handle,
- .cpu_present_time = now}));
-
- // This is probably hit if our queue never actually presents to anything.
- if (std::size(*submissions) > this->MAX_TRACKED_SUBMISSIONS) {
- submissions->pop_front();
- }
+ submissions->add_submission(head_handle, tail_handle, now);
if (std::size(this->present_id_ring) > MAX_TRACKED_PRESENT_IDS) {
const auto evicted_present_id = this->present_id_ring.front();
@@ -90,8 +119,7 @@ void QueueContext::notify_present(const VkSwapchainKHR& swapchain,
// We're avoiding a double hash here - don't use operator[] and erase.
auto iter = this->unpresented_submissions.try_emplace(present_id).first;
if (iter->second == nullptr) {
- iter->second =
- std::make_shared<std::deque<std::unique_ptr<Submission>>>();
+ iter->second = std::make_shared<Submissions>();
}
this->device.notify_present(swapchain, iter->second);