13 auto* semaphore =
m_outputEdge->getImageAvailableSemaphore(frameIndex);
25 return std::vector<RHI::Fence*>{} ;
29 uint32_t frameIndex)
const
34 return std::vector<RHI::Semaphore*>{} ;
52 auto* fence = edge->getFence(frameIndex);
53 auto* semaphore = edge->getRenderFinishedSemaphore(frameIndex);
81 for (uint32_t i = 0; i < newMaxFrameInFlight; ++i) {
82 auto cmdBuf =
m_pool->createCommandBuffer();
119 cmdBuf->clearWaitSemaphores();
120 cmdBuf->signalSemaphores().clear();
124 if (
auto* semaphore = inputEdge->getImageAvailableSemaphore(frameIndex)) {
133 auto* semaphore = outputEdge->getRenderFinishedSemaphore(frameIndex);
135 cmdBuf->addSignalSemaphore(semaphore);
138 auto* fence = outputEdge->getFence(frameIndex);
140 cmdBuf->fence(fence);
155 semaphore->release();
159 for (uint32_t i = 0; i < newMaxFrameInFlight; ++i) {
171 semaphore->release();
175 for (uint32_t i = 0; i < newMaxFrameInFlight; ++i) {
182 if (
m_fences.size() != newMaxFrameInFlight) {
188 m_fences.reserve(newMaxFrameInFlight);
189 for (uint32_t i = 0; i < newMaxFrameInFlight; ++i) {
191 fence->createSignaled();
214 auto inputNode = std::make_unique<CommandBufferNodes::InputFromWindow>(window);
215 auto* nodePtr = inputNode.get();
217 m_nodes.push_back(std::move(inputNode));
230 auto outputNode = std::make_unique<CommandBufferNodes::OutputToWindow>(window);
231 auto* nodePtr = outputNode.get();
233 m_nodes.push_back(std::move(outputNode));
239 const std::vector<NodeRef>& predecessors)
241 for (
const auto& pred : predecessors) {
254 const std::vector<NodeRef>& successors)
256 for (
const auto& succ : successors) {
271 auto edge = std::make_unique<CommandBufferEdges::InputFromWindow>(
m_semaphorePool);
272 auto* edgePtr = edge.get();
274 edgePtr->setSourceNode(windowInputNode);
275 edgePtr->setTargetNode(buffer);
278 windowInputNode->addOutputEdge(edgePtr);
281 m_edges.push_back(std::move(edge));
283 windowInputNode->fillAllSynchronization();
290 auto* edgePtr = edge.get();
292 edgePtr->setSourceNode(buffer);
293 edgePtr->setTargetNode(windowOutputNode);
297 windowOutputNode->addInputEdge(edgePtr);
299 m_edges.push_back(std::move(edge));
301 windowOutputNode->fillAllSynchronization();
313 node->fillAllSynchronization();
323 wnd->clearRenderFinshSemaphores();
326 wnd->addRenderFinshSemaphore(semaphore);
338 wnd->clearRenderFinshFences();
341 wnd->addRenderFinshFence(fence);
357 const std::vector<NodeRef>& successors)
359 auto newBuffer = std::make_unique<CommandBufferNodes::CommandBuffer>(
m_cmdPool);
360 auto* bufferPtr = newBuffer.get();
362 m_nodes.push_back(std::move(newBuffer));
367 bufferPtr->fillAllSynchronization();
SemaphorePool * m_semaphorePool
std::vector< RHI::Semaphore * > m_renderFinished
std::vector< RHI::Fence * > m_fences
void updateSynchronization(uint32_t newMaxFrameInFlight) override
RHI::CommandPool * m_cmdPool
SemaphorePool * m_semaphorePool
void connectWindowPredecessor(CommandBufferNodes::CommandBuffer *buffer, Window *window)
void connectSuccessors(CommandBufferNodes::CommandBuffer *buffer, const std::vector< NodeRef > &successors)
std::vector< std::unique_ptr< CommandBufferNodes::NodeBase > > m_nodes
void connectPredecessors(CommandBufferNodes::CommandBuffer *buffer, const std::vector< NodeRef > &predecessors)
uint32_t m_maxFrameInFlight
CommandBufferToken addBuffer(const std::vector< NodeRef > &predecessors, const std::vector< NodeRef > &successors)
RHI::CommandBuffer * getCommandBuffer(CommandBufferToken token) const
CommandBufferNodes::OutputToWindow * getOrCreateWindowOutputNode(Window *window)
std::set< Window * > m_windows
std::unordered_map< Window *, CommandBufferNodes::InputFromWindow * > m_windowInputNodes
std::vector< std::unique_ptr< CommandBufferEdges::EdgeBase > > m_edges
std::unordered_map< Window *, CommandBufferNodes::OutputToWindow * > m_windowOutputNodes
void maxFrameInFlight(uint32_t max)
CommandBufferNodes::InputFromWindow * getOrCreateWindowInputNode(Window *window)
void connectWindowSuccessor(CommandBufferNodes::CommandBuffer *buffer, Window *window)
CommandBufferGraph(Device *device)
RHI::CommandPool * m_pool
RHI::CommandBuffer * getCommandBuffer(uint32_t frameIndex) const
std::vector< CommandBufferEdges::EdgeBase * > m_outputEdges
void fillSynchronization(uint32_t frameIndex) override
void updateSynchronization(uint32_t newMaxFrameInFlight) override
CommandBuffer(RHI::CommandPool *pool)
std::vector< RHI::CommandBuffer * > m_cmdBuffers
std::vector< CommandBufferEdges::EdgeBase * > m_inputEdges
void addInputEdge(CommandBufferEdges::EdgeBase *edge) override
void addOutputEdge(CommandBufferEdges::EdgeBase *edge) override
void markFrameClean(uint32_t frameIndex)
std::vector< uint8_t > m_frameDirty
void fillSynchronization(uint32_t frameIndex) override
std::vector< CommandBufferEdges::OutputToWindow * > m_inputEdges
std::vector< RHI::Fence * > getCollectedFence(uint32_t frameIndex) const
std::vector< std::vector< RHI::Semaphore * > > m_collectedRenderFinished
std::vector< std::vector< RHI::Fence * > > m_collectedFences
std::vector< RHI::Semaphore * > getCollectedRenderFinishedSemaphore(uint32_t frameIndex) const
CommandBufferNodes::CommandBuffer * CommandBufferToken