1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#include "queue_context.hh"
#include "device_context.hh"
#include "timestamp_pool.hh"
namespace low_latency {
static VkCommandPool
make_command_pool(const DeviceContext& device_context,
const std::uint32_t& queue_family_index) {
const auto cpci = VkCommandPoolCreateInfo{
.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO,
.flags = VK_COMMAND_POOL_CREATE_TRANSIENT_BIT |
VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT,
.queueFamilyIndex = queue_family_index,
};
auto command_pool = VkCommandPool{};
device_context.vtable.CreateCommandPool(device_context.device, &cpci,
nullptr, &command_pool);
return command_pool;
}
static VkSemaphore make_semaphore(const DeviceContext& device_context) {
const auto stci = VkSemaphoreTypeCreateInfo{
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
.semaphoreType = VK_SEMAPHORE_TYPE_TIMELINE,
.initialValue = 0,
};
const auto sci = VkSemaphoreCreateInfo{
.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
.pNext = &stci,
};
auto semaphore = VkSemaphore{};
device_context.vtable.CreateSemaphore(device_context.device, &sci, nullptr,
&semaphore);
return semaphore;
}
QueueContext::QueueContext(DeviceContext& device_context, const VkQueue& queue,
const std::uint32_t& queue_family_index)
: device_context(device_context), queue(queue),
queue_family_index(queue_family_index),
// Important we make the command pool before the timestamp pool, because
// it's a dependency.
command_pool(make_command_pool(device_context, queue_family_index)),
semaphore(make_semaphore(device_context)),
timestamp_pool(std::make_unique<TimestampPool>(*this)) {}
QueueContext::~QueueContext() {
// nuke our handles, so we avoid segfaults for now
this->handle_hack.clear();
// Ugly - destructors of timestamp_pool should be called before we destroy
// our vulkan objects.
this->timestamp_pool.reset();
const auto& vtable = this->device_context.vtable;
vtable.DestroySemaphore(this->device_context.device, this->semaphore,
nullptr);
vtable.DestroyCommandPool(this->device_context.device, this->command_pool,
nullptr);
}
} // namespace low_latency
|