diff options
| author | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2026-03-31 16:15:00 +1100 |
|---|---|---|
| committer | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2026-03-31 16:15:00 +1100 |
| commit | 5e3837cadac73ba5b7d4085cddc48b0e816d826a (patch) | |
| tree | ced4c413506409f17806a5c6ea4864b4026ca924 /src/queue_context.cc | |
| parent | df2933fd9c0ea2a99e89a6837123dfdf8b549d4a (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.cc | 56 |
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); |
