13 auto* semaphore =
m_outputEdge->getImageAvailableSemaphore(frameIndex);
25 return std::vector<RHI::Fence*>{} ;
29 uint32_t frameIndex)
const
34 return std::vector<RHI::Semaphore*>{} ;
53 auto* fence = edge->getFence(frameIndex);
54 auto* semaphore = edge->getRenderFinishedSemaphore(frameIndex);
90 for (uint32_t i = 0; i < newMaxFrameInFlight; ++i) {
91 auto cmdBuf =
m_pool->createCommandBuffer();
128 cmdBuf->clearWaitSemaphores();
129 cmdBuf->signalSemaphores().clear();
133 if (
auto* semaphore = inputEdge->getImageAvailableSemaphore(frameIndex)) {
142 auto* semaphore = outputEdge->getRenderFinishedSemaphore(frameIndex);
144 cmdBuf->addSignalSemaphore(semaphore);
147 auto* fence = outputEdge->getFence(frameIndex);
149 cmdBuf->fence(fence);
164 semaphore->release();
168 for (uint32_t i = 0; i < newMaxFrameInFlight; ++i) {
180 semaphore->release();
184 for (uint32_t i = 0; i < newMaxFrameInFlight; ++i) {
191 if (
m_fences.size() != newMaxFrameInFlight) {
197 m_fences.reserve(newMaxFrameInFlight);
198 for (uint32_t i = 0; i < newMaxFrameInFlight; ++i) {
200 fence->createSignaled();
246 const std::vector<NodeRef>& predecessors)
248 for (
const auto& pred : predecessors) {
261 const std::vector<NodeRef>& successors)
263 for (
const auto& succ : successors) {
278 auto edge = std::make_unique<CommandBufferEdges::InputFromWindow>(
m_semaphorePool);
279 auto* edgePtr = edge.get();
281 edgePtr->setSourceNode(windowInputNode);
282 edgePtr->setTargetNode(buffer);
285 windowInputNode->addOutputEdge(edgePtr);
288 m_edges.insert(std::move(edge));
290 windowInputNode->fillAllSynchronization();
297 auto* edgePtr = edge.get();
299 edgePtr->setSourceNode(buffer);
300 edgePtr->setTargetNode(windowOutputNode);
304 windowOutputNode->addInputEdge(edgePtr);
306 m_edges.insert(std::move(edge));
308 windowOutputNode->fillAllSynchronization();
320 node->fillAllSynchronization();
330 wnd->clearRenderFinshSemaphores();
333 wnd->addRenderFinshSemaphore(semaphore);
345 wnd->clearRenderFinshFences();
348 wnd->addRenderFinshFence(fence);
364 const std::vector<NodeRef>& successors)
373 bufferPtr->fillAllSynchronization();
380 inputEdge->getSourceNode()->removeOutputEdge(edge);
381 inputEdge->getSourceNode()->fillAllSynchronization();
382 inputEdge->getTargetNode()->removeInputEdge(edge);
383 inputEdge->getTargetNode()->fillAllSynchronization();
385 [edge](
const std::unique_ptr<CommandBufferEdges::EdgeBase>& ptr) {
386 return ptr.get() == edge;
393 outputEdge->getSourceNode()->removeOutputEdge(edge);
394 outputEdge->getSourceNode()->fillAllSynchronization();
395 outputEdge->getTargetNode()->removeInputEdge(edge);
396 outputEdge->getTargetNode()->fillAllSynchronization();
398 [edge](
const std::unique_ptr<CommandBufferEdges::EdgeBase>& ptr) {
399 return ptr.get() == edge;
412 for (
auto& edge : outputEdge) {
416 for (
auto& edge : inputEdge) {
#define FCT_NEW(type,...)
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::unordered_set< CommandBufferNodes::NodeBase * > m_nodes
void connectPredecessors(CommandBufferNodes::CommandBuffer *buffer, const std::vector< NodeRef > &predecessors)
uint32_t m_maxFrameInFlight
void removeBuffer(CommandBufferToken token)
void removeEdge(CommandBufferEdges::EdgeBase *edge)
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::unordered_map< Window *, CommandBufferNodes::OutputToWindow * > m_windowOutputNodes
void maxFrameInFlight(uint32_t max)
CommandBufferNodes::InputFromWindow * getOrCreateWindowInputNode(Window *window)
void connectWindowSuccessor(CommandBufferNodes::CommandBuffer *buffer, Window *window)
std::unordered_set< std::unique_ptr< CommandBufferEdges::EdgeBase > > m_edges
CommandBufferGraph(Device *device)
std::vector< CommandBufferEdges::EdgeBase * > & getInputEdges()
std::vector< CommandBufferEdges::EdgeBase * > & getOutputEdges()
RHI::CommandPool * m_pool
RHI::CommandBuffer * getCommandBuffer(uint32_t frameIndex) const
std::vector< CommandBufferEdges::EdgeBase * > m_outputEdges
~CommandBuffer() override
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