diff --git a/base/vulkandebug.cpp b/base/vulkandebug.cpp index b2affae9..0b0b6ddd 100644 --- a/base/vulkandebug.cpp +++ b/base/vulkandebug.cpp @@ -48,7 +48,7 @@ namespace vkDebug if (flags & VK_DEBUG_REPORT_WARNING_BIT_EXT) { // Uncomment to see warnings - std::cout << "WARNING: " << "[" << pLayerPrefix << "] Code " << msgCode << " : " << pMsg << "\n"; + //std::cout << "WARNING: " << "[" << pLayerPrefix << "] Code " << msgCode << " : " << pMsg << "\n"; } else { @@ -88,33 +88,90 @@ namespace vkDebug } } - namespace debugReport + namespace DebugMarker { - PFN_vkDebugMarkerSetObjectNameEXT DebugMarkerSetObjectName = VK_NULL_HANDLE; - PFN_vkCmdDebugMarkerBeginEXT CmdDebugMarkerBegin = VK_NULL_HANDLE; - PFN_vkCmdDebugMarkerEndEXT CmdDebugMarkerEnd = VK_NULL_HANDLE; - PFN_vkCmdDebugMarkerInsertEXT CmdDebugMarkerInsert = VK_NULL_HANDLE; + bool active = false; - // Set up the debug marker function pointers - void setupDebugMarkers(VkDevice device) + PFN_vkDebugMarkerSetObjectTagEXT pfnDebugMarkerSetObjectTag = VK_NULL_HANDLE; + PFN_vkDebugMarkerSetObjectNameEXT pfnDebugMarkerSetObjectName = VK_NULL_HANDLE; + PFN_vkCmdDebugMarkerBeginEXT pfnCmdDebugMarkerBegin = VK_NULL_HANDLE; + PFN_vkCmdDebugMarkerEndEXT pfnCmdDebugMarkerEnd = VK_NULL_HANDLE; + PFN_vkCmdDebugMarkerInsertEXT pfnCmdDebugMarkerInsert = VK_NULL_HANDLE; + + void setup(VkDevice device) { - DebugMarkerSetObjectName = (PFN_vkDebugMarkerSetObjectNameEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT"); - CmdDebugMarkerBegin = (PFN_vkCmdDebugMarkerBeginEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT"); - CmdDebugMarkerEnd = (PFN_vkCmdDebugMarkerEndEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT"); - CmdDebugMarkerInsert = (PFN_vkCmdDebugMarkerInsertEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT"); + pfnDebugMarkerSetObjectTag = (PFN_vkDebugMarkerSetObjectTagEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectTagEXT"); + pfnDebugMarkerSetObjectName = (PFN_vkDebugMarkerSetObjectNameEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT"); + pfnCmdDebugMarkerBegin = (PFN_vkCmdDebugMarkerBeginEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT"); + pfnCmdDebugMarkerEnd = (PFN_vkCmdDebugMarkerEndEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT"); + pfnCmdDebugMarkerInsert = (PFN_vkCmdDebugMarkerInsertEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT"); + + // Set flag if at least one function pointer is present + active = (pfnDebugMarkerSetObjectName != VK_NULL_HANDLE); } void setObjectName(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, const char *name) { - // need to check if the function pointer is valid - extension might not be present - if (DebugMarkerSetObjectName) + // Check for valid function pointer (may not be present if not running in a debugging application) + if (pfnDebugMarkerSetObjectName) { VkDebugMarkerObjectNameInfoEXT nameInfo = {}; nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT; nameInfo.objectType = objectType; nameInfo.object = object; nameInfo.pObjectName = name; - DebugMarkerSetObjectName(device, &nameInfo); + pfnDebugMarkerSetObjectName(device, &nameInfo); + } + } + + void setObjectTag(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, uint64_t name, size_t tagSize, const void* tag) + { + // Check for valid function pointer (may not be present if not running in a debugging application) + if (pfnDebugMarkerSetObjectTag) + { + VkDebugMarkerObjectTagInfoEXT tagInfo = {}; + tagInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT; + tagInfo.objectType = objectType; + tagInfo.object = object; + tagInfo.tagName = name; + tagInfo.tagSize = tagSize; + tagInfo.pTag = tag; + pfnDebugMarkerSetObjectTag(device, &tagInfo); + } + } + + void beginRegion(VkCommandBuffer cmdbuffer, const char* pMarkerName, glm::vec4 color) + { + // Check for valid function pointer (may not be present if not running in a debugging application) + if (pfnCmdDebugMarkerBegin) + { + VkDebugMarkerMarkerInfoEXT markerInfo = {}; + markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; + memcpy(markerInfo.color, &color[0], sizeof(float) * 4); + markerInfo.pMarkerName = pMarkerName; + pfnCmdDebugMarkerBegin(cmdbuffer, &markerInfo); + } + } + + void insert(VkCommandBuffer cmdbuffer, std::string markerName, glm::vec4 color) + { + // Check for valid function pointer (may not be present if not running in a debugging application) + if (pfnCmdDebugMarkerInsert) + { + VkDebugMarkerMarkerInfoEXT markerInfo = {}; + markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; + memcpy(markerInfo.color, &color[0], sizeof(float) * 4); + markerInfo.pMarkerName = markerName.c_str(); + pfnCmdDebugMarkerInsert(cmdbuffer, &markerInfo); + } + } + + void endRegion(VkCommandBuffer cmdBuffer) + { + // Check for valid function (may not be present if not runnin in a debugging application) + if (pfnCmdDebugMarkerEnd) + { + pfnCmdDebugMarkerEnd(cmdBuffer); } } @@ -197,75 +254,7 @@ namespace vkDebug { setObjectName(device, (uint64_t)_event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, name); } + }; - void insertDebugMarker( - VkCommandBuffer cmdbuffer, - const char* pMarkerName, - float color[4]) - { - // need to check if the function pointer is valid - extension might not be present - if (CmdDebugMarkerInsert) - { - VkDebugMarkerMarkerInfoEXT markerInfo = {}; - markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; - memcpy(markerInfo.color, color, sizeof(float) * 4); - markerInfo.pMarkerName = pMarkerName; - CmdDebugMarkerInsert(cmdbuffer, &markerInfo); - } - } - - void insertDebugMarker( - VkCommandBuffer cmdbuffer, - const char* pMarkerName) - { - // need to check if the function pointer is valid - extension might not be present - if (CmdDebugMarkerInsert) - { - VkDebugMarkerMarkerInfoEXT markerInfo = {}; - markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; - markerInfo.pMarkerName = pMarkerName; - CmdDebugMarkerInsert(cmdbuffer, &markerInfo); - } - } - - DebugMarkerRegion::DebugMarkerRegion(VkCommandBuffer cmdbuffer, - const char* pMarkerName, - float color[4]) - { - cmd = cmdbuffer; - // need to check if the function pointer is valid - extension might not be present - if (CmdDebugMarkerBegin) - { - VkDebugMarkerMarkerInfoEXT markerInfo = {}; - markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; - memcpy(markerInfo.color, color, sizeof(float) * 4); - markerInfo.pMarkerName = pMarkerName; - CmdDebugMarkerBegin(cmd, &markerInfo); - } - } - - DebugMarkerRegion::DebugMarkerRegion(VkCommandBuffer cmdbuffer, - const char* pMarkerName) - { - cmd = cmdbuffer; - // need to check if the function pointer is valid - extension might not be present - if (CmdDebugMarkerBegin) - { - VkDebugMarkerMarkerInfoEXT markerInfo = {}; - markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; - markerInfo.pMarkerName = pMarkerName; - CmdDebugMarkerBegin(cmd, &markerInfo); - } - } - - DebugMarkerRegion::~DebugMarkerRegion() - { - // need to check if the function pointer is valid - extension might not be present - if (CmdDebugMarkerEnd) - { - CmdDebugMarkerEnd(cmd); - } - } - } } diff --git a/base/vulkandebug.h b/base/vulkandebug.h index 30610d8d..95c1dce8 100644 --- a/base/vulkandebug.h +++ b/base/vulkandebug.h @@ -17,6 +17,9 @@ #ifdef __ANDROID__ #include "vulkanandroid.h" #endif +#define GLM_FORCE_RADIANS +#define GLM_FORCE_DEPTH_ZERO_TO_ONE +#include namespace vkDebug { @@ -44,67 +47,53 @@ namespace vkDebug // Clear debug callback void freeDebugCallback(VkInstance instance); - // Functions for the VK_EXT_debug_report extensions - namespace debugReport + // Setup and functions for the VK_EXT_debug_marker_extension + // Extension spec can be found at https://github.com/KhronosGroup/Vulkan-Docs/blob/1.0-VK_EXT_debug_marker/doc/specs/vulkan/appendices/VK_EXT_debug_marker.txt + // Note that the extension will only be present if run from an offline debugging application + // The actual check for extension presence and enabling it on the device is done in the example base class + // See VulkanExampleBase::createInstance and VulkanExampleBase::createDevice (base/vulkanexamplebase.cpp) + namespace DebugMarker { - // Set up the debug marker function pointers - void setupDebugMarkers(VkDevice device); + // Set to true if function pointer for the debug marker are available + extern bool active; - // Functions for naming different Vulkan object types - // General + // Get function pointers for the debug report extensions from the device + void setup(VkDevice device); + + // Sets the debug name of an object + // All Objects in Vulkan are represented by their 64-bit handles which are passed into this function + // along with the object type void setObjectName(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, const char *name); - // Dedicated object type - void setCommandBufferName(VkDevice device, VkCommandBuffer cmdBuffer, const char *name); - void setQueueName(VkDevice device, VkQueue queue, const char *name); - void setImageName(VkDevice device, VkImage image, const char *name); - void setSamplerName(VkDevice device, VkSampler sampler, const char *name); - void setBufferName(VkDevice device, VkBuffer buffer, const char *name); - void setDeviceMemoryName(VkDevice device, VkDeviceMemory memory, const char *name); - void setShaderModuleName(VkDevice device, VkShaderModule shaderModule, const char *name); - void setPipelineName(VkDevice device, VkPipeline pipeline, const char *name); - void setPipelineLayoutName(VkDevice device, VkPipelineLayout pipelineLayout, const char *name); - void setRenderPassName(VkDevice device, VkRenderPass renderPass, const char *name); - void setFramebufferName(VkDevice device, VkFramebuffer framebuffer, const char *name); - void setDescriptorSetLayoutName(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const char *name); - void setDescriptorSetName(VkDevice device, VkDescriptorSet descriptorSet, const char *name); - void setSemaphoreName(VkDevice device, VkSemaphore semaphore, const char *name); - void setFenceName(VkDevice device, VkFence fence, const char *name); - void setEventName(VkDevice device, VkEvent _event, const char *name); - /* + // Set the tag for an object + void setObjectTag(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, uint64_t name, size_t tagSize, const void* tag); - OBJECT_TYPE(DESCRIPTOR_POOL, VkDescriptorPool); + // Start a new debug marker region + void beginRegion(VkCommandBuffer cmdbuffer, const char* pMarkerName, glm::vec4 color); - OBJECT_TYPE(COMMAND_POOL, VkCommandPool); + // Insert a new debug marker into the command buffer + void insert(VkCommandBuffer cmdbuffer, std::string markerName, glm::vec4 color); - OBJECT_TYPE(QUERY_POOL, VkQueryPool); + // End the current debug marker region + void endRegion(VkCommandBuffer cmdBuffer); - OBJECT_TYPE(BUFFER_VIEW, VkBufferView); - OBJECT_TYPE(IMAGE_VIEW, VkImageView); - OBJECT_TYPE(PIPELINE_CACHE, VkPipelineCache); - */ + // Object specific naming functions + void setCommandBufferName(VkDevice device, VkCommandBuffer cmdBuffer, const char * name); + void setQueueName(VkDevice device, VkQueue queue, const char * name); + void setImageName(VkDevice device, VkImage image, const char * name); + void setSamplerName(VkDevice device, VkSampler sampler, const char * name); + void setBufferName(VkDevice device, VkBuffer buffer, const char * name); + void setDeviceMemoryName(VkDevice device, VkDeviceMemory memory, const char * name); + void setShaderModuleName(VkDevice device, VkShaderModule shaderModule, const char * name); + void setPipelineName(VkDevice device, VkPipeline pipeline, const char * name); + void setPipelineLayoutName(VkDevice device, VkPipelineLayout pipelineLayout, const char * name); + void setRenderPassName(VkDevice device, VkRenderPass renderPass, const char * name); + void setFramebufferName(VkDevice device, VkFramebuffer framebuffer, const char * name); + void setDescriptorSetLayoutName(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const char * name); + void setDescriptorSetName(VkDevice device, VkDescriptorSet descriptorSet, const char * name); + void setSemaphoreName(VkDevice device, VkSemaphore semaphore, const char * name); + void setFenceName(VkDevice device, VkFence fence, const char * name); + void setEventName(VkDevice device, VkEvent _event, const char * name); + }; - // insert a debug label into the command buffer, with or - // without a color - void insertDebugMarker( - VkCommandBuffer cmdbuffer, - const char* pMarkerName, - float color[4]); - void insertDebugMarker( - VkCommandBuffer cmdbuffer, - const char* pMarkerName); - - // Helper class for pushing and popping a debug region around some section of code. - struct DebugMarkerRegion - { - DebugMarkerRegion(VkCommandBuffer cmdbuffer, - const char* pMarkerName, - float color[4]); - DebugMarkerRegion(VkCommandBuffer cmdbuffer, - const char* pMarkerName); - ~DebugMarkerRegion(); - - VkCommandBuffer cmd; - }; - } }