1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-27 04:54:15 +01:00

[dxvk] Improve handling of nested debug regions

This commit is contained in:
Philip Rebohle 2025-02-16 15:50:00 +01:00 committed by Philip Rebohle
parent b03d457ffb
commit 636669e1a5
3 changed files with 52 additions and 32 deletions

View File

@ -2869,27 +2869,20 @@ namespace dxvk {
label << ")";
beginInternalDebugRegion(vk::makeLabel(0xf0e6dc, label.str().c_str()));
pushDebugRegion(vk::makeLabel(0xf0e6dc, label.str().c_str()),
util::DxvkDebugLabelType::InternalRenderPass);
}
void DxvkContext::beginDebugLabel(const VkDebugUtilsLabelEXT& label) {
if (m_features.test(DxvkContextFeature::DebugUtils)) {
endInternalDebugRegion();
m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, label);
m_debugLabelStack.emplace_back(label);
}
if (m_features.test(DxvkContextFeature::DebugUtils))
pushDebugRegion(label, util::DxvkDebugLabelType::External);
}
void DxvkContext::endDebugLabel() {
if (m_features.test(DxvkContextFeature::DebugUtils)) {
if (!m_debugLabelStack.empty()) {
m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer);
m_debugLabelStack.pop_back();
}
}
if (m_features.test(DxvkContextFeature::DebugUtils))
popDebugRegion(util::DxvkDebugLabelType::External);
}
@ -5208,7 +5201,9 @@ namespace dxvk {
flushBarriers();
flushResolves();
endInternalDebugRegion();
if (unlikely(m_features.test(DxvkContextFeature::DebugUtils)))
popDebugRegion(util::DxvkDebugLabelType::InternalRenderPass);
} else if (!suspend) {
// We may end a previously suspended render pass
if (m_flags.test(DxvkContextFlag::GpRenderPassSuspended)) {
@ -8170,23 +8165,34 @@ namespace dxvk {
}
void DxvkContext::beginInternalDebugRegion(const VkDebugUtilsLabelEXT& label) {
if (m_features.test(DxvkContextFeature::DebugUtils)) {
// If the app provides us with debug regions, don't add any
// internal ones to avoid potential issues with scoping.
if (m_debugLabelStack.empty()) {
m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, label);
m_debugLabelInternalActive = true;
}
}
void DxvkContext::pushDebugRegion(const VkDebugUtilsLabelEXT& label, util::DxvkDebugLabelType type) {
m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, label);
m_debugLabelStack.emplace_back(label, type);
}
void DxvkContext::endInternalDebugRegion() {
if (m_debugLabelInternalActive) {
m_debugLabelInternalActive = false;
void DxvkContext::popDebugRegion(util::DxvkDebugLabelType type) {
// Find last active region of the given type
size_t index = m_debugLabelStack.size();
while (index && m_debugLabelStack[index - 1u].type() != type)
index -= 1u;
if (!index)
return;
// End all debug regions inside the scope we want to end, as
// well as the debug region of the requested type itself
for (size_t i = index; i <= m_debugLabelStack.size(); i++)
m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer);
// Re-emit nested debug regions and erase the region we ended
for (size_t i = index; i < m_debugLabelStack.size(); i++) {
m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, m_debugLabelStack[i].get());
m_debugLabelStack[i - 1u] = m_debugLabelStack[i];
}
m_debugLabelStack.pop_back();
}

View File

@ -1453,7 +1453,6 @@ namespace dxvk {
std::vector<VkImageMemoryBarrier2> m_imageLayoutTransitions;
std::vector<util::DxvkDebugLabel> m_debugLabelStack;
bool m_debugLabelInternalActive = false;
Rc<DxvkLatencyTracker> m_latencyTracker;
uint64_t m_latencyFrameId = 0u;
@ -2072,10 +2071,12 @@ namespace dxvk {
void beginRenderPassDebugRegion();
void beginInternalDebugRegion(
const VkDebugUtilsLabelEXT& label);
void pushDebugRegion(
const VkDebugUtilsLabelEXT& label,
util::DxvkDebugLabelType type);
void endInternalDebugRegion();
void popDebugRegion(
util::DxvkDebugLabelType type);
void beginActiveDebugRegions();

View File

@ -4,6 +4,14 @@
namespace dxvk::util {
/**
* \brief Debug utils label type
*/
enum class DxvkDebugLabelType : uint32_t {
External, ///< App-provided scope
InternalRenderPass, ///< Internal render pass markers
};
/**
* \brief Debug label wrapper
*
@ -16,12 +24,16 @@ namespace dxvk::util {
DxvkDebugLabel() = default;
DxvkDebugLabel(const VkDebugUtilsLabelEXT& label)
: m_text(label.pLabelName ? label.pLabelName : "") {
DxvkDebugLabel(const VkDebugUtilsLabelEXT& label, DxvkDebugLabelType type)
: m_text(label.pLabelName ? label.pLabelName : ""), m_type(type) {
for (uint32_t i = 0; i < m_color.size(); i++)
m_color[i] = label.color[i];
}
DxvkDebugLabelType type() const {
return m_type;
}
VkDebugUtilsLabelEXT get() const {
VkDebugUtilsLabelEXT label = { VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT };
label.pLabelName = m_text.c_str();
@ -34,6 +46,7 @@ namespace dxvk::util {
std::string m_text;
std::array<float, 4> m_color = { };
DxvkDebugLabelType m_type;
};