14 VkPipelineStageFlags2 waitStages,
17 uint64_t waitValue =
sync_.getStageValue(frameNumber, stage);
20 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
22 .semaphore =
sync_.getSemaphore(),
24 .stageMask = waitStages,
33 VkPipelineStageFlags2 waitStages)
40 VkPipelineStageFlags2 waitStages)
43 if (waitValue.has_value())
46 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
48 .semaphore =
sync_.getSemaphore(),
49 .value = waitValue.value(),
50 .stageMask = waitStages,
59 VkPipelineStageFlags2 waitStages)
62 if (waitValue.has_value())
65 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
67 .semaphore =
sync_.getSemaphore(),
68 .value = waitValue.value(),
69 .stageMask = waitStages,
77 VkSemaphore semaphore,
78 VkPipelineStageFlags2 waitStages)
80 if (semaphore != VK_NULL_HANDLE)
83 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
85 .semaphore = semaphore,
87 .stageMask = waitStages,
100 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
102 .semaphore =
sync_.getSemaphore(),
103 .value = signalValue,
104 .stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
113 if (semaphore != VK_NULL_HANDLE)
116 .sType = VK_STRUCTURE_TYPE_SEMAPHORE_SUBMIT_INFO,
118 .semaphore = semaphore,
120 .stageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
129 if (cmdBuffer != VK_NULL_HANDLE)
132 .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_SUBMIT_INFO,
134 .commandBuffer = cmdBuffer,
143 for (VkCommandBuffer cmdBuffer : cmdBuffers)
152 VkSubmitInfo2 submitInfo{
153 .sType = VK_STRUCTURE_TYPE_SUBMIT_INFO_2,
156 .waitSemaphoreInfoCount =
static_cast<uint32_t
>(
waitInfos_.size()),
158 .commandBufferInfoCount =
static_cast<uint32_t
>(
cmdBufferInfos_.size()),
160 .signalSemaphoreInfoCount =
static_cast<uint32_t
>(
signalInfos_.size()),
164 return vkQueueSubmit2(queue, 1, &submitInfo, fence);
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_
uint64_t lastSignalValue_
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.