// Copyright (C) 2022 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // 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_GRAPHICS_FRAMEGRAPH_HPP #define NAZARA_GRAPHICS_FRAMEGRAPH_HPP #include #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 std::size_t AddAttachmentProxy(std::string name, std::size_t attachmentId); inline void AddBackbufferOutput(std::size_t backbufferOutput); inline FramePass& AddPass(std::string name); BakedFrameGraph Bake(); 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 AttachmentIdToPassId = std::unordered_map; using AttachmentIdToTextureId = std::unordered_map; using PassIdToPhysicalPassIndex = std::unordered_map; using TextureBarrier = BakedFrameGraph::TextureBarrier; struct AttachmentProxy { std::size_t attachmentId; std::string name; }; 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 textureBarrier; std::vector passes; }; struct TextureData { std::string name; PixelFormat format; TextureUsageFlags usage; unsigned int width; unsigned int height; }; struct WorkData { std::vector> renderPasses; std::vector physicalPasses; std::vector textures; std::vector texturePool; AttachmentIdToPassId attachmentLastUse; 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(); bool HasAttachment(const std::vector& inputs, std::size_t attachmentIndex) const; void RemoveDuplicatePasses(); std::size_t ResolveAttachmentIndex(std::size_t attachmentIndex) const; std::size_t RegisterTexture(std::size_t attachmentIndex); void ReorderPasses(); void TraverseGraph(std::size_t passIndex); std::vector m_backbufferOutputs; std::vector m_framePasses; std::vector> m_attachments; WorkData m_pending; }; } #include #endif // NAZARA_GRAPHICS_FRAMEGRAPH_HPP