1616#include " llvm/ADT/DenseSet.h"
1717#include " llvm/ADT/ScopeExit.h"
1818#include " llvm/Support/Error.h"
19+ #include " llvm/Support/FormatVariadic.h"
1920
2021#include < algorithm>
2122#include < cmath>
@@ -505,6 +506,10 @@ class VulkanCommandBuffer : public offloadtest::CommandBuffer {
505506 VkCommandPool CmdPool = VK_NULL_HANDLE;
506507 VkCommandBuffer CmdBuffer = VK_NULL_HANDLE;
507508
509+ PFN_vkCmdBeginDebugUtilsLabelEXT CmdBeginDebugUtilsLabel = nullptr ;
510+ PFN_vkCmdEndDebugUtilsLabelEXT CmdEndDebugUtilsLabel = nullptr ;
511+ PFN_vkCmdInsertDebugUtilsLabelEXT CmdInsertDebugUtilsLabel = nullptr ;
512+
508513 static llvm::Expected<std::unique_ptr<VulkanCommandBuffer>>
509514 create (VkDevice Device, uint32_t QueueFamilyIdx) {
510515 auto CB = std::unique_ptr<VulkanCommandBuffer>(new VulkanCommandBuffer ());
@@ -532,6 +537,17 @@ class VulkanCommandBuffer : public offloadtest::CommandBuffer {
532537 if (vkBeginCommandBuffer (CB->CmdBuffer , &BufferInfo))
533538 return llvm::createStringError (std::errc::device_or_resource_busy,
534539 " Could not begin command buffer." );
540+
541+ CB->CmdBeginDebugUtilsLabel =
542+ (PFN_vkCmdBeginDebugUtilsLabelEXT)vkGetDeviceProcAddr (
543+ Device, " vkCmdBeginDebugUtilsLabelEXT" );
544+ CB->CmdEndDebugUtilsLabel =
545+ (PFN_vkCmdEndDebugUtilsLabelEXT)vkGetDeviceProcAddr (
546+ Device, " vkCmdEndDebugUtilsLabelEXT" );
547+ CB->CmdInsertDebugUtilsLabel =
548+ (PFN_vkCmdInsertDebugUtilsLabelEXT)vkGetDeviceProcAddr (
549+ Device, " vkCmdInsertDebugUtilsLabelEXT" );
550+
535551 return CB;
536552 }
537553
@@ -639,6 +655,29 @@ class VKComputeEncoder : public offloadtest::ComputeEncoder {
639655
640656 ~VKComputeEncoder () override = default ;
641657
658+ void pushDebugGroup (llvm::StringRef Label) override {
659+ if (!CB.CmdBeginDebugUtilsLabel )
660+ return ;
661+ VkDebugUtilsLabelEXT LabelInfo = {};
662+ LabelInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
663+ LabelInfo.pLabelName = Label.data ();
664+ CB.CmdBeginDebugUtilsLabel (CB.CmdBuffer , &LabelInfo);
665+ }
666+
667+ void popDebugGroup () override {
668+ if (CB.CmdEndDebugUtilsLabel )
669+ CB.CmdEndDebugUtilsLabel (CB.CmdBuffer );
670+ }
671+
672+ void insertDebugSignpost (llvm::StringRef Label) override {
673+ if (!CB.CmdInsertDebugUtilsLabel )
674+ return ;
675+ VkDebugUtilsLabelEXT LabelInfo = {};
676+ LabelInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
677+ LabelInfo.pLabelName = Label.data ();
678+ CB.CmdInsertDebugUtilsLabel (CB.CmdBuffer , &LabelInfo);
679+ }
680+
642681 llvm::Error dispatch (uint32_t GroupCountX, uint32_t GroupCountY,
643682 uint32_t GroupCountZ, uint32_t /* ThreadsPerGroupX*/ ,
644683 uint32_t /* ThreadsPerGroupY*/ ,
@@ -648,6 +687,9 @@ class VKComputeEncoder : public offloadtest::ComputeEncoder {
648687 addDstBarrier (VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
649688 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT);
650689
690+ insertDebugSignpost (llvm::formatv (" Dispatch [{0},{1},{2}]" , GroupCountX,
691+ GroupCountY, GroupCountZ)
692+ .str ());
651693 vkCmdDispatch (CB.CmdBuffer , GroupCountX, GroupCountY, GroupCountZ);
652694 return llvm::Error::success ();
653695 }
@@ -663,6 +705,8 @@ class VKComputeEncoder : public offloadtest::ComputeEncoder {
663705 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT |
664706 VK_ACCESS_INDIRECT_COMMAND_READ_BIT);
665707 auto &VKBuf = static_cast <VulkanBuffer &>(ArgBuffer);
708+ insertDebugSignpost (
709+ llvm::formatv (" DispatchIndirect offset={0}" , Offset).str ());
666710 vkCmdDispatchIndirect (CB.CmdBuffer , VKBuf.Buffer ,
667711 static_cast <VkDeviceSize>(Offset));
668712 return llvm::Error::success ();
@@ -677,6 +721,7 @@ class VKComputeEncoder : public offloadtest::ComputeEncoder {
677721 Region.srcOffset = SrcOffset;
678722 Region.dstOffset = DstOffset;
679723 Region.size = Size;
724+ insertDebugSignpost (llvm::formatv (" CopyBuffer {0}B" , Size).str ());
680725 vkCmdCopyBuffer (CB.CmdBuffer , VKSrc.Buffer , VKDst.Buffer , 1 , &Region);
681726 return llvm::Error::success ();
682727 }
@@ -688,18 +733,19 @@ class VKComputeEncoder : public offloadtest::ComputeEncoder {
688733 // vkCmdFillBuffer writes repeatedly.
689734 uint32_t Data = uint32_t (Value) * 0x01010101u ;
690735 addDstBarrier (VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_WRITE_BIT);
736+ insertDebugSignpost (
737+ llvm::formatv (" FillBuffer {0}B value=0x{1:x2}" , Size, Value).str ());
691738 vkCmdFillBuffer (CB.CmdBuffer , VKDst.Buffer , Offset, Size, Data);
692739 return llvm::Error::success ();
693740 }
694741
695742 void barrier () override {
743+ insertDebugSignpost (" Barrier" );
696744 CB.flushBarrier (VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
697745 VK_ACCESS_SHADER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT);
698746 }
699747
700- void endEncoding () override {
701- // State remains on the command buffer for the next encoder.
702- }
748+ void endEncoding () override { popDebugGroup (); }
703749};
704750
705751llvm::Expected<std::unique_ptr<offloadtest::ComputeEncoder>>
@@ -709,7 +755,11 @@ VulkanCommandBuffer::createComputeEncoder(offloadtest::EncoderMode Mode) {
709755 flushBarrier (VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
710756 VK_ACCESS_MEMORY_READ_BIT | VK_ACCESS_MEMORY_WRITE_BIT);
711757 }
712- return std::make_unique<VKComputeEncoder>(*this , Mode);
758+ auto Enc = std::make_unique<VKComputeEncoder>(*this , Mode);
759+ Enc->pushDebugGroup (Mode == offloadtest::EncoderMode::Serial
760+ ? " ComputeEncoder (Serial)"
761+ : " ComputeEncoder (Parallel)" );
762+ return Enc;
713763}
714764class VulkanDevice : public offloadtest ::Device {
715765private:
0 commit comments