#ifndef QUEUE_STATE_HH_ #define QUEUE_STATE_HH_ #include "context.hh" #include "timestamp_pool.hh" #include #include #include #include #include #include #include namespace low_latency { class DeviceContext; class QueueContext final : public Context { public: DeviceContext& device_context; const VkQueue queue; const std::uint32_t queue_family_index; std::uint64_t semaphore_sequence = 0; VkSemaphore semaphore; VkCommandPool command_pool; std::unique_ptr timestamp_pool; // Potentially in flight queue submissions struct Submission { const std::unordered_set signals; const std::unordered_set waits; const std::uint64_t target_semaphore_sequence; const std::shared_ptr timestamp_handle; }; std::deque> submissions; // In flight frames! // These might come from different contexts. struct Frame { const QueueContext& start_context; const std::shared_ptr start; const std::uint64_t target_start_sequence; const QueueContext& end_context; const std::shared_ptr end; const std::uint64_t target_end_sequence; }; // These can be null, it means we made presented without finding the // timestamps associated with the present. std::deque> in_flight_frames; public: QueueContext(DeviceContext& device_context, const VkQueue& queue, const std::uint32_t& queue_family_index); virtual ~QueueContext(); public: void notify_submit(std::span infos, const std::uint64_t target_semaphore_sequence, std::shared_ptr&& handle); void notify_submit(std::span infos, const std::uint64_t target_semaphore_sequence, std::shared_ptr&& handle); void notify_present(const VkPresentInfoKHR& info); public: // Computes the amount we should delay... using duration_t = std::chrono::steady_clock::duration; std::optional get_delay_time(); }; }; // namespace low_latency #endif