God I felt so much pain writing this
- Thank god this botchy/hacky resource linking feature between graphs will only be used for a couple of resources. - Setup environment for UI rendering - "Scene" resource is now used in BOTH world render graph and screen render graph. Layouts are setup accordingly. - A very horrible result of this is that linked resources have to be resized in their original graph and it has to be resized BEFORE the graphs linked to it since the framebuffers use their image views. - sigh.
This commit is contained in:
parent
d17a83ab77
commit
95d2836c94
|
@ -156,6 +156,8 @@ namespace SHADE
|
|||
worldCamera->SetLookAt(SHVec3(0.0f, 0.0f, 0.0f), SHVec3(0.0f, 0.0f, -2.0f), SHVec3(0.0f, 1.0f, 0.0f));
|
||||
worldCamera->SetPerspective(90.0f, static_cast<float>(windowDims.first), static_cast<float>(windowDims.second), 0.0f, 100.0f);
|
||||
|
||||
worldCameraDirector = cameraSystem->CreateDirector();
|
||||
|
||||
// Create Default Viewport
|
||||
worldViewport = AddViewport(vk::Viewport(0.0f, 0.0f, static_cast<float>(window->GetWindowSize().first), static_cast<float>(window->GetWindowSize().second), 0.0f, 1.0f));
|
||||
|
||||
|
@ -169,7 +171,7 @@ namespace SHADE
|
|||
}
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* SCENE RENDER GRAPH RESOURCES */
|
||||
/* WORLD RENDER GRAPH RESOURCES */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
// Initialize world render graph
|
||||
worldRenderGraph->Init(device, swapchain, &resourceManager);
|
||||
|
@ -180,7 +182,7 @@ namespace SHADE
|
|||
worldRenderGraph->AddResource("Depth Buffer", { SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL }, windowDims.first, windowDims.second, vk::Format::eD32SfloatS8Uint);
|
||||
worldRenderGraph->AddResource("Entity ID", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR }, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc);
|
||||
worldRenderGraph->AddResource("Light Layer Indices", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc);
|
||||
worldRenderGraph->AddResource("Scene", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, windowDims.first, windowDims.second);
|
||||
worldRenderGraph->AddResource("Scene", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE, SH_RENDER_GRAPH_RESOURCE_FLAGS::SHARED }, windowDims.first, windowDims.second);
|
||||
worldRenderGraph->AddResource("SSAO", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR8Unorm);
|
||||
worldRenderGraph->AddResource("SSAO Blur", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR8Unorm);
|
||||
|
||||
|
@ -257,25 +259,55 @@ namespace SHADE
|
|||
/*-----------------------------------------------------------------------*/
|
||||
gBufferNode->AddNodeCompute(deferredCompositeShader, { "Position", "Normals", "Albedo", "Light Layer Indices", "SSAO Blur", "Scene" });
|
||||
|
||||
// Dummy Node to transition scene render graph resource
|
||||
auto dummyNode = worldRenderGraph->AddNode("Dummy Pass", { "Scene" }, { "Debug Draw" }); // no predecessors
|
||||
auto dummySubpass = dummyNode->AddSubpass("Dummy Subpass");
|
||||
dummySubpass->AddInput("Scene");
|
||||
{
|
||||
//// Dummy Node to transition scene render graph resource
|
||||
//auto dummyNode = worldRenderGraph->AddNode("Dummy Pass", { "Scene" }, { "Debug Draw" }); // no predecessors
|
||||
//auto dummySubpass = dummyNode->AddSubpass("Dummy Subpass");
|
||||
//dummySubpass->AddInput("Scene");
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* GENERATE RENDER GRAPH */
|
||||
/* GENERATE WORLD RENDER GRAPH */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
// Generate world render graph
|
||||
worldRenderGraph->Generate();
|
||||
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* SCREEN RENDER GRAPH */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
// Initialize screen render graph
|
||||
screenRenderGraph = resourceManager.Create<SHRenderGraph>();
|
||||
screenRenderGraph->Init(device, swapchain, &resourceManager);
|
||||
screenRenderGraph->LinkNonOwningResource(worldRenderGraph, "Scene");
|
||||
|
||||
auto screenSpaceNode = screenRenderGraph->AddNode("Screen Space Pass", { "Scene" }, {});
|
||||
auto uiSubpass = screenSpaceNode->AddSubpass("UI");
|
||||
uiSubpass->AddColorOutput("Scene");
|
||||
|
||||
{
|
||||
// Dummy Node to transition scene render graph resource
|
||||
auto dummyNode = screenRenderGraph->AddNode("Dummy Pass", { "Scene" }, { "Screen Space Pass" }); // no predecessors
|
||||
auto dummySubpass = dummyNode->AddSubpass("Dummy Subpass");
|
||||
dummySubpass->AddInput("Scene");
|
||||
}
|
||||
|
||||
|
||||
screenRenderGraph->Generate();
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* BIND RENDER GRAPH TO RENDERER */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
// Add world renderer to default viewport
|
||||
worldRenderer = worldViewport->AddRenderer(resourceManager, swapchain->GetNumImages(), renderContextCmdPools, descPool, SHGraphicsGlobalData::GetDescSetLayouts()[SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS], worldRenderGraph);
|
||||
worldRenderer->SetCamera(worldCamera);
|
||||
worldRenderer->SetCameraDirector(worldCameraDirector);
|
||||
|
||||
// Add screen renderer to default viewport
|
||||
screenRenderer = worldViewport->AddRenderer(resourceManager, swapchain->GetNumImages(), renderContextCmdPools, descPool, SHGraphicsGlobalData::GetDescSetLayouts()[SHGraphicsConstants::DescriptorSetIndex::HIGH_FREQUENCY_GLOBALS], screenRenderGraph);
|
||||
screenRenderer->SetCamera(screenCamera);
|
||||
screenRenderer->SetCameraDirector(worldCameraDirector);
|
||||
|
||||
worldRenderer->SetCameraDirector(cameraSystem->CreateDirector());
|
||||
|
||||
// Create debug draw pipeline
|
||||
debugDrawPipeline = createDebugDrawPipeline(debugDrawNode->GetRenderpass(), debugDrawSubpass);
|
||||
|
@ -322,7 +354,7 @@ namespace SHADE
|
|||
textRenderingSubSystem = resourceManager.Create<SHTextRenderingSubSystem>();
|
||||
|
||||
// initialize the text renderer
|
||||
auto uiNode = worldRenderGraph->GetNode("Screen Space Pass");
|
||||
//auto uiNode = screenRenderGraph->GetNode("Screen Space Pass");
|
||||
//textRenderingSubSystem->Init(device, uiNode->GetRenderpass(), uiNode->GetSubpass("UI"), descPool, textVS, textFS);
|
||||
|
||||
SHFreetypeInstance::Init();
|
||||
|
@ -906,6 +938,7 @@ namespace SHADE
|
|||
|
||||
worldRenderGraph->HandleResize(resizeWidth, resizeHeight);
|
||||
editorRenderGraph->HandleResize(windowDims.first, windowDims.second);
|
||||
screenRenderGraph->HandleResize(resizeWidth, resizeHeight);
|
||||
|
||||
mousePickSystem->HandleResize();
|
||||
postOffscreenRender->HandleResize();
|
||||
|
|
|
@ -32,6 +32,7 @@ of DigiPen Institute of Technology is prohibited.
|
|||
#include "Graphics/MiddleEnd/Interface/SHPostOffscreenRenderSystem.h"
|
||||
#include "Graphics/MiddleEnd/Lights/SHLightingSubSystem.h"
|
||||
#include "Graphics/MiddleEnd/PostProcessing/SHSSAO.h"
|
||||
#include "Camera/SHCameraDirector.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -392,20 +393,20 @@ namespace SHADE
|
|||
#ifdef SHEDITOR
|
||||
Handle<SHViewport> editorViewport;
|
||||
Handle<SHRenderer> editorRenderer;
|
||||
Handle<SHRenderGraph> editorRenderGraph;
|
||||
#endif
|
||||
|
||||
Handle<SHViewport> worldViewport; // Whole screen
|
||||
std::vector<Handle<SHViewport>> viewports; // Additional viewports
|
||||
std::vector<Handle<SHViewport>> viewports; // Additional viewports
|
||||
|
||||
// Temp renderers
|
||||
// Renderers
|
||||
Handle<SHRenderer> worldRenderer;
|
||||
|
||||
Handle<SHRenderer> screenRenderer;
|
||||
|
||||
// Temp Cameras
|
||||
Handle<SHCamera> worldCamera;
|
||||
Handle<SHCamera> screenCamera;
|
||||
DirectorHandle worldCameraDirector;
|
||||
|
||||
|
||||
// Built-In Shaders
|
||||
Handle<SHVkShaderModule> defaultVertShader;
|
||||
|
@ -432,6 +433,10 @@ namespace SHADE
|
|||
|
||||
// Render Graphs
|
||||
Handle<SHRenderGraph> worldRenderGraph;
|
||||
Handle<SHRenderGraph> screenRenderGraph;
|
||||
#ifdef SHEDITOR
|
||||
Handle<SHRenderGraph> editorRenderGraph;
|
||||
#endif
|
||||
|
||||
// Sub systems
|
||||
Handle<SHMousePickSystem> mousePickSystem;
|
||||
|
|
|
@ -80,6 +80,12 @@ namespace SHADE
|
|||
{
|
||||
if (vk::ImageLayout layout = resourceToLink->GetInfoTracker()->GetLayout(node, {}); layout != vk::ImageLayout::eUndefined)
|
||||
finalLayout = layout;
|
||||
|
||||
for (auto& compute : node->nodeComputes)
|
||||
{
|
||||
if (vk::ImageLayout layout = resourceToLink->GetInfoTracker()->GetLayout(compute); layout != vk::ImageLayout::eUndefined)
|
||||
finalLayout = layout;
|
||||
}
|
||||
}
|
||||
|
||||
renderGraphStorage->graphResources->try_emplace(resourceName, resourceToLink);
|
||||
|
@ -588,7 +594,10 @@ namespace SHADE
|
|||
{
|
||||
// resize resources
|
||||
for (auto& [name, resource] : *renderGraphStorage->graphResources)
|
||||
resource->HandleResize(newWidth, newHeight);
|
||||
{
|
||||
if (!renderGraphStorage->nonOwningResourceInitialLayouts.contains (resource.GetId().Raw))
|
||||
resource->HandleResize(newWidth, newHeight);
|
||||
}
|
||||
|
||||
for (auto& node : nodes)
|
||||
{
|
||||
|
|
|
@ -111,7 +111,10 @@ namespace SHADE
|
|||
* However, because it was eventually necessary that some resources had to be shared and its contents carried over to
|
||||
* other graphs, the functionality was implemented through a link function in SHRenderGraph.cpp to facilitate this linkage.
|
||||
* This should ideally be replaced by an implementation more self-contained, perhaps through a higher level class like a canvas
|
||||
* that manage the resources instead and can facilitate such linking of resources.
|
||||
* that manage the resources instead and can facilitate such linking of resources. Either that, or we allow only 1 render graph,
|
||||
* but different matrices (SHRenderer) can be used in different nodes.
|
||||
* - There are also way too many hash maps created for ease of access. This definitely can be cut down.
|
||||
* -
|
||||
*
|
||||
*/
|
||||
|
||||
|
|
|
@ -275,10 +275,18 @@ namespace SHADE
|
|||
nodeComputeResources.push_back(resource);
|
||||
}
|
||||
|
||||
// need to use for tracking resources
|
||||
std::vector<Handle<SHRenderGraphResource>> temp (nodeComputeResources);
|
||||
|
||||
// Create the subpass compute with the resources
|
||||
auto nodeCompute = graphStorage->resourceHub->Create<SHRenderGraphNodeCompute>(graphStorage, computeShaderModule, std::move(nodeComputeResources), std::move (dynamicBufferBindings), nodeComputes.empty());
|
||||
nodeComputes.push_back(nodeCompute);
|
||||
|
||||
for (auto& resource : temp)
|
||||
{
|
||||
resource->GetInfoTracker()->TrackLayout(nodeCompute);
|
||||
}
|
||||
|
||||
return nodeCompute;
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ namespace SHADE
|
|||
// save the resources
|
||||
resources = std::move (subpassComputeResources);
|
||||
|
||||
|
||||
//Get the descriptor set layouts required to allocate. We only want the ones for allocate because
|
||||
//global descriptors are already bound in the main system.
|
||||
auto const& graphResourceLayout = computePipeline->GetPipelineLayout()->GetDescriptorSetLayoutsPipeline()[SHGraphicsConstants::DescriptorSetIndex::RENDERGRAPH_RESOURCE];
|
||||
|
|
|
@ -18,6 +18,11 @@ namespace SHADE
|
|||
}
|
||||
|
||||
|
||||
void SHRenderGraphResource::InfoTracker::TrackLayout(Handle<SHRenderGraphNodeCompute> compute) noexcept
|
||||
{
|
||||
computeTracker.emplace (compute.GetId().Raw);
|
||||
}
|
||||
|
||||
vk::ImageLayout SHRenderGraphResource::InfoTracker::GetLayout(Handle<SHRenderGraphNode> node, Handle<SHSubpass> subpass) const noexcept
|
||||
{
|
||||
NodeSubpassPair nodeSubpassPair = std::pair(node, subpass);
|
||||
|
@ -29,6 +34,14 @@ namespace SHADE
|
|||
return vk::ImageLayout::eUndefined;
|
||||
}
|
||||
|
||||
vk::ImageLayout SHRenderGraphResource::InfoTracker::GetLayout(Handle<SHRenderGraphNodeCompute> compute) const noexcept
|
||||
{
|
||||
if (computeTracker.contains (compute.GetId().Raw))
|
||||
return vk::ImageLayout::eGeneral;
|
||||
else
|
||||
return vk::ImageLayout::eUndefined;
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
/*!
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
#include "Resource/SHHandle.h"
|
||||
#include "Graphics/SHVulkanIncludes.h"
|
||||
#include "SH_API.h"
|
||||
#include <unordered_set>
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -18,6 +19,7 @@ namespace SHADE
|
|||
class SHRenderGraphStorage;
|
||||
class SHRenderGraphNode;
|
||||
class SHSubpass;
|
||||
class SHRenderGraphNodeCompute;
|
||||
|
||||
static constexpr uint32_t NON_SWAPCHAIN_RESOURCE_INDEX = 0;
|
||||
|
||||
|
@ -33,16 +35,21 @@ namespace SHADE
|
|||
//! key here is the render graph node and subpass name combined, value is the layout of the resource at that node and subpass
|
||||
std::unordered_map<std::size_t, vk::ImageLayout> layoutTracker;
|
||||
|
||||
//! if a resource is involved in a compute process, record it here
|
||||
std::unordered_set<uint64_t> computeTracker;
|
||||
|
||||
public:
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* PUBLIC MEMBER FUNCTIONS */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
void TrackLayout (Handle<SHRenderGraphNode> node, Handle<SHSubpass> subpass, vk::ImageLayout layout) noexcept;
|
||||
void TrackLayout (Handle<SHRenderGraphNodeCompute> compute) noexcept;
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* SETTERS AND GETTERS */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
vk::ImageLayout GetLayout (Handle<SHRenderGraphNode> node, Handle<SHSubpass> subpass) const noexcept;
|
||||
vk::ImageLayout GetLayout(Handle<SHRenderGraphNode> node, Handle<SHSubpass> subpass) const noexcept;
|
||||
vk::ImageLayout GetLayout(Handle<SHRenderGraphNodeCompute> compute) const noexcept;
|
||||
};
|
||||
|
||||
private:
|
||||
|
|
Loading…
Reference in New Issue