Only enable (and use) debug markers if debug marker extension is present (Refs #277)

This commit is contained in:
saschawillems 2017-02-07 19:58:38 +01:00
parent a77ea9053b
commit f6d384d444

View file

@ -32,29 +32,46 @@
// Setup and functions for the VK_EXT_debug_marker_extension // 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 // 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 // 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 namespace DebugMarker
{ {
bool active = false; bool active = false;
bool extensionPresent = false;
PFN_vkDebugMarkerSetObjectTagEXT pfnDebugMarkerSetObjectTag = VK_NULL_HANDLE; PFN_vkDebugMarkerSetObjectTagEXT vkDebugMarkerSetObjectTag = VK_NULL_HANDLE;
PFN_vkDebugMarkerSetObjectNameEXT pfnDebugMarkerSetObjectName = VK_NULL_HANDLE; PFN_vkDebugMarkerSetObjectNameEXT vkDebugMarkerSetObjectName = VK_NULL_HANDLE;
PFN_vkCmdDebugMarkerBeginEXT pfnCmdDebugMarkerBegin = VK_NULL_HANDLE; PFN_vkCmdDebugMarkerBeginEXT vkCmdDebugMarkerBegin = VK_NULL_HANDLE;
PFN_vkCmdDebugMarkerEndEXT pfnCmdDebugMarkerEnd = VK_NULL_HANDLE; PFN_vkCmdDebugMarkerEndEXT vkCmdDebugMarkerEnd = VK_NULL_HANDLE;
PFN_vkCmdDebugMarkerInsertEXT pfnCmdDebugMarkerInsert = VK_NULL_HANDLE; PFN_vkCmdDebugMarkerInsertEXT vkCmdDebugMarkerInsert = VK_NULL_HANDLE;
// Get function pointers for the debug report extensions from the device // Get function pointers for the debug report extensions from the device
void setup(VkDevice device) void setup(VkDevice device, VkPhysicalDevice physicalDevice)
{ {
pfnDebugMarkerSetObjectTag = (PFN_vkDebugMarkerSetObjectTagEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectTagEXT"); // Check if the debug marker extension is present (which is the case if run from a graphics debugger)
pfnDebugMarkerSetObjectName = (PFN_vkDebugMarkerSetObjectNameEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT"); uint32_t extensionCount;
pfnCmdDebugMarkerBegin = (PFN_vkCmdDebugMarkerBeginEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT"); vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extensionCount, nullptr);
pfnCmdDebugMarkerEnd = (PFN_vkCmdDebugMarkerEndEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT"); std::vector<VkExtensionProperties> extensions(extensionCount);
pfnCmdDebugMarkerInsert = (PFN_vkCmdDebugMarkerInsertEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT"); vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extensionCount, extensions.data());
for (auto extension : extensions) {
if (strcmp(extension.extensionName, VK_EXT_DEBUG_MARKER_EXTENSION_NAME) == 0) {
extensionPresent = true;
break;
}
}
if (extensionPresent) {
// The debug marker extension is not part of the core, so function pointers need to be loaded manually
vkDebugMarkerSetObjectTag = (PFN_vkDebugMarkerSetObjectTagEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectTagEXT");
vkDebugMarkerSetObjectName = (PFN_vkDebugMarkerSetObjectNameEXT)vkGetDeviceProcAddr(device, "vkDebugMarkerSetObjectNameEXT");
vkCmdDebugMarkerBegin = (PFN_vkCmdDebugMarkerBeginEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerBeginEXT");
vkCmdDebugMarkerEnd = (PFN_vkCmdDebugMarkerEndEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerEndEXT");
vkCmdDebugMarkerInsert = (PFN_vkCmdDebugMarkerInsertEXT)vkGetDeviceProcAddr(device, "vkCmdDebugMarkerInsertEXT");
// Set flag if at least one function pointer is present // Set flag if at least one function pointer is present
active = (pfnDebugMarkerSetObjectName != VK_NULL_HANDLE); active = (vkDebugMarkerSetObjectName != VK_NULL_HANDLE);
}
else {
std::cout << "Warning: " << VK_EXT_DEBUG_MARKER_EXTENSION_NAME << " not present, debug markers are disabled.";
std::cout << "Try running from inside a Vulkan graphics debugger (e.g. RenderDoc)" << std::endl;
}
} }
// Sets the debug name of an object // Sets the debug name of an object
@ -63,14 +80,14 @@ namespace DebugMarker
void setObjectName(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, const char *name) void setObjectName(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, const char *name)
{ {
// Check for valid function pointer (may not be present if not running in a debugging application) // Check for valid function pointer (may not be present if not running in a debugging application)
if (pfnDebugMarkerSetObjectName) if (active)
{ {
VkDebugMarkerObjectNameInfoEXT nameInfo = {}; VkDebugMarkerObjectNameInfoEXT nameInfo = {};
nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT; nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT;
nameInfo.objectType = objectType; nameInfo.objectType = objectType;
nameInfo.object = object; nameInfo.object = object;
nameInfo.pObjectName = name; nameInfo.pObjectName = name;
pfnDebugMarkerSetObjectName(device, &nameInfo); vkDebugMarkerSetObjectName(device, &nameInfo);
} }
} }
@ -78,7 +95,7 @@ namespace DebugMarker
void setObjectTag(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, uint64_t name, size_t tagSize, const void* tag) 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) // Check for valid function pointer (may not be present if not running in a debugging application)
if (pfnDebugMarkerSetObjectTag) if (active)
{ {
VkDebugMarkerObjectTagInfoEXT tagInfo = {}; VkDebugMarkerObjectTagInfoEXT tagInfo = {};
tagInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT; tagInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT;
@ -87,7 +104,7 @@ namespace DebugMarker
tagInfo.tagName = name; tagInfo.tagName = name;
tagInfo.tagSize = tagSize; tagInfo.tagSize = tagSize;
tagInfo.pTag = tag; tagInfo.pTag = tag;
pfnDebugMarkerSetObjectTag(device, &tagInfo); vkDebugMarkerSetObjectTag(device, &tagInfo);
} }
} }
@ -95,13 +112,13 @@ namespace DebugMarker
void beginRegion(VkCommandBuffer cmdbuffer, const char* pMarkerName, glm::vec4 color) 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) // Check for valid function pointer (may not be present if not running in a debugging application)
if (pfnCmdDebugMarkerBegin) if (active)
{ {
VkDebugMarkerMarkerInfoEXT markerInfo = {}; VkDebugMarkerMarkerInfoEXT markerInfo = {};
markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT;
memcpy(markerInfo.color, &color[0], sizeof(float) * 4); memcpy(markerInfo.color, &color[0], sizeof(float) * 4);
markerInfo.pMarkerName = pMarkerName; markerInfo.pMarkerName = pMarkerName;
pfnCmdDebugMarkerBegin(cmdbuffer, &markerInfo); vkCmdDebugMarkerBegin(cmdbuffer, &markerInfo);
} }
} }
@ -109,13 +126,13 @@ namespace DebugMarker
void insert(VkCommandBuffer cmdbuffer, std::string markerName, glm::vec4 color) 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) // Check for valid function pointer (may not be present if not running in a debugging application)
if (pfnCmdDebugMarkerInsert) if (active)
{ {
VkDebugMarkerMarkerInfoEXT markerInfo = {}; VkDebugMarkerMarkerInfoEXT markerInfo = {};
markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT; markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT;
memcpy(markerInfo.color, &color[0], sizeof(float) * 4); memcpy(markerInfo.color, &color[0], sizeof(float) * 4);
markerInfo.pMarkerName = markerName.c_str(); markerInfo.pMarkerName = markerName.c_str();
pfnCmdDebugMarkerInsert(cmdbuffer, &markerInfo); vkCmdDebugMarkerInsert(cmdbuffer, &markerInfo);
} }
} }
@ -123,9 +140,9 @@ namespace DebugMarker
void endRegion(VkCommandBuffer cmdBuffer) void endRegion(VkCommandBuffer cmdBuffer)
{ {
// Check for valid function (may not be present if not runnin in a debugging application) // Check for valid function (may not be present if not runnin in a debugging application)
if (pfnCmdDebugMarkerEnd) if (vkCmdDebugMarkerEnd)
{ {
pfnCmdDebugMarkerEnd(cmdBuffer); vkCmdDebugMarkerEnd(cmdBuffer);
} }
} }
}; };
@ -1102,7 +1119,7 @@ public:
void prepare() void prepare()
{ {
VulkanExampleBase::prepare(); VulkanExampleBase::prepare();
DebugMarker::setup(device); DebugMarker::setup(device, physicalDevice);
loadScene(); loadScene();
prepareOffscreen(); prepareOffscreen();
setupVertexDescriptions(); setupVertexDescriptions();