Renderer/CommandBuffer: Add support for InsertDebugLabel

This commit is contained in:
SirLynix 2023-09-06 13:24:31 +02:00
parent 07d3ccd75d
commit 5f8b7b361e
10 changed files with 51 additions and 1 deletions

View File

@ -64,6 +64,8 @@ namespace Nz
void Execute();
inline void InsertDebugLabel(std::string_view label, const Color& color);
inline std::size_t GetBindingIndex() const;
inline std::size_t GetPoolIndex() const;
inline const OpenGLCommandPool& GetOwner() const;
@ -94,6 +96,7 @@ namespace Nz
cb(DrawCommand) \
cb(DrawIndexedCommand) \
cb(EndDebugRegionCommand) \
cb(InsertDebugLabelCommand) \
cb(MemoryBarrier) \
lastCb(SetFrameBufferCommand) \
@ -124,6 +127,7 @@ namespace Nz
inline void Execute(const GL::Context* context, const DrawCommand& command);
inline void Execute(const GL::Context* context, const DrawIndexedCommand& command);
inline void Execute(const GL::Context* context, const EndDebugRegionCommand& command);
inline void Execute(const GL::Context* context, const InsertDebugLabelCommand& command);
inline void Execute(const GL::Context* context, const MemoryBarrier& command);
inline void Execute(const GL::Context*& context, const SetFrameBufferCommand& command);
@ -237,6 +241,12 @@ namespace Nz
{
};
struct InsertDebugLabelCommand
{
std::string label;
Color color;
};
struct MemoryBarrier
{
GLbitfield barriers;

View File

@ -188,6 +188,15 @@ namespace Nz
m_commands.emplace_back(EndDebugRegionCommand{});
}
inline void OpenGLCommandBuffer::InsertDebugLabel(std::string_view label, const Color& color)
{
InsertDebugLabelCommand debugLabelCommand;
debugLabelCommand.color = color;
debugLabelCommand.label = label;
m_commands.emplace_back(std::move(debugLabelCommand));
}
inline std::size_t OpenGLCommandBuffer::GetBindingIndex() const
{
return m_bindingIndex;

View File

@ -52,6 +52,8 @@ namespace Nz
void EndDebugRegion() override;
void EndRenderPass() override;
void InsertDebugLabel(std::string_view label, const Color& color) override;
void NextSubpass() override;
void PreTransferBarrier() override;

View File

@ -78,6 +78,7 @@ typedef void (GL_APIENTRYP PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLch
cb(glCreateProgram, PFNGLCREATEPROGRAMPROC) \
cb(glCreateShader, PFNGLCREATESHADERPROC) \
cb(glCullFace, PFNGLCULLFACEPROC) \
cb(glDebugMessageInsert, PFNGLDEBUGMESSAGEINSERTPROC) \
cb(glDeleteBuffers, PFNGLDELETEBUFFERSPROC) \
cb(glDeleteFramebuffers, PFNGLDELETEFRAMEBUFFERSPROC) \
cb(glDeleteProgram, PFNGLDELETEPROGRAMPROC) \

View File

@ -70,6 +70,8 @@ namespace Nz
virtual void EndDebugRegion() = 0;
virtual void EndRenderPass() = 0;
virtual void InsertDebugLabel(std::string_view label, const Color& color) = 0;
virtual void NextSubpass() = 0;
virtual void PreTransferBarrier() = 0;

View File

@ -52,6 +52,8 @@ namespace Nz
void EndDebugRegion() override;
void EndRenderPass() override;
void InsertDebugLabel(std::string_view label, const Color& color) override;
inline Vk::CommandBuffer& GetCommandBuffer();
void NextSubpass() override;

View File

@ -209,6 +209,12 @@ namespace Nz
context->glPopDebugGroup();
}
inline void OpenGLCommandBuffer::Execute(const GL::Context* context, const InsertDebugLabelCommand& command)
{
if (context->glDebugMessageInsert)
context->glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0, GL_DEBUG_SEVERITY_NOTIFICATION, command.label.size(), command.label.data());
}
inline void OpenGLCommandBuffer::Execute(const GL::Context* context, const MemoryBarrier& command)
{
if (context->glMemoryBarrier)

View File

@ -148,6 +148,11 @@ namespace Nz
/* nothing to do */
}
void OpenGLCommandBufferBuilder::InsertDebugLabel(std::string_view label, const Color& color)
{
m_commandBuffer.InsertDebugLabel(label, color);
}
void OpenGLCommandBufferBuilder::NextSubpass()
{
/* nothing to do */

View File

@ -603,13 +603,16 @@ namespace Nz::GL
if (glDebugMessageControl)
{
// Disable push/pop debug groups notifications
// Disable push/pop debug groups and markers notifications
if (glPushDebugGroup)
glDebugMessageControl(GL_DONT_CARE, GL_DEBUG_TYPE_PUSH_GROUP, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
if (glPopDebugGroup)
glDebugMessageControl(GL_DONT_CARE, GL_DEBUG_TYPE_POP_GROUP, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
if (glDebugMessageInsert)
glDebugMessageControl(GL_DONT_CARE, GL_DEBUG_TYPE_MARKER, GL_DEBUG_SEVERITY_NOTIFICATION, 0, nullptr, GL_FALSE);
// Handle verbosity level
if (m_params.validationLevel < RenderAPIValidationLevel::Debug)
// Disable driver notifications except in debug (NVidia driver is very verbose)

View File

@ -315,6 +315,16 @@ namespace Nz
m_currentRenderPass = nullptr;
}
void VulkanCommandBufferBuilder::InsertDebugLabel(std::string_view label, const Color& color)
{
// Ensure \0 at the end of string
StackArray<char> labelEOS = NazaraStackArrayNoInit(char, label.size() + 1);
std::memcpy(labelEOS.data(), label.data(), label.size());
labelEOS[label.size()] = '\0';
m_commandBuffer.InsertDebugLabel(labelEOS.data(), color);
}
void VulkanCommandBufferBuilder::NextSubpass()
{
m_commandBuffer.NextSubpass();