aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-04-01 00:49:34 +1100
committerNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-04-01 00:49:34 +1100
commit31c69428639c0674339c3752c5401542d38693bc (patch)
treee5d215ffbbe6ec0630aaadef6afa218cd6f60a21 /src
parentaa3dbff2342a4d698c10a5fd816904de01b03605 (diff)
Turn shared_ptr to unique_ptr in Context, strictly transfer ownership in notify_present
Diffstat (limited to 'src')
-rw-r--r--src/device_context.cc7
-rw-r--r--src/device_context.hh2
-rw-r--r--src/queue_context.cc6
-rw-r--r--src/queue_context.hh4
-rw-r--r--src/swapchain_monitor.cc17
-rw-r--r--src/swapchain_monitor.hh14
6 files changed, 25 insertions, 25 deletions
diff --git a/src/device_context.cc b/src/device_context.cc
index 33f2aa4..fcbc9ef 100644
--- a/src/device_context.cc
+++ b/src/device_context.cc
@@ -37,7 +37,8 @@ void DeviceContext::update_params(
// swapchains) just write it to everything.
if (!target.has_value()) {
for (auto& iter : this->swapchain_monitors) {
- iter.second->update_params(was_low_latency_requested, present_delay);
+ iter.second->update_params(was_low_latency_requested,
+ present_delay);
}
return;
}
@@ -49,12 +50,12 @@ void DeviceContext::update_params(
void DeviceContext::notify_present(
const VkSwapchainKHR& swapchain,
- const QueueContext::submissions_ptr_t& submissions) {
+ std::unique_ptr<QueueContext::Submissions> submissions) {
const auto iter = this->swapchain_monitors.find(swapchain);
assert(iter != std::end(this->swapchain_monitors));
- iter->second->notify_present(submissions);
+ iter->second->notify_present(std::move(submissions));
}
} // namespace low_latency \ No newline at end of file
diff --git a/src/device_context.hh b/src/device_context.hh
index ed2991b..df1b58d 100644
--- a/src/device_context.hh
+++ b/src/device_context.hh
@@ -53,7 +53,7 @@ class DeviceContext final : public Context {
const bool was_low_latency_requested);
void notify_present(const VkSwapchainKHR& swapchain,
- const QueueContext::submissions_ptr_t& submissions);
+ std::unique_ptr<QueueContext::Submissions> submissions);
};
}; // namespace low_latency
diff --git a/src/queue_context.cc b/src/queue_context.cc
index e9f9c3c..b4591f8 100644
--- a/src/queue_context.cc
+++ b/src/queue_context.cc
@@ -96,7 +96,7 @@ 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<Submissions>();
+ submissions = std::make_unique<Submissions>();
if (present_id) {
this->present_id_ring.emplace_back(present_id);
}
@@ -119,10 +119,10 @@ 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<Submissions>();
+ iter->second = std::make_unique<Submissions>();
}
- this->device.notify_present(swapchain, iter->second);
+ this->device.notify_present(swapchain, std::move(iter->second));
// Important, we nuke the submission because now it's presented.
this->unpresented_submissions.erase(iter);
diff --git a/src/queue_context.hh b/src/queue_context.hh
index 2abd44c..326ee79 100644
--- a/src/queue_context.hh
+++ b/src/queue_context.hh
@@ -99,8 +99,8 @@ class QueueContext final : public Context {
};
using present_id_t = std::uint64_t;
- using submissions_ptr_t = std::shared_ptr<Submissions>;
- std::unordered_map<present_id_t, submissions_ptr_t> unpresented_submissions;
+ std::unordered_map<present_id_t, std::unique_ptr<Submissions>>
+ unpresented_submissions;
// We might be tracking present_ids which aren't presented to - and as a
// result we don't ever clear those Submissions. So manually evict them by
diff --git a/src/swapchain_monitor.cc b/src/swapchain_monitor.cc
index bc4fc9b..002f729 100644
--- a/src/swapchain_monitor.cc
+++ b/src/swapchain_monitor.cc
@@ -67,10 +67,9 @@ void ReflexSwapchainMonitor::do_monitor(const std::stop_token stoken) {
// Look for the latest submission and make sure it's completed.
if (!this->in_flight_submissions.empty()) {
- const auto last_submission = this->in_flight_submissions.back();
- this->in_flight_submissions.clear();
- last_submission->await_completed();
+ this->in_flight_submissions.back()->await_completed();
+ this->in_flight_submissions.clear();
}
// We might want to signal them all? In theory it's the same timeline
@@ -104,7 +103,7 @@ void ReflexSwapchainMonitor::notify_semaphore(
}
void ReflexSwapchainMonitor::notify_present(
- const QueueContext::submissions_ptr_t& submissions) {
+ std::unique_ptr<QueueContext::Submissions> submissions) {
const auto lock = std::scoped_lock{this->mutex};
@@ -121,7 +120,7 @@ void ReflexSwapchainMonitor::notify_present(
return;
}
- this->in_flight_submissions.emplace_back(submissions);
+ this->in_flight_submissions.emplace_back(std::move(submissions));
this->prune_submissions();
this->cv.notify_one();
@@ -133,13 +132,13 @@ AntiLagSwapchainMonitor::AntiLagSwapchainMonitor(
AntiLagSwapchainMonitor::~AntiLagSwapchainMonitor() {}
void AntiLagSwapchainMonitor::notify_present(
- const QueueContext::submissions_ptr_t& submissions) {
+ std::unique_ptr<QueueContext::Submissions> submissions) {
if (!this->was_low_latency_requested) {
return;
}
- this->in_flight_submissions.emplace_back(submissions);
+ this->in_flight_submissions.emplace_back(std::move(submissions));
this->prune_submissions();
}
@@ -148,10 +147,8 @@ void AntiLagSwapchainMonitor::await_submissions() {
return;
}
- const auto last_submission = this->in_flight_submissions.back();
+ this->in_flight_submissions.back()->await_completed();
this->in_flight_submissions.clear();
-
- last_submission->await_completed();
}
} // namespace low_latency \ No newline at end of file
diff --git a/src/swapchain_monitor.hh b/src/swapchain_monitor.hh
index 295ac5b..4fed3f8 100644
--- a/src/swapchain_monitor.hh
+++ b/src/swapchain_monitor.hh
@@ -8,6 +8,7 @@
#include <chrono>
#include <condition_variable>
#include <deque>
+#include <memory>
#include <mutex>
#include <thread>
@@ -31,7 +32,8 @@ class SwapchainMonitor {
std::chrono::milliseconds present_delay = std::chrono::milliseconds{0};
bool was_low_latency_requested = false;
- std::deque<QueueContext::submissions_ptr_t> in_flight_submissions;
+ std::deque<std::unique_ptr<QueueContext::Submissions>>
+ in_flight_submissions;
protected:
// Small fix to avoid submissions growing limitlessly in size if this
@@ -53,7 +55,7 @@ class SwapchainMonitor {
public:
virtual void
- notify_present(const QueueContext::submissions_ptr_t& submissions) = 0;
+ notify_present(std::unique_ptr<QueueContext::Submissions> submissions) = 0;
};
// Provides asynchronous monitoring of submissions and signalling of some
@@ -86,8 +88,8 @@ class ReflexSwapchainMonitor final : public SwapchainMonitor {
const std::uint64_t& value);
public:
- virtual void
- notify_present(const QueueContext::submissions_ptr_t& submissions) override;
+ virtual void notify_present(
+ std::unique_ptr<QueueContext::Submissions> submissions) override;
};
// Much simpler synchronous waiting with no thread requirement.
@@ -102,8 +104,8 @@ class AntiLagSwapchainMonitor final : public SwapchainMonitor {
void await_submissions();
public:
- virtual void
- notify_present(const QueueContext::submissions_ptr_t& submissions) override;
+ virtual void notify_present(
+ std::unique_ptr<QueueContext::Submissions> submissions) override;
};
} // namespace low_latency