Steps in the rendering process are now highlighted and named for debugging tools
This commit is contained in:
parent
3b90c84a85
commit
d8ee991213
|
@ -441,9 +441,12 @@ namespace SHADE
|
|||
|
||||
ImGui_ImplVulkan_DestroyFontUploadObjects();
|
||||
|
||||
renderGraph->GetNode("ImGui Node")->GetSubpass("ImGui Draw")->AddExteriorDrawCalls([](Handle<SHVkCommandBuffer>& cmd) {
|
||||
renderGraph->GetNode("ImGui Node")->GetSubpass("ImGui Draw")->AddExteriorDrawCalls([](Handle<SHVkCommandBuffer>& cmd)
|
||||
{
|
||||
cmd->BeginLabeledSegment("ImGui Draw");
|
||||
ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), cmd->GetVkCommandBuffer());
|
||||
});
|
||||
cmd->EndLabeledSegment();
|
||||
});
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -105,6 +105,9 @@ namespace SHADE
|
|||
|
||||
// Set the state to recording if the call above succeeded.
|
||||
cmdBufferState = SH_CMD_BUFFER_STATE::RECORDING;
|
||||
|
||||
// Reset segment count
|
||||
segmentDepth = 0;
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
|
@ -507,6 +510,41 @@ namespace SHADE
|
|||
SetState(SH_CMD_BUFFER_STATE::PENDING);
|
||||
}
|
||||
|
||||
void SHVkCommandBuffer::BeginLabeledSegment(const std::string& label) noexcept
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
static const std::array SEGMENT_COLOURS =
|
||||
{
|
||||
SHColour::LIGHTPINK,
|
||||
SHColour::LIGHTBLUE,
|
||||
SHColour::LIGHTGREEN,
|
||||
SHColour::YELLOW,
|
||||
SHColour::PINK,
|
||||
SHColour::TEAL,
|
||||
SHColour::LIME,
|
||||
SHColour::ORANGE,
|
||||
SHColour::VIOLET,
|
||||
SHColour::MAROON,
|
||||
SHColour::DARKGREEN,
|
||||
SHColour::SANDYBROWN
|
||||
};
|
||||
|
||||
const SHColour COLOR = SEGMENT_COLOURS[segmentDepth];
|
||||
++segmentDepth;
|
||||
if (segmentDepth >= static_cast<int>(SEGMENT_COLOURS.size()))
|
||||
segmentDepth = 0;
|
||||
vkCommandBuffer.beginDebugUtilsLabelEXT(vk::DebugUtilsLabelEXT().setPLabelName(label.data()).setColor({ COLOR.x, COLOR.y, COLOR.z, COLOR.w }));
|
||||
#endif
|
||||
}
|
||||
|
||||
void SHVkCommandBuffer::EndLabeledSegment() noexcept
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
vkCommandBuffer.endDebugUtilsLabelEXT();
|
||||
segmentDepth = std::max(segmentDepth - 1, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
//void SHVkCommandBuffer::PipelineBarrier(vk::PipelineStageFlags ) const noexcept
|
||||
//{
|
||||
// //vkCommandBuffer.pipelineBarrier()
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "Resource/SHResourceLibrary.h"
|
||||
#include "Graphics/Pipeline/SHVkPipelineLayout.h"
|
||||
#include "Graphics/Pipeline/SHPipelineType.h"
|
||||
#include "Math/SHColour.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -80,6 +81,10 @@ namespace SHADE
|
|||
//! The push constant data for the command buffer
|
||||
uint8_t pushConstantData[PUSH_CONSTANT_SIZE];
|
||||
|
||||
#ifdef _DEBUG
|
||||
int segmentDepth;
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* PRIVATE MEMBER FUNCTIONS */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
|
@ -107,7 +112,7 @@ namespace SHADE
|
|||
void Reset(void);
|
||||
|
||||
// Begins and Ends
|
||||
void BeginRecording (void) noexcept;
|
||||
void BeginRecording () noexcept;
|
||||
void EndRecording (void) noexcept;
|
||||
void BeginRenderpass (Handle<SHVkRenderpass> const& renderpassHdl, Handle<SHVkFramebuffer> const& framebufferHdl, vk::Offset2D offset = {0, 0}, vk::Extent2D extent = {0, 0}) noexcept;
|
||||
void EndRenderpass (void) noexcept;
|
||||
|
@ -148,6 +153,10 @@ namespace SHADE
|
|||
bool IsReadyToSubmit (void) const noexcept;
|
||||
void HandlePostSubmit (void) noexcept;
|
||||
|
||||
// Debugging
|
||||
void BeginLabeledSegment(const std::string& label) noexcept;
|
||||
void EndLabeledSegment() noexcept;
|
||||
|
||||
// Push Constant variable setting
|
||||
template <typename T>
|
||||
void SetPushConstantVariable(std::string variableName, T const& data, SH_PIPELINE_TYPE bindPoint) noexcept
|
||||
|
|
|
@ -427,6 +427,7 @@ namespace SHADE
|
|||
|
||||
// Bind all required objects before drawing
|
||||
static std::array<uint32_t, 1> dynamicOffset{ 0 };
|
||||
cmdBuffer->BeginLabeledSegment("SHBatch");
|
||||
cmdBuffer->BindPipeline(pipeline);
|
||||
cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::TRANSFORM, transformDataBuffer[frameIndex], 0);
|
||||
cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::INTEGER_DATA, instancedIntegerBuffer[frameIndex], 0);
|
||||
|
@ -441,6 +442,7 @@ namespace SHADE
|
|||
);
|
||||
}
|
||||
cmdBuffer->DrawMultiIndirect(drawDataBuffer[frameIndex], static_cast<uint32_t>(drawData.size()));
|
||||
cmdBuffer->EndLabeledSegment();
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------------*/
|
||||
|
|
|
@ -98,6 +98,7 @@ namespace SHADE
|
|||
// Don't draw if no points
|
||||
if (numPoints[FRAME_IDX] > 0)
|
||||
{
|
||||
cmdBuffer->BeginLabeledSegment("SHDebugDraw");
|
||||
cmdBuffer->BindPipeline(GFX_SYSTEM->GetDebugDrawPipeline());
|
||||
cmdBuffer->SetLineWidth(LineWidth);
|
||||
cmdBuffer->BindVertexBuffer(0, vertexBuffers[FRAME_IDX], 0);
|
||||
|
@ -113,10 +114,12 @@ namespace SHADE
|
|||
// Don't draw if no points
|
||||
if (numPersistentPoints[FRAME_IDX] > 0)
|
||||
{
|
||||
cmdBuffer->BeginLabeledSegment("SHDebugDraw (Persistent)");
|
||||
cmdBuffer->BindPipeline(GFX_SYSTEM->GetDebugDrawDepthPipeline());
|
||||
cmdBuffer->SetLineWidth(LineWidth);
|
||||
cmdBuffer->BindVertexBuffer(0, persistentVertexBuffers[FRAME_IDX], 0);
|
||||
cmdBuffer->DrawArrays(numPersistentPoints[FRAME_IDX], 1, 0, 0);
|
||||
cmdBuffer->EndLabeledSegment();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/************************************************************************************//*!
|
||||
\file SHGraphicsSystem.cpp
|
||||
\file SHGrphicsSystem.cpp
|
||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
||||
\par email: kahwei.tng\@digipen.edu
|
||||
\date Aug 21, 2022
|
||||
|
@ -164,7 +164,7 @@ namespace SHADE
|
|||
/* SCENE RENDER GRAPH RESOURCES */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
// Initialize world render graph
|
||||
worldRenderGraph->Init(device, swapchain);
|
||||
worldRenderGraph->Init("World Render Graph", device, swapchain);
|
||||
worldRenderGraph->AddResource("Position", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat);
|
||||
worldRenderGraph->AddResource("Normals", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat);
|
||||
//worldRenderGraph->AddResource("Tangents", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat);
|
||||
|
@ -331,7 +331,7 @@ namespace SHADE
|
|||
for (uint32_t i = 0; i < renderContextCmdPools.size(); ++i)
|
||||
renderContextCmdPools[i] = renderContext.GetFrameData(i).cmdPoolHdls[0];
|
||||
|
||||
editorRenderGraph->Init(device, swapchain);
|
||||
editorRenderGraph->Init("Editor Render Graph", device, swapchain);
|
||||
editorRenderGraph->AddResource("Present", { SH_ATT_DESC_TYPE_FLAGS::COLOR_PRESENT }, windowDims.first, windowDims.second);
|
||||
|
||||
|
||||
|
|
|
@ -353,7 +353,7 @@ namespace SHADE
|
|||
|
||||
*/
|
||||
/***************************************************************************/
|
||||
void SHRenderGraph::Init(Handle<SHVkLogicalDevice> logicalDevice, Handle<SHVkSwapchain> swapchain) noexcept
|
||||
void SHRenderGraph::Init(std::string graphName, Handle<SHVkLogicalDevice> logicalDevice, Handle<SHVkSwapchain> swapchain) noexcept
|
||||
{
|
||||
resourceManager = std::make_shared<SHResourceHub>();
|
||||
|
||||
|
@ -365,6 +365,8 @@ namespace SHADE
|
|||
|
||||
renderGraphStorage->resourceManager = resourceManager;
|
||||
renderGraphStorage->descriptorPool = logicalDevice->CreateDescriptorPools();
|
||||
|
||||
name = std::move(graphName);
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
|
@ -390,6 +392,7 @@ namespace SHADE
|
|||
, nodeIndexing{ std::move(rhs.nodeIndexing) }
|
||||
, nodes{ std::move(rhs.nodes) }
|
||||
, resourceManager{ std::move(rhs.resourceManager) }
|
||||
, name { std::move(rhs.name) }
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -403,6 +406,7 @@ namespace SHADE
|
|||
nodeIndexing = std::move(rhs.nodeIndexing);
|
||||
nodes = std::move(rhs.nodes);
|
||||
resourceManager = std::move(rhs.resourceManager);
|
||||
name = std::move(rhs.name);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
@ -516,8 +520,10 @@ namespace SHADE
|
|||
// better way to manage these
|
||||
void SHRenderGraph::Execute(uint32_t frameIndex, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkDescriptorPool> descPool) noexcept
|
||||
{
|
||||
cmdBuffer->BeginLabeledSegment(name);
|
||||
for (auto& node : nodes)
|
||||
node->Execute(cmdBuffer, descPool, frameIndex);
|
||||
cmdBuffer->EndLabeledSegment();
|
||||
}
|
||||
|
||||
void SHRenderGraph::FinaliseBatch(uint32_t frameIndex, Handle<SHVkDescriptorPool> descPool)
|
||||
|
|
|
@ -69,6 +69,9 @@ namespace SHADE
|
|||
//! Resource library for graph handles
|
||||
std::shared_ptr<SHResourceHub> resourceManager;
|
||||
|
||||
//! Name of the RenderGraph
|
||||
std::string name;
|
||||
|
||||
public:
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* CTORS AND DTORS */
|
||||
|
@ -81,7 +84,7 @@ namespace SHADE
|
|||
/*-----------------------------------------------------------------------*/
|
||||
/* PUBLIC MEMBER FUNCTIONS */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
void Init (Handle<SHVkLogicalDevice> logicalDevice, Handle<SHVkSwapchain> swapchain) noexcept;
|
||||
void Init (std::string graphName, Handle<SHVkLogicalDevice> logicalDevice, Handle<SHVkSwapchain> swapchain) noexcept;
|
||||
void AddResource(std::string resourceName, std::initializer_list<SH_ATT_DESC_TYPE_FLAGS> typeFlags, uint32_t w = static_cast<uint32_t>(-1), uint32_t h = static_cast<uint32_t>(-1), vk::Format format = vk::Format::eB8G8R8A8Unorm, uint8_t levels = 1, vk::ImageUsageFlagBits usageFlags = {}, vk::ImageCreateFlagBits createFlags = {});
|
||||
Handle<SHRenderGraphNode> AddNode (std::string nodeName, std::initializer_list<ResourceInstruction> resourceInstruction, std::initializer_list<std::string> predecessorNodes) noexcept;
|
||||
|
||||
|
|
|
@ -201,6 +201,7 @@ namespace SHADE
|
|||
|
||||
void SHSubpass::Execute(Handle<SHVkCommandBuffer>& commandBuffer, Handle<SHVkDescriptorPool> descPool, uint32_t frameIndex) noexcept
|
||||
{
|
||||
commandBuffer->BeginLabeledSegment(name);
|
||||
// Ensure correct transforms are provided
|
||||
superBatch->UpdateBuffers(frameIndex, descPool);
|
||||
|
||||
|
@ -212,7 +213,7 @@ namespace SHADE
|
|||
{
|
||||
drawCall(commandBuffer);
|
||||
}
|
||||
|
||||
commandBuffer->EndLabeledSegment();
|
||||
}
|
||||
|
||||
void SHSubpass::HandleResize(void) noexcept
|
||||
|
|
Loading…
Reference in New Issue