1#ifndef COMMANDBUFFERGRAPH_H
2#define COMMANDBUFFERGRAPH_H
162 throw std::runtime_error(
"InputFromWindow node can only have one output edge");
167 throw std::runtime_error(
"InputFromWindow node can only accept InputFromWindow edge type");
172 throw std::runtime_error(
"InputFromWindow node cannot accept input edges");
208 throw std::runtime_error(
"OutputToWindow node can only accept OutputToWindow edge type");
213 throw std::runtime_error(
"OutputToWindow node cannot accept output edges");
221 static const std::vector<RHI::Fence*> empty;
229 static const std::vector<RHI::Semaphore*> empty;
267 std::vector<std::unique_ptr<CommandBufferNodes::NodeBase>>
m_nodes;
268 std::vector<std::unique_ptr<CommandBufferEdges::EdgeBase>>
m_edges;
294 const std::vector<NodeRef>& predecessors,
295 const std::vector<NodeRef>& successors);
SemaphorePool * m_semaphorePool
virtual void updateSynchronization(uint32_t newMaxFrameInFlight)=0
EdgeBase(SemaphorePool *semaphorePool)
virtual ~EdgeBase()=default
CommandBufferNodes::CommandBuffer * m_sourceNode
RHI::Fence * getFence(uint32_t frameIndex) const
void setTargetNode(CommandBufferNodes::OutputToWindow *target)
std::vector< RHI::Semaphore * > m_renderFinished
CommandBufferNodes::CommandBuffer * getSourceNode() const
std::vector< RHI::Fence * > m_fences
RHI::Semaphore * getRenderFinishedSemaphore(uint32_t frameIndex) const
void setSourceNode(CommandBufferNodes::CommandBuffer *source)
void updateSynchronization(uint32_t newMaxFrameInFlight) override
CommandBufferNodes::OutputToWindow * m_targetNode
OutputToWindow(FencePool *fencePool, SemaphorePool *semaphorePool)
CommandBufferNodes::OutputToWindow * getTargetNode() const
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
virtual void fillAllSynchronization()
virtual ~NodeBase()=default
virtual void updateSynchronization(uint32_t newMaxFrameInFlight)=0
void markFrameClean(uint32_t frameIndex)
std::vector< uint8_t > m_frameDirty
void markAllFramesDirty()
virtual void addOutputEdge(CommandBufferEdges::EdgeBase *edge)
void markFrameDirty(uint32_t frameIndex)
virtual void fillSynchronization(uint32_t frameIndex)
virtual void addInputEdge(CommandBufferEdges::EdgeBase *edge)
void fillSynchronization(uint32_t frameIndex) override
std::vector< CommandBufferEdges::OutputToWindow * > m_inputEdges
void addOutputEdge(CommandBufferEdges::EdgeBase *edge) override
std::vector< RHI::Fence * > getCollectedFence(uint32_t frameIndex) const
OutputToWindow(Window *window)
void updateSynchronization(uint32_t newMaxFrameInFlight) override
void addInputEdge(CommandBufferEdges::EdgeBase *edge) override
std::vector< std::vector< RHI::Semaphore * > > m_collectedRenderFinished
const std::vector< RHI::Semaphore * > & getCollectedRenderFinishedSemaphores(uint32_t frameIndex) const
const std::vector< RHI::Fence * > & getCollectedFences(uint32_t frameIndex) const
std::vector< std::vector< RHI::Fence * > > m_collectedFences
std::vector< RHI::Semaphore * > getCollectedRenderFinishedSemaphore(uint32_t frameIndex) const
CommandBufferNodes::CommandBuffer * CommandBufferToken
NodeRef(CommandBufferNodes::CommandBuffer *cb)
CommandBufferNodes::CommandBuffer * commandBuffer