aboutsummaryrefslogtreecommitdiff
path: root/src/device_context.cc
diff options
context:
space:
mode:
authorNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-02-13 18:21:04 +1100
committerNicolas James <Eele1Ephe7uZahRie@tutanota.com>2026-02-13 18:21:04 +1100
commit8f4501215c0dbbbde59da2d015fdec3dbe5131bc (patch)
treeac7e4b58309adb26e621c776f97fa8f08e608f04 /src/device_context.cc
parent76f3ef1d7c2b4393a8e8b402deb924e606448d27 (diff)
add working frame tracking and commit before i break everything
Diffstat (limited to 'src/device_context.cc')
-rw-r--r--src/device_context.cc61
1 files changed, 59 insertions, 2 deletions
diff --git a/src/device_context.cc b/src/device_context.cc
index 5f5c1f7..4b39210 100644
--- a/src/device_context.cc
+++ b/src/device_context.cc
@@ -6,11 +6,12 @@
namespace low_latency {
DeviceContext::DeviceContext(InstanceContext& parent_instance,
+ PhysicalDeviceContext& parent_physical_device,
const VkDevice& device,
const PFN_vkSetDeviceLoaderData& sdld,
VkuDeviceDispatchTable&& vtable)
- : instance(parent_instance), device(device), sdld(sdld),
- vtable(std::move(vtable)) {}
+ : instance(parent_instance), physical_device(parent_physical_device),
+ device(device), sdld(sdld), vtable(std::move(vtable)), clock(*this) {}
DeviceContext::~DeviceContext() {
// We will let the destructor handle clearing here, but they should be
@@ -20,4 +21,60 @@ DeviceContext::~DeviceContext() {
}
}
+void DeviceContext::notify_acquire(const VkSwapchainKHR& swapchain,
+ const std::uint32_t& image_index,
+ const VkSemaphore& signal_semaphore) {
+
+ const auto it = this->swapchain_signals.try_emplace(swapchain).first;
+
+ // Doesn't matter if it was already there, overwrite it.
+ it->second.insert_or_assign(image_index, signal_semaphore);
+}
+
+DeviceContext::Clock::Clock(const DeviceContext& context) {
+
+ const auto infos = std::vector<VkCalibratedTimestampInfoKHR>{
+ {VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT, nullptr,
+ VK_TIME_DOMAIN_DEVICE_EXT},
+ {VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT, nullptr,
+ VK_TIME_DOMAIN_CLOCK_MONOTONIC_EXT}};
+
+ auto device_host = std::array<std::uint64_t, 2>{};
+
+ const auto steady_before = std::chrono::steady_clock::now();
+ context.vtable.GetCalibratedTimestampsKHR(
+ context.device, 2, std::data(infos), std::data(device_host),
+ &this->error_bound);
+ const auto steady_after = std::chrono::steady_clock::now();
+
+ this->cpu_time = steady_before + (steady_after - steady_before) / 2;
+ this->device_ticks = device_host[0];
+ this->host_ns = device_host[1];
+
+ // Might need to get physical limits again?
+ this->ticks_per_ns =
+ context.physical_device.properties->limits.timestampPeriod;
+}
+
+DeviceContext::Clock::time_point_t
+DeviceContext::Clock::ticks_to_time(const std::uint64_t& ticks) const {
+ /*
+ struct timespec tv;
+ clock_gettime(CLOCK_MONOTONIC, &tv);
+ return tv.tv_nsec + tv.tv_sec*1000000000ull;
+ */
+
+ auto a = this->device_ticks;
+ auto b = ticks;
+
+ const auto was_before = a > b;
+ if (was_before) { // it's happened before
+ std::swap(a, b);
+ }
+ const auto nsec = std::chrono::nanoseconds((b - a) * this->ticks_per_ns);
+ return this->cpu_time + (was_before ? -nsec : nsec);
+}
+
+void DeviceContext::calibrate_timestamps() { this->clock = Clock{*this}; }
+
} // namespace low_latency \ No newline at end of file