// Copyright (C) 2017 Jérôme Leclercq // This file is part of the "Nazara Engine - Graphics module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_FRAMEGRAPH_HPP #define NAZARA_FRAMEGRAPH_HPP #include #include #include #include #include #include #include #include #include #include #include #include namespace Nz { class NAZARA_GRAPHICS_API FrameGraph { public: FrameGraph() = default; FrameGraph(const FrameGraph&) = delete; FrameGraph(FrameGraph&&) noexcept = default; ~FrameGraph() = default; inline std::size_t AddAttachment(FramePassAttachment attachment); inline FramePass& AddPass(std::string name); BakedFrameGraph Bake(); inline void SetBackbufferOutput(std::size_t backbufferOutput); FrameGraph& operator=(const FrameGraph&) = delete; FrameGraph& operator=(FrameGraph&&) noexcept = default; private: struct PassBarriers; using BarrierList = std::vector; using PassList = std::vector; using AttachmentIdToPassMap = std::unordered_map; using AttachmentIdToTextureId = std::unordered_map; using PassIdToPhysicalPassIndex = std::unordered_map; using TextureTransition = BakedFrameGraph::TextureTransition; struct Barrier { std::size_t textureId; MemoryAccessFlags access; PipelineStageFlags stages; TextureLayout layout; }; struct PassBarriers { std::vector invalidationBarriers; std::vector flushBarriers; }; struct PhysicalPassData { struct Subpass { std::size_t passIndex; }; std::string name; std::vector textureTransitions; std::vector passes; }; struct TextureData { PixelFormat format; TextureUsageFlags usage; unsigned int width; unsigned int height; }; struct WorkData { std::size_t backbufferResourceIndex; std::vector> renderPasses; std::vector physicalPasses; std::vector textures; AttachmentIdToPassMap attachmentReadList; AttachmentIdToPassMap attachmentWriteList; AttachmentIdToTextureId attachmentToTextures; BarrierList barrierList; PassList passList; PassIdToPhysicalPassIndex passIdToPhysicalPassIndex; }; void AssignPhysicalPasses(); void AssignPhysicalTextures(); void BuildBarriers(); void BuildPhysicalBarriers(); void BuildPhysicalPassDependencies(std::size_t colorAttachmentCount, bool hasDepthStencilAttachment, std::vector& renderPassAttachments, std::vector& subpasses, std::vector& dependencies); void BuildPhysicalPasses(); void BuildReadWriteList(); void RemoveDuplicatePasses(); void ReorderPasses(); void TraverseGraph(std::size_t passIndex); std::optional m_backbufferOutput; std::vector m_framePasses; std::vector m_attachments; WorkData m_pending; }; } #include #endif