aboutsummaryrefslogtreecommitdiff
path: root/src/timestamp_pool.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/timestamp_pool.cc')
-rw-r--r--src/timestamp_pool.cc85
1 files changed, 47 insertions, 38 deletions
diff --git a/src/timestamp_pool.cc b/src/timestamp_pool.cc
index e02a4fc..247d411 100644
--- a/src/timestamp_pool.cc
+++ b/src/timestamp_pool.cc
@@ -2,7 +2,6 @@
#include "device_context.hh"
#include "queue_context.hh"
-#include <chrono>
#include <ranges>
#include <span>
#include <vulkan/utility/vk_dispatch_table.h>
@@ -10,39 +9,59 @@
namespace low_latency {
-TimestampPool::QueryChunk::QueryChunk(const QueueContext& queue_context) {
- const auto& device_context = queue_context.device_context;
- const auto& vtable = device_context.vtable;
+TimestampPool::QueryChunk::QueryPoolOwner::QueryPoolOwner(
+ const QueueContext& queue_context)
+ : queue_context(queue_context) {
- this->query_pool = [&]() {
- const auto qpci = VkQueryPoolCreateInfo{
- .sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
- .queryType = VK_QUERY_TYPE_TIMESTAMP,
- .queryCount = QueryChunk::CHUNK_SIZE};
+ const auto& device_context = this->queue_context.device_context;
+ const auto qpci =
+ VkQueryPoolCreateInfo{.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO,
+ .queryType = VK_QUERY_TYPE_TIMESTAMP,
+ .queryCount = QueryChunk::CHUNK_SIZE};
- auto qp = VkQueryPool{};
- THROW_NON_VKSUCCESS(
- vtable.CreateQueryPool(device_context.device, &qpci, nullptr, &qp));
- return qp;
- }();
+ THROW_NON_VKSUCCESS(device_context.vtable.CreateQueryPool(
+ device_context.device, &qpci, nullptr, &this->query_pool));
+}
+
+TimestampPool::QueryChunk::QueryPoolOwner::~QueryPoolOwner() {
+ const auto& device_context = this->queue_context.device_context;
+ device_context.vtable.DestroyQueryPool(device_context.device,
+ this->query_pool, nullptr);
+}
+
+TimestampPool::QueryChunk::QueryChunk(const QueueContext& queue_context)
+ : query_pool(std::make_unique<QueryPoolOwner>(queue_context)),
+ command_buffers(std::make_unique<CommandBuffersOwner>(queue_context)) {
this->free_indices = []() {
constexpr auto KEYS = std::views::iota(0u, QueryChunk::CHUNK_SIZE);
return std::make_unique<free_indices_t>(std::from_range, KEYS);
}();
+}
- this->command_buffers = [&]() -> auto {
- auto cbs = std::make_unique<std::vector<VkCommandBuffer>>(CHUNK_SIZE);
- const auto cbai = VkCommandBufferAllocateInfo{
- .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
- .commandPool = queue_context.command_pool,
- .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
- .commandBufferCount = static_cast<std::uint32_t>(std::size(*cbs)),
- };
- THROW_NON_VKSUCCESS(vtable.AllocateCommandBuffers(
- device_context.device, &cbai, std::data(*cbs)));
- return cbs;
- }();
+TimestampPool::QueryChunk::CommandBuffersOwner::CommandBuffersOwner(
+ const QueueContext& queue_context)
+ : queue_context(queue_context), command_buffers(CHUNK_SIZE) {
+
+ const auto& device_context = queue_context.device_context;
+
+ const auto cbai = VkCommandBufferAllocateInfo{
+ .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO,
+ .commandPool = *queue_context.command_pool,
+ .level = VK_COMMAND_BUFFER_LEVEL_PRIMARY,
+ .commandBufferCount = CHUNK_SIZE,
+ };
+ THROW_NON_VKSUCCESS(device_context.vtable.AllocateCommandBuffers(
+ device_context.device, &cbai, std::data(this->command_buffers)));
+}
+
+TimestampPool::QueryChunk::CommandBuffersOwner::~CommandBuffersOwner() {
+ const auto& device_context = this->queue_context.device_context;
+
+ device_context.vtable.FreeCommandBuffers(
+ device_context.device, *this->queue_context.command_pool,
+ static_cast<std::uint32_t>(std::size(this->command_buffers)),
+ std::data(this->command_buffers));
}
TimestampPool::QueryChunk::~QueryChunk() {}
@@ -87,7 +106,7 @@ TimestampPool::Handle::Handle(const TimestampPool& timestamp_pool,
const std::shared_ptr<QueryChunk>& origin_chunk,
const std::uint64_t& query_index)
: timestamp_pool(timestamp_pool), origin_chunk(origin_chunk),
- query_pool(origin_chunk->query_pool), query_index(query_index),
+ query_pool(*origin_chunk->query_pool), query_index(query_index),
command_buffer((*origin_chunk->command_buffers)[query_index]) {}
TimestampPool::Handle::~Handle() {
@@ -187,16 +206,6 @@ DeviceContext::Clock::time_point_t TimestampPool::Handle::get_time_required() {
return *time;
}
-TimestampPool::~TimestampPool() {
- const auto& device = this->queue_context.device_context.device;
- const auto& vtable = this->queue_context.device_context.vtable;
- for (const auto& query_chunk : this->query_chunks) {
- vtable.FreeCommandBuffers(device, this->queue_context.command_pool,
- static_cast<std::uint32_t>(
- std::size(*query_chunk->command_buffers)),
- std::data(*query_chunk->command_buffers));
- vtable.DestroyQueryPool(device, query_chunk->query_pool, nullptr);
- }
-}
+TimestampPool::~TimestampPool() {}
} // namespace low_latency \ No newline at end of file