Split the render graph into multiple files
doesn't compile
This commit is contained in:
parent
2305cb7588
commit
9fe5793dd7
|
@ -0,0 +1,14 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
// Used for attachment description creation for renderpass node
|
||||||
|
enum class SH_ATT_DESC_TYPE
|
||||||
|
{
|
||||||
|
COLOR,
|
||||||
|
COLOR_PRESENT,
|
||||||
|
DEPTH,
|
||||||
|
STENCIL,
|
||||||
|
DEPTH_STENCIL,
|
||||||
|
};
|
||||||
|
}
|
|
@ -7,6 +7,8 @@
|
||||||
#include "Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.h"
|
#include "Graphics/MiddleEnd/Pipeline/SHPipelineLibrary.h"
|
||||||
#include "Graphics/MiddleEnd/Batching/SHSuperBatch.h"
|
#include "Graphics/MiddleEnd/Batching/SHSuperBatch.h"
|
||||||
#include "../MiddleEnd/Batching/SHBatcher.h"
|
#include "../MiddleEnd/Batching/SHBatcher.h"
|
||||||
|
#include "SHRenderGraphNode.h"
|
||||||
|
#include "SHSubpass.h"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
@ -24,223 +26,6 @@ namespace SHADE
|
||||||
class SHRenderGraphNode;
|
class SHRenderGraphNode;
|
||||||
class SHGraphicsGlobalData;
|
class SHGraphicsGlobalData;
|
||||||
|
|
||||||
// Used for attachment description creation for renderpass node
|
|
||||||
enum class SH_ATT_DESC_TYPE
|
|
||||||
{
|
|
||||||
COLOR,
|
|
||||||
COLOR_PRESENT,
|
|
||||||
DEPTH,
|
|
||||||
STENCIL,
|
|
||||||
DEPTH_STENCIL,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class SH_API SHRenderGraphResource
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* PRIVATE MEMBER VARIABLES */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
//! Name of the resource
|
|
||||||
std::string resourceName;
|
|
||||||
|
|
||||||
//! Used for initializing image layouts
|
|
||||||
SH_ATT_DESC_TYPE resourceType;
|
|
||||||
|
|
||||||
//! The resource itself (this is a vector because if the resource happens
|
|
||||||
//! to be a swapchain image, then we need however many frames in flight).
|
|
||||||
//! However when it's not a swapchain image, we want this container to be size 1
|
|
||||||
//! because writing to these images will not interfere with images in the previous
|
|
||||||
//! frame, unlike the swapchain image.
|
|
||||||
std::vector<Handle<SHVkImage>> images;
|
|
||||||
|
|
||||||
//! Views to resources (vector because same rationale as images. see above).
|
|
||||||
std::vector<Handle<SHVkImageView>> imageViews;
|
|
||||||
|
|
||||||
//! Image format
|
|
||||||
vk::Format resourceFormat;
|
|
||||||
|
|
||||||
//! width of the resource
|
|
||||||
uint32_t width;
|
|
||||||
|
|
||||||
//! Height of the resource
|
|
||||||
uint32_t height;
|
|
||||||
|
|
||||||
//! Number of mipmap levels
|
|
||||||
uint8_t mipLevels;
|
|
||||||
public:
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* CTORS AND DTORS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
SHRenderGraphResource(Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::string const& name, SH_ATT_DESC_TYPE type, vk::Format format, uint32_t w, uint32_t h, uint8_t levels, vk::ImageCreateFlagBits createFlags) noexcept;
|
|
||||||
SHRenderGraphResource(SHRenderGraphResource&& rhs) noexcept;
|
|
||||||
SHRenderGraphResource& operator=(SHRenderGraphResource&& rhs) noexcept;
|
|
||||||
~SHRenderGraphResource(void) noexcept;
|
|
||||||
|
|
||||||
friend class SHRenderGraphNode;
|
|
||||||
friend class SHRenderGraph;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class SH_API SHSubpass : public ISelfHandle<SHSubpass>
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
/*---------------------------------------------------------------------*/
|
|
||||||
/* PRIVATE MEMBER VARIABLES */
|
|
||||||
/*---------------------------------------------------------------------*/
|
|
||||||
//! The index of the subpass in the render graph
|
|
||||||
uint32_t subpassIndex;
|
|
||||||
|
|
||||||
//! The parent renderpass that this subpass belongs to
|
|
||||||
Handle<SHRenderGraphNode> parentNode;
|
|
||||||
|
|
||||||
//!
|
|
||||||
Handle<SHSuperBatch> superBatch;
|
|
||||||
|
|
||||||
//! Color attachments
|
|
||||||
std::vector<vk::AttachmentReference> colorReferences;
|
|
||||||
|
|
||||||
//! Depth attachments
|
|
||||||
std::vector<vk::AttachmentReference> depthReferences;
|
|
||||||
|
|
||||||
//! Input attachments
|
|
||||||
std::vector<vk::AttachmentReference> inputReferences;
|
|
||||||
|
|
||||||
//! For getting attachment reference indices using handles
|
|
||||||
std::unordered_map<uint64_t, uint32_t> const* resourceAttachmentMapping;
|
|
||||||
|
|
||||||
//! Pointer to resources in the render graph (for getting handle IDs)
|
|
||||||
std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* ptrToResources;
|
|
||||||
|
|
||||||
//! Sometimes there exists entities that we want to render onto a render target
|
|
||||||
//! but don't want it to come from the batching system. An example would be ImGUI.
|
|
||||||
//! For these entities we want to link a function from the outside and draw them
|
|
||||||
//! after we draw everything from the batch. Because of this, these draw calls
|
|
||||||
//! are always the last things drawn, so DO NOT USE THIS FUNCTIONALITY FOR ANYTHING
|
|
||||||
//! COMPLEX.
|
|
||||||
std::vector<std::function<void(Handle<SHVkCommandBuffer>&)>> exteriorDrawCalls;
|
|
||||||
|
|
||||||
public:
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* CTORS AND DTORS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
SHSubpass(ResourceManager& rm, Handle<SHRenderGraphNode> const& parent, uint32_t index, std::unordered_map<uint64_t, uint32_t> const* mapping, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* ptrToResources) noexcept;
|
|
||||||
SHSubpass(SHSubpass&& rhs) noexcept;
|
|
||||||
SHSubpass& operator=(SHSubpass&& rhs) noexcept;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* PUBLIC MEMBER FUNCTIONS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
// Preparation functions
|
|
||||||
void AddColorOutput(std::string resourceToReference) noexcept;
|
|
||||||
void AddDepthOutput(std::string resourceToReference, SH_ATT_DESC_TYPE attachmentDescriptionType = SH_ATT_DESC_TYPE::DEPTH_STENCIL) noexcept;
|
|
||||||
void AddInput(std::string resourceToReference) noexcept;
|
|
||||||
|
|
||||||
// Runtime functions
|
|
||||||
void Execute(Handle<SHVkCommandBuffer>& commandBuffer, uint32_t frameIndex) noexcept;
|
|
||||||
void AddExteriorDrawCalls(std::function<void(Handle<SHVkCommandBuffer>&)> const& newDrawCall) noexcept;
|
|
||||||
|
|
||||||
void Init (ResourceManager& resourceManager) noexcept;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* GETTERS AND SETTERS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
Handle<SHRenderGraphNode> const& GetParentNode(void) const noexcept;
|
|
||||||
SHSubPassIndex GetIndex() const noexcept;
|
|
||||||
Handle<SHSuperBatch> GetSuperBatch (void) const noexcept;
|
|
||||||
|
|
||||||
|
|
||||||
friend class SHRenderGraphNode;
|
|
||||||
friend class SHRenderGraph;
|
|
||||||
};
|
|
||||||
|
|
||||||
class SH_API SHRenderGraphNode : public ISelfHandle<SHRenderGraphNode>
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* PRIVATE MEMBER VARIABLES */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
ResourceManager& resourceManager;
|
|
||||||
|
|
||||||
//! For Vulkan object creation
|
|
||||||
Handle<SHVkLogicalDevice> logicalDeviceHdl;
|
|
||||||
|
|
||||||
//! Each node will have a renderpass and each renderpass will have its own subpasses.
|
|
||||||
//! These subpasses will execute sequentially.
|
|
||||||
Handle<SHVkRenderpass> renderpass;
|
|
||||||
|
|
||||||
//! Framebuffers used in this renderpass. If renderpass contains usage of a swapchain image
|
|
||||||
//! used for presenting, then we cannot use just 1 framebuffer, we need to have 1 for however many frames in flight.
|
|
||||||
std::vector<Handle<SHVkFramebuffer>> framebuffers;
|
|
||||||
|
|
||||||
//! Nodes that must finish execution before this node is executed will be in this container
|
|
||||||
std::vector<Handle<SHRenderGraphNode>> prereqNodes;
|
|
||||||
|
|
||||||
//! Container of Attachment descriptions
|
|
||||||
std::vector<vk::AttachmentDescription> attachmentDescriptions;
|
|
||||||
|
|
||||||
//! Resources used in this renderpass
|
|
||||||
std::vector<Handle<SHRenderGraphResource>> attResources;
|
|
||||||
|
|
||||||
//! Vector of subpasses
|
|
||||||
std::vector<Handle<SHSubpass>> subpasses;
|
|
||||||
|
|
||||||
//! Descriptions to pass to renderpass for renderpass creation. We want to keep this here because
|
|
||||||
std::vector<vk::SubpassDescription> spDescs;
|
|
||||||
|
|
||||||
//! Subpass dependencies for renderpass creation
|
|
||||||
std::vector<vk::SubpassDependency> spDeps;
|
|
||||||
|
|
||||||
//! For indexing resources fast
|
|
||||||
std::unordered_map<uint64_t, uint32_t> resourceAttachmentMapping;
|
|
||||||
|
|
||||||
//! For indexing subpasses
|
|
||||||
std::map<std::string, uint32_t> subpassIndexing;
|
|
||||||
|
|
||||||
//! Pointer to resources in the render graph (for getting handle IDs)
|
|
||||||
std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* ptrToResources;
|
|
||||||
|
|
||||||
//! Every renderpass will require a pipeline library that will contain pipelines compatible with this renderpass
|
|
||||||
SHPipelineLibrary pipelineLibrary;
|
|
||||||
|
|
||||||
//! Whether or not the node has finished execution
|
|
||||||
bool executed;
|
|
||||||
|
|
||||||
//! Whether or not the node has been configured already or not
|
|
||||||
bool configured;
|
|
||||||
|
|
||||||
SHBatcher batcher;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* PRIVATE MEMBER FUNCTIONS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
void CreateRenderpass (void) noexcept;
|
|
||||||
void CreateFramebuffer(void) noexcept;
|
|
||||||
|
|
||||||
public:
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* CTORS AND DTORS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
SHRenderGraphNode (ResourceManager& rm, Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::vector<Handle<SHRenderGraphResource>> attRes, std::vector<Handle<SHRenderGraphNode>> predecessors, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* resources, Handle<SHGraphicsGlobalData> globalData) noexcept;
|
|
||||||
SHRenderGraphNode(SHRenderGraphNode&& rhs) noexcept;
|
|
||||||
SHRenderGraphNode& operator= (SHRenderGraphNode&& rhs) noexcept;
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* PUBLIC MEMBER FUNCTIONS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
Handle<SHSubpass> AddSubpass (std::string subpassName) noexcept;
|
|
||||||
// TODO: RemoveSubpass()
|
|
||||||
void Execute (Handle<SHVkCommandBuffer>& commandBuffer, uint32_t frameIndex) noexcept;
|
|
||||||
Handle<SHVkPipeline> GetOrCreatePipeline (std::pair<Handle<SHVkShaderModule>, Handle<SHVkShaderModule>> const& vsFsPair, Handle<SHSubpass> subpass) noexcept;
|
|
||||||
void FinaliseBatch(uint32_t frameIndex);
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
/* SETTERS AND GETTERS */
|
|
||||||
/*-----------------------------------------------------------------------*/
|
|
||||||
Handle<SHVkRenderpass> GetRenderpass (void) const noexcept;
|
|
||||||
Handle<SHSubpass> GetSubpass(std::string_view subpassName) const noexcept;
|
|
||||||
friend class SHRenderGraph;
|
|
||||||
};
|
|
||||||
|
|
||||||
class SH_API SHRenderGraph
|
class SH_API SHRenderGraph
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
#include "SHRenderGraphNode.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
class SH_API SHRenderGraphNode : public ISelfHandle<SHRenderGraphNode>
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* PRIVATE MEMBER VARIABLES */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
ResourceManager& resourceManager;
|
||||||
|
|
||||||
|
//! For Vulkan object creation
|
||||||
|
Handle<SHVkLogicalDevice> logicalDeviceHdl;
|
||||||
|
|
||||||
|
//! Each node will have a renderpass and each renderpass will have its own subpasses.
|
||||||
|
//! These subpasses will execute sequentially.
|
||||||
|
Handle<SHVkRenderpass> renderpass;
|
||||||
|
|
||||||
|
//! Framebuffers used in this renderpass. If renderpass contains usage of a swapchain image
|
||||||
|
//! used for presenting, then we cannot use just 1 framebuffer, we need to have 1 for however many frames in flight.
|
||||||
|
std::vector<Handle<SHVkFramebuffer>> framebuffers;
|
||||||
|
|
||||||
|
//! Nodes that must finish execution before this node is executed will be in this container
|
||||||
|
std::vector<Handle<SHRenderGraphNode>> prereqNodes;
|
||||||
|
|
||||||
|
//! Container of Attachment descriptions
|
||||||
|
std::vector<vk::AttachmentDescription> attachmentDescriptions;
|
||||||
|
|
||||||
|
//! Resources used in this renderpass
|
||||||
|
std::vector<Handle<SHRenderGraphResource>> attResources;
|
||||||
|
|
||||||
|
//! Vector of subpasses
|
||||||
|
std::vector<Handle<SHSubpass>> subpasses;
|
||||||
|
|
||||||
|
//! Descriptions to pass to renderpass for renderpass creation. We want to keep this here because
|
||||||
|
std::vector<vk::SubpassDescription> spDescs;
|
||||||
|
|
||||||
|
//! Subpass dependencies for renderpass creation
|
||||||
|
std::vector<vk::SubpassDependency> spDeps;
|
||||||
|
|
||||||
|
//! For indexing resources fast
|
||||||
|
std::unordered_map<uint64_t, uint32_t> resourceAttachmentMapping;
|
||||||
|
|
||||||
|
//! For indexing subpasses
|
||||||
|
std::map<std::string, uint32_t> subpassIndexing;
|
||||||
|
|
||||||
|
//! Pointer to resources in the render graph (for getting handle IDs)
|
||||||
|
std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* ptrToResources;
|
||||||
|
|
||||||
|
//! Every renderpass will require a pipeline library that will contain pipelines compatible with this renderpass
|
||||||
|
SHPipelineLibrary pipelineLibrary;
|
||||||
|
|
||||||
|
//! Whether or not the node has finished execution
|
||||||
|
bool executed;
|
||||||
|
|
||||||
|
//! Whether or not the node has been configured already or not
|
||||||
|
bool configured;
|
||||||
|
|
||||||
|
SHBatcher batcher;
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* PRIVATE MEMBER FUNCTIONS */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
void CreateRenderpass(void) noexcept;
|
||||||
|
void CreateFramebuffer(void) noexcept;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* CTORS AND DTORS */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
SHRenderGraphNode(ResourceManager& rm, Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::vector<Handle<SHRenderGraphResource>> attRes, std::vector<Handle<SHRenderGraphNode>> predecessors, std::unordered_map<std::string, Handle<SHRenderGraphResource>> const* resources, Handle<SHGraphicsGlobalData> globalData) noexcept;
|
||||||
|
SHRenderGraphNode(SHRenderGraphNode&& rhs) noexcept;
|
||||||
|
SHRenderGraphNode& operator= (SHRenderGraphNode&& rhs) noexcept;
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* PUBLIC MEMBER FUNCTIONS */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
Handle<SHSubpass> AddSubpass(std::string subpassName) noexcept;
|
||||||
|
// TODO: RemoveSubpass()
|
||||||
|
void Execute(Handle<SHVkCommandBuffer>& commandBuffer, uint32_t frameIndex) noexcept;
|
||||||
|
Handle<SHVkPipeline> GetOrCreatePipeline(std::pair<Handle<SHVkShaderModule>, Handle<SHVkShaderModule>> const& vsFsPair, Handle<SHSubpass> subpass) noexcept;
|
||||||
|
void FinaliseBatch(uint32_t frameIndex);
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* SETTERS AND GETTERS */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
Handle<SHVkRenderpass> GetRenderpass(void) const noexcept;
|
||||||
|
Handle<SHSubpass> GetSubpass(std::string_view subpassName) const noexcept;
|
||||||
|
friend class SHRenderGraph;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#include "SHRenderGraphResource.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SH_API SHRenderGraphResource
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* PRIVATE MEMBER VARIABLES */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
//! Name of the resource
|
||||||
|
std::string resourceName;
|
||||||
|
|
||||||
|
//! Used for initializing image layouts
|
||||||
|
SH_ATT_DESC_TYPE resourceType;
|
||||||
|
|
||||||
|
//! The resource itself (this is a vector because if the resource happens
|
||||||
|
//! to be a swapchain image, then we need however many frames in flight).
|
||||||
|
//! However when it's not a swapchain image, we want this container to be size 1
|
||||||
|
//! because writing to these images will not interfere with images in the previous
|
||||||
|
//! frame, unlike the swapchain image.
|
||||||
|
std::vector<Handle<SHVkImage>> images;
|
||||||
|
|
||||||
|
//! Views to resources (vector because same rationale as images. see above).
|
||||||
|
std::vector<Handle<SHVkImageView>> imageViews;
|
||||||
|
|
||||||
|
//! Image format
|
||||||
|
vk::Format resourceFormat;
|
||||||
|
|
||||||
|
//! width of the resource
|
||||||
|
uint32_t width;
|
||||||
|
|
||||||
|
//! Height of the resource
|
||||||
|
uint32_t height;
|
||||||
|
|
||||||
|
//! Number of mipmap levels
|
||||||
|
uint8_t mipLevels;
|
||||||
|
public:
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
/* CTORS AND DTORS */
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
SHRenderGraphResource(Handle<SHVkLogicalDevice> const& logicalDevice, Handle<SHVkSwapchain> const& swapchain, std::string const& name, SH_ATT_DESC_TYPE type, vk::Format format, uint32_t w, uint32_t h, uint8_t levels, vk::ImageCreateFlagBits createFlags) noexcept;
|
||||||
|
SHRenderGraphResource(SHRenderGraphResource&& rhs) noexcept;
|
||||||
|
SHRenderGraphResource& operator=(SHRenderGraphResource&& rhs) noexcept;
|
||||||
|
~SHRenderGraphResource(void) noexcept;
|
||||||
|
|
||||||
|
friend class SHRenderGraphNode;
|
||||||
|
friend class SHRenderGraph;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#include "SHSubpass.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue