Vulkan Schnee 0.0.1
High-performance rendering engine
Loading...
Searching...
No Matches
QueueSubmitBuilder.cpp
Go to the documentation of this file.
2
3namespace EngineCore
4{
5
7 : sync_(sync)
8 , frameNumber_(frameNumber)
9{
10}
11
13 PipelineStage stage,
14 VkPipelineStageFlags2 waitStages,
15 uint64_t frameNumber)
16{
17 uint64_t waitValue = sync_.getStageValue(frameNumber, stage);
18
19 waitInfos_.push_back(VkSemaphoreSubmitInfo{
20 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
21 .pNext = nullptr,
22 .semaphore = sync_.getSemaphore(),
23 .value = waitValue,
24 .stageMask = waitStages,
25 .deviceIndex = 0,
26 });
27
28 return *this;
29}
30
32 PipelineStage stage,
33 VkPipelineStageFlags2 waitStages)
34{
35 return waitFor(stage, waitStages, frameNumber_);
36}
37
39 PipelineStage stage,
40 VkPipelineStageFlags2 waitStages)
41{
42 auto waitValue = sync_.getWaitValue(frameNumber_, stage, 1);
43 if (waitValue.has_value())
44 {
45 waitInfos_.push_back(VkSemaphoreSubmitInfo{
46 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
47 .pNext = nullptr,
48 .semaphore = sync_.getSemaphore(),
49 .value = waitValue.value(),
50 .stageMask = waitStages,
51 .deviceIndex = 0,
52 });
53 }
54 return *this;
55}
56
58 PipelineStage stage,
59 VkPipelineStageFlags2 waitStages)
60{
61 auto waitValue = sync_.getResourceReuseWaitValue(frameNumber_, stage);
62 if (waitValue.has_value())
63 {
64 waitInfos_.push_back(VkSemaphoreSubmitInfo{
65 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
66 .pNext = nullptr,
67 .semaphore = sync_.getSemaphore(),
68 .value = waitValue.value(),
69 .stageMask = waitStages,
70 .deviceIndex = 0,
71 });
72 }
73 return *this;
74}
75
77 VkSemaphore semaphore,
78 VkPipelineStageFlags2 waitStages)
79{
80 if (semaphore != VK_NULL_HANDLE)
81 {
82 waitInfos_.push_back(VkSemaphoreSubmitInfo{
83 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
84 .pNext = nullptr,
85 .semaphore = semaphore,
86 .value = 0, // Binary semaphores use value 0
87 .stageMask = waitStages,
88 .deviceIndex = 0,
89 });
90 }
91 return *this;
92}
93
95{
96 uint64_t signalValue = sync_.getStageValue(frameNumber_, stage);
97 lastSignalValue_ = signalValue;
98
99 signalInfos_.push_back(VkSemaphoreSubmitInfo{
100 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
101 .pNext = nullptr,
102 .semaphore = sync_.getSemaphore(),
103 .value = signalValue,
104 .stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
105 .deviceIndex = 0,
106 });
107
108 return *this;
109}
110
112{
113 if (semaphore != VK_NULL_HANDLE)
114 {
115 signalInfos_.push_back(VkSemaphoreSubmitInfo{
116 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
117 .pNext = nullptr,
118 .semaphore = semaphore,
119 .value = 0, // Binary semaphores use value 0
120 .stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
121 .deviceIndex = 0,
122 });
123 }
124 return *this;
125}
126
128{
129 if (cmdBuffer != VK_NULL_HANDLE)
130 {
131 cmdBufferInfos_.push_back(VkCommandBufferSubmitInfo{
132 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
133 .pNext = nullptr,
134 .commandBuffer = cmdBuffer,
135 .deviceMask = 0,
136 });
137 }
138 return *this;
139}
140
141QueueSubmitBuilder& QueueSubmitBuilder::withCommandBuffers(const std::vector<VkCommandBuffer>& cmdBuffers)
142{
143 for (VkCommandBuffer cmdBuffer : cmdBuffers)
144 {
145 withCommandBuffer(cmdBuffer);
146 }
147 return *this;
148}
149
150VkResult QueueSubmitBuilder::submit(VkQueue queue, VkFence fence)
151{
152 VkSubmitInfo2 submitInfo{
153 .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
154 .pNext = nullptr,
155 .flags = 0,
156 .waitSemaphoreInfoCount = static_cast<uint32_t>(waitInfos_.size()),
157 .pWaitSemaphoreInfos = waitInfos_.empty() ? nullptr : waitInfos_.data(),
158 .commandBufferInfoCount = static_cast<uint32_t>(cmdBufferInfos_.size()),
159 .pCommandBufferInfos = cmdBufferInfos_.empty() ? nullptr : cmdBufferInfos_.data(),
160 .signalSemaphoreInfoCount = static_cast<uint32_t>(signalInfos_.size()),
161 .pSignalSemaphoreInfos = signalInfos_.empty() ? nullptr : signalInfos_.data(),
162 };
163
164 return vkQueueSubmit2(queue, 1, &submitInfo, fence);
165}
166
167} // namespace EngineCore
const TimelineSynchronizer & sync_
QueueSubmitBuilder & withCommandBuffers(const std::vector< VkCommandBuffer > &cmdBuffers)
Adds multiple command buffers to be executed.
VkResult submit(VkQueue queue, VkFence fence=VK_NULL_HANDLE)
Builds and submits to the specified queue.
QueueSubmitBuilder(const TimelineSynchronizer &sync, uint64_t frameNumber)
Constructs a submit builder.
std::vector< VkCommandBufferSubmitInfo > cmdBufferInfos_
QueueSubmitBuilder & waitForResourceReuse(PipelineStage stage, VkPipelineStageFlags2 waitStages)
Convenience: wait for resource reuse (frames-in-flight pattern)
std::vector< VkSemaphoreSubmitInfo > waitInfos_
QueueSubmitBuilder & withCommandBuffer(VkCommandBuffer cmdBuffer)
Adds a command buffer to be executed.
QueueSubmitBuilder & signalBinary(VkSemaphore semaphore)
Signals a binary semaphore at completion (for present)
std::vector< VkSemaphoreSubmitInfo > signalInfos_
QueueSubmitBuilder & waitForBinary(VkSemaphore semaphore, VkPipelineStageFlags2 waitStages)
Adds a binary semaphore wait (for swapchain acquire, etc.)
QueueSubmitBuilder & waitForPrevious(PipelineStage stage, VkPipelineStageFlags2 waitStages)
Convenience: wait for previous frame's stage.
QueueSubmitBuilder & waitFor(PipelineStage stage, VkPipelineStageFlags2 waitStages, uint64_t frameNumber)
Adds a timeline wait for a specific frame's stage (GPU-GPU sync)
QueueSubmitBuilder & signalStage(PipelineStage stage)
Signals the timeline semaphore at a specific stage.
QueueSubmitBuilder & waitForCurrent(PipelineStage stage, VkPipelineStageFlags2 waitStages)
Convenience: wait for same frame's earlier stage.
Centralized timeline semaphore management for the rendering pipeline.
Log category system implementation.
PipelineStage
Extensible pipeline stages for timeline semaphore synchronization.