From 50f963025006ec0fb2fa5d227aeedb2e971f1505 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 8 Jan 2025 16:18:56 +0100 Subject: [PATCH] [dxvk] Add debug regions for internal operations --- src/dxvk/dxvk_context.cpp | 109 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index 1c791906b..c0c3d92d6 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -277,6 +277,14 @@ namespace dxvk { cmdBuffer = DxvkCmdBuffer::ExecBuffer; } + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) { + const char* dstName = bufferView->buffer()->info().debugName; + + m_cmd->cmdBeginDebugUtilsLabel(cmdBuffer, + vk::makeLabel(0xf0dcdc, str::format("Clear view (", + dstName ? dstName : "unknown", ")").c_str())); + } + // Query pipeline objects to use for this clear operation DxvkMetaClearPipeline pipeInfo = m_common->metaClear().getClearBufferPipeline( lookupFormatInfo(bufferView->info().format)->flags); @@ -319,6 +327,9 @@ namespace dxvk { VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) + m_cmd->cmdEndDebugUtilsLabel(cmdBuffer); + m_cmd->track(bufferView->buffer(), DxvkAccess::Write); } @@ -2608,6 +2619,16 @@ namespace dxvk { flushPendingAccesses(*dstView, DxvkAccess::Write); flushPendingAccesses(*srcView, DxvkAccess::Read); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) { + const char* dstName = dstView->image()->info().debugName; + const char* srcName = srcView->image()->info().debugName; + + m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, + vk::makeLabel(0xf0dcdc, str::format("Blit (", + dstName ? dstName : "unknown", ", ", + srcName ? srcName : "unknown", ")").c_str())); + } + VkImageLayout srcLayout = srcView->image()->pickLayout(srcIsDepthStencil ? VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); @@ -2744,6 +2765,9 @@ namespace dxvk { VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) + m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer); + m_cmd->track(dstView->image(), DxvkAccess::Write); m_cmd->track(srcView->image(), DxvkAccess::Read); m_cmd->track(std::move(sampler)); @@ -2974,6 +2998,16 @@ namespace dxvk { flushPendingAccesses(*image, vk::makeSubresourceRange(imageSubresource), DxvkAccess::Write); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) { + const char* dstName = image->info().debugName; + const char* srcName = buffer->info().debugName; + + m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, + vk::makeLabel(0xf0dcdc, str::format("Upload image (", + dstName ? dstName : "unknown", ", ", + srcName ? srcName : "unknown", ")").c_str())); + } + auto formatInfo = lookupFormatInfo(bufferFormat); if (formatInfo->flags.test(DxvkFormatFlag::MultiPlane)) { @@ -3182,6 +3216,9 @@ namespace dxvk { VK_PIPELINE_STAGE_2_FRAGMENT_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) + m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer); + m_cmd->track(image, DxvkAccess::Write); m_cmd->track(buffer, DxvkAccess::Read); } @@ -3260,6 +3297,16 @@ namespace dxvk { flushPendingAccesses(*image, vk::makeSubresourceRange(imageSubresource), DxvkAccess::Read); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) { + const char* dstName = buffer->info().debugName; + const char* srcName = image->info().debugName; + + m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, + vk::makeLabel(0xf0dcdc, str::format("Readback image (", + dstName ? dstName : "unknown", ", ", + srcName ? srcName : "unknown", ")").c_str())); + } + auto formatInfo = lookupFormatInfo(bufferFormat); if (formatInfo->flags.test(DxvkFormatFlag::MultiPlane)) { @@ -3397,6 +3444,9 @@ namespace dxvk { vk::makeSubresourceRange(imageSubresource), imageLayout, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_READ_BIT); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) + m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer); + m_cmd->track(buffer, DxvkAccess::Write); m_cmd->track(image, DxvkAccess::Read); } @@ -3429,6 +3479,13 @@ namespace dxvk { flushPendingAccesses(*imageView->image(), imageView->imageSubresources(), DxvkAccess::Write); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) { + const char* dstName = imageView->image()->info().debugName; + + m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, vk::makeLabel(0xf0dcdc, + str::format("Clear view (", dstName ? dstName : "unknown", ")").c_str())); + } + clearLayout = (imageView->info().aspects & VK_IMAGE_ASPECT_COLOR_BIT) ? imageView->pickLayout(VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL) : imageView->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); @@ -3505,6 +3562,9 @@ namespace dxvk { *imageView->image(), imageView->imageSubresources(), clearLayout, clearStages, clearAccess); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) + m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer); + m_cmd->track(imageView->image(), DxvkAccess::Write); } } @@ -3526,6 +3586,13 @@ namespace dxvk { cmdBuffer = DxvkCmdBuffer::ExecBuffer; } + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) { + const char* dstName = imageView->image()->info().debugName; + + m_cmd->cmdBeginDebugUtilsLabel(cmdBuffer, vk::makeLabel(0xf0dcdc, + str::format("Clear view (", dstName ? dstName : "unknown", ")").c_str())); + } + addImageLayoutTransition(*imageView->image(), imageView->imageSubresources(), VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT, imageView->image()->isFullSubresource(vk::pickSubresourceLayers(imageView->imageSubresources(), 0), extent)); @@ -3582,6 +3649,9 @@ namespace dxvk { VK_IMAGE_LAYOUT_GENERAL, VK_PIPELINE_STAGE_2_COMPUTE_SHADER_BIT, VK_ACCESS_2_SHADER_WRITE_BIT); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) + m_cmd->cmdEndDebugUtilsLabel(cmdBuffer); + m_cmd->track(imageView->image(), DxvkAccess::Write); } @@ -3694,6 +3764,16 @@ namespace dxvk { this->invalidateState(); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) { + const char* dstName = dstImage->info().debugName; + const char* srcName = srcImage->info().debugName; + + m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, + vk::makeLabel(0xf0dcdc, str::format("Copy image (", + dstName ? dstName : "unknown", ", ", + srcName ? srcName : "unknown", ")").c_str())); + } + auto dstSubresourceRange = vk::makeSubresourceRange(dstSubresource); auto srcSubresourceRange = vk::makeSubresourceRange(srcSubresource); @@ -3846,6 +3926,9 @@ namespace dxvk { *dstImage, dstSubresourceRange, dstLayout, dstStages, dstAccess); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) + m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer); + m_cmd->track(dstImage, DxvkAccess::Write); m_cmd->track(srcImage, DxvkAccess::Read); } @@ -4153,6 +4236,16 @@ namespace dxvk { flushPendingAccesses(*dstImage, dstSubresourceRange, DxvkAccess::Write); flushPendingAccesses(*srcImage, srcSubresourceRange, DxvkAccess::Read); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) { + const char* dstName = dstImage->info().debugName; + const char* srcName = srcImage->info().debugName; + + m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, + vk::makeLabel(0xf0dcdc, str::format("Resolve DS (", + dstName ? dstName : "unknown", ", ", + srcName ? srcName : "unknown", ")").c_str())); + } + // Transition both images to usable layouts if necessary. For the source image we // can be fairly leniet since writable layouts are allowed for resolve attachments. VkImageLayout dstLayout = dstImage->pickLayout(VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL); @@ -4215,6 +4308,9 @@ namespace dxvk { VK_PIPELINE_STAGE_2_LATE_FRAGMENT_TESTS_BIT, VK_ACCESS_2_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) + m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer); + m_cmd->track(dstImage, DxvkAccess::Write); m_cmd->track(srcImage, DxvkAccess::Read); } @@ -4262,6 +4358,16 @@ namespace dxvk { flushPendingAccesses(*dstImage, dstSubresourceRange, DxvkAccess::Write); flushPendingAccesses(*srcImage, srcSubresourceRange, DxvkAccess::Read); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) { + const char* dstName = dstImage->info().debugName; + const char* srcName = srcImage->info().debugName; + + m_cmd->cmdBeginDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer, + vk::makeLabel(0xf0dcdc, str::format("Resolve (", + dstName ? dstName : "unknown", ", ", + srcName ? srcName : "unknown", ")").c_str())); + } + // Discard the destination image if we're fully writing it, // and transition the image layout if necessary bool doDiscard = dstImage->isFullSubresource(region.dstSubresource, region.extent); @@ -4416,6 +4522,9 @@ namespace dxvk { *dstImage, dstSubresourceRange, dstLayout, dstStages, dstAccess); + if (unlikely(m_features.test(DxvkContextFeature::DebugUtils))) + m_cmd->cmdEndDebugUtilsLabel(DxvkCmdBuffer::ExecBuffer); + m_cmd->track(dstImage, DxvkAccess::Write); m_cmd->track(srcImage, DxvkAccess::Read); }