Only enable (and use) debug markers if debug marker extension is present (Refs #277)
This commit is contained in:
parent
a77ea9053b
commit
f6d384d444
1 changed files with 43 additions and 26 deletions
|
|
@ -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();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue