Class EXTDebugUtils
VK_EXT_debug_utils extension, developers can obtain more information. When combined with validation layers, even more detailed feedback on the application’s use of Vulkan will be provided.
This extension provides the following capabilities:
- The ability to create a debug messenger which will pass along debug messages to an application supplied callback.
- The ability to identify specific Vulkan objects using a name or tag to improve tracking.
- The ability to identify specific sections within a
VkQueueorVkCommandBufferusing labels to aid organization and offline analysis in external tools.
The main difference between this extension and VK_EXT_debug_report and VK_EXT_debug_marker is that those extensions use VkDebugReportObjectTypeEXT to identify objects. This extension uses the core VkObjectType in place of VkDebugReportObjectTypeEXT. The primary reason for this move is that no future object type handle enumeration values will be added to VkDebugReportObjectTypeEXT since the creation of VkObjectType.
In addition, this extension combines the functionality of both VK_EXT_debug_report and VK_EXT_debug_marker by allowing object name and debug markers (now called labels) to be returned to the application’s callback function. This should assist in clarifying the details of a debug message including: what objects are involved and potentially which location within a VkQueue or VkCommandBuffer the message occurred.
Examples
Example 1
VK_EXT_debug_utils allows an application to register multiple callbacks with any Vulkan component wishing to report debug information. Some callbacks may log the information to a file, others may cause a debug break point or other application-defined behavior. An application can register callbacks even when no validation layers are enabled, but they will only be called for loader and, if implemented, driver events.
To capture events that occur while creating or destroying an instance an application can link a VkDebugUtilsMessengerCreateInfoEXT structure to the pNext element of the VkInstanceCreateInfo structure given to CreateInstance.
Example uses: Create three callback objects. One will log errors and warnings to the debug console using Windows OutputDebugString. The second will cause the debugger to break at that callback when an error happens and the third will log warnings to stdout.
extern VkInstance instance;
VkResult res;
VkDebugUtilsMessengerEXT cb1, cb2, cb3;
// Must call extension functions through a function pointer:
PFN_vkCreateDebugUtilsMessengerEXT pfnCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT");
PFN_vkDestroyDebugUtilsMessengerEXT pfnDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT");
VkDebugUtilsMessengerCreateInfoEXT callback1 = {
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
.pNext = NULL,
.flags = 0,
.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT,
.messageType= VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT,
.pfnUserCallback = myOutputDebugString,
.pUserData = NULL
};
res = pfnCreateDebugUtilsMessengerEXT(instance, &callback1, NULL, &cb1);
if (res != VK_SUCCESS) {
// Do error handling for VK_ERROR_OUT_OF_MEMORY
}
callback1.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
callback1.pfnUserCallback = myDebugBreak;
callback1.pUserData = NULL;
res = pfnCreateDebugUtilsMessengerEXT(instance, &callback1, NULL, &cb2);
if (res != VK_SUCCESS) {
// Do error handling for VK_ERROR_OUT_OF_MEMORY
}
VkDebugUtilsMessengerCreateInfoEXT callback3 = {
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT,
.pNext = NULL,
.flags = 0,
.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT,
.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT,
.pfnUserCallback = mystdOutLogger,
.pUserData = NULL
};
res = pfnCreateDebugUtilsMessengerEXT(instance, &callback3, NULL, &cb3);
if (res != VK_SUCCESS) {
// Do error handling for VK_ERROR_OUT_OF_MEMORY
}
...
// Remove callbacks when cleaning up
pfnDestroyDebugUtilsMessengerEXT(instance, cb1, NULL);
pfnDestroyDebugUtilsMessengerEXT(instance, cb2, NULL);
pfnDestroyDebugUtilsMessengerEXT(instance, cb3, NULL);
Example 2
Associate a name with an image, for easier debugging in external tools or with validation layers that can print a friendly name when referring to objects in error messages.
extern VkInstance instance;
extern VkDevice device;
extern VkImage image;
// Must call extension functions through a function pointer:
PFN_vkSetDebugUtilsObjectNameEXT pfnSetDebugUtilsObjectNameEXT = (PFN_vkSetDebugUtilsObjectNameEXT)vkGetInstanceProcAddr(instance, "vkSetDebugUtilsObjectNameEXT");
// Set a name on the image
const VkDebugUtilsObjectNameInfoEXT imageNameInfo =
{
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT,
.pNext = NULL,
.objectType = VK_OBJECT_TYPE_IMAGE,
.objectHandle = (uint64_t)image,
.pObjectName = "Brick Diffuse Texture",
};
pfnSetDebugUtilsObjectNameEXT(device, &imageNameInfo);
// A subsequent error might print:
// Image 'Brick Diffuse Texture' (0xc0dec0dedeadbeef) is used in a
// command buffer with no memory bound to it.
Example 3
Annotating regions of a workload with naming information so that offline analysis tools can display a more usable visualization of the commands submitted.
extern VkInstance instance;
extern VkCommandBuffer commandBuffer;
// Must call extension functions through a function pointer:
PFN_vkQueueBeginDebugUtilsLabelEXT pfnQueueBeginDebugUtilsLabelEXT = (PFN_vkQueueBeginDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance, "vkQueueBeginDebugUtilsLabelEXT");
PFN_vkQueueEndDebugUtilsLabelEXT pfnQueueEndDebugUtilsLabelEXT = (PFN_vkQueueEndDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance, "vkQueueEndDebugUtilsLabelEXT");
PFN_vkCmdBeginDebugUtilsLabelEXT pfnCmdBeginDebugUtilsLabelEXT = (PFN_vkCmdBeginDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance, "vkCmdBeginDebugUtilsLabelEXT");
PFN_vkCmdEndDebugUtilsLabelEXT pfnCmdEndDebugUtilsLabelEXT = (PFN_vkCmdEndDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance, "vkCmdEndDebugUtilsLabelEXT");
PFN_vkCmdInsertDebugUtilsLabelEXT pfnCmdInsertDebugUtilsLabelEXT = (PFN_vkCmdInsertDebugUtilsLabelEXT)vkGetInstanceProcAddr(instance, "vkCmdInsertDebugUtilsLabelEXT");
// Describe the area being rendered
const VkDebugUtilsLabelEXT houseLabel =
{
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
.pNext = NULL,
.pLabelName = "Brick House",
.color = { 1.0f, 0.0f, 0.0f, 1.0f },
};
// Start an annotated group of calls under the 'Brick House' name
pfnCmdBeginDebugUtilsLabelEXT(commandBuffer, &houseLabel);
{
// A mutable structure for each part being rendered
VkDebugUtilsLabelEXT housePartLabel =
{
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
.pNext = NULL,
.pLabelName = NULL,
.color = { 0.0f, 0.0f, 0.0f, 0.0f },
};
// Set the name and insert the marker
housePartLabel.pLabelName = "Walls";
pfnCmdInsertDebugUtilsLabelEXT(commandBuffer, &housePartLabel);
// Insert the drawcall for the walls
vkCmdDrawIndexed(commandBuffer, 1000, 1, 0, 0, 0);
// Insert a recursive region for two sets of windows
housePartLabel.pLabelName = "Windows";
pfnCmdBeginDebugUtilsLabelEXT(commandBuffer, &housePartLabel);
{
vkCmdDrawIndexed(commandBuffer, 75, 6, 1000, 0, 0);
vkCmdDrawIndexed(commandBuffer, 100, 2, 1450, 0, 0);
}
pfnCmdEndDebugUtilsLabelEXT(commandBuffer);
housePartLabel.pLabelName = "Front Door";
pfnCmdInsertDebugUtilsLabelEXT(commandBuffer, &housePartLabel);
vkCmdDrawIndexed(commandBuffer, 350, 1, 1650, 0, 0);
housePartLabel.pLabelName = "Roof";
pfnCmdInsertDebugUtilsLabelEXT(commandBuffer, &housePartLabel);
vkCmdDrawIndexed(commandBuffer, 500, 1, 2000, 0, 0);
}
// End the house annotation started above
pfnCmdEndDebugUtilsLabelEXT(commandBuffer);
// Do other work
vkEndCommandBuffer(commandBuffer);
// Describe the queue being used
const VkDebugUtilsLabelEXT queueLabel =
{
.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT,
.pNext = NULL,
.pLabelName = "Main Render Work",
.color = { 0.0f, 1.0f, 0.0f, 1.0f },
};
// Identify the queue label region
pfnQueueBeginDebugUtilsLabelEXT(queue, &queueLabel);
// Submit the work for the main render thread
const VkCommandBuffer cmd_bufs[] = {commandBuffer};
VkSubmitInfo submit_info =
{
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
.pNext = NULL,
.waitSemaphoreCount = 0,
.pWaitSemaphores = NULL,
.pWaitDstStageMask = NULL,
.commandBufferCount = 1,
.pCommandBuffers = cmd_bufs,
.signalSemaphoreCount = 0,
.pSignalSemaphores = NULL
};
vkQueueSubmit(queue, 1, &submit_info, fence);
// End the queue label region
pfnQueueEndDebugUtilsLabelEXT(queue);
- Name String
VK_EXT_debug_utils- Extension Type
- Instance extension
- Registered Extension Number
- 129
- Revision
- 2
- Special Use
- Contact
- Mark Young marky-lunarg
Other Extension Metadata
- Last Modified Date
- 2020-04-03
- Revision
- 2
- IP Status
- No known IP claims.
- Dependencies
- This extension is written against version 1.0 of the Vulkan API.
- Requires
VkObjectType
- Contributors
- Mark Young, LunarG
- Baldur Karlsson
- Ian Elliott, Google
- Courtney Goeltzenleuchter, Google
- Karl Schultz, LunarG
- Mark Lobodzinski, LunarG
- Mike Schuchardt, LunarG
- Jaakko Konttinen, AMD
- Dan Ginsburg, Valve Software
- Rolando Olivares, Epic Games
- Dan Baker, Oxide Games
- Kyle Spagnoli, NVIDIA
- Jon Ashburn, LunarG
- Piers Daniell, NVIDIA
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final intVkDebugUtilsMessageSeverityFlagBitsEXT - Bitmask specifying which severities of events cause a debug messenger callbackstatic final intVkDebugUtilsMessageSeverityFlagBitsEXT - Bitmask specifying which severities of events cause a debug messenger callbackstatic final intVkDebugUtilsMessageSeverityFlagBitsEXT - Bitmask specifying which severities of events cause a debug messenger callbackstatic final intVkDebugUtilsMessageSeverityFlagBitsEXT - Bitmask specifying which severities of events cause a debug messenger callbackstatic final intVkDebugUtilsMessageTypeFlagBitsEXT - Bitmask specifying which types of events cause a debug messenger callbackstatic final intVkDebugUtilsMessageTypeFlagBitsEXT - Bitmask specifying which types of events cause a debug messenger callbackstatic final intVkDebugUtilsMessageTypeFlagBitsEXT - Bitmask specifying which types of events cause a debug messenger callbackstatic final StringThe extension name.static final intThe extension specification version.static final intExtendsVkObjectType.static final intExtendsVkStructureType.static final intExtendsVkStructureType.static final intExtendsVkStructureType.static final intExtendsVkStructureType.static final intExtendsVkStructureType. -
Method Summary
Modifier and TypeMethodDescriptionstatic voidnvkCmdBeginDebugUtilsLabelEXT(org.lwjgl.vulkan.VkCommandBuffer commandBuffer, long pLabelInfo) Unsafe version of:CmdBeginDebugUtilsLabelEXTstatic voidnvkCmdInsertDebugUtilsLabelEXT(org.lwjgl.vulkan.VkCommandBuffer commandBuffer, long pLabelInfo) Unsafe version of:CmdInsertDebugUtilsLabelEXTstatic intnvkCreateDebugUtilsMessengerEXT(org.lwjgl.vulkan.VkInstance instance, long pCreateInfo, long pAllocator, long pMessenger) Unsafe version of:CreateDebugUtilsMessengerEXTstatic voidnvkDestroyDebugUtilsMessengerEXT(org.lwjgl.vulkan.VkInstance instance, long messenger, long pAllocator) Unsafe version of:DestroyDebugUtilsMessengerEXTstatic voidnvkQueueBeginDebugUtilsLabelEXT(org.lwjgl.vulkan.VkQueue queue, long pLabelInfo) Unsafe version of:QueueBeginDebugUtilsLabelEXTstatic voidnvkQueueInsertDebugUtilsLabelEXT(org.lwjgl.vulkan.VkQueue queue, long pLabelInfo) Unsafe version of:QueueInsertDebugUtilsLabelEXTstatic intnvkSetDebugUtilsObjectNameEXT(org.lwjgl.vulkan.VkDevice device, long pNameInfo) Unsafe version of:SetDebugUtilsObjectNameEXTstatic intnvkSetDebugUtilsObjectTagEXT(org.lwjgl.vulkan.VkDevice device, long pTagInfo) Unsafe version of:SetDebugUtilsObjectTagEXTstatic voidnvkSubmitDebugUtilsMessageEXT(org.lwjgl.vulkan.VkInstance instance, int messageSeverity, int messageTypes, long pCallbackData) Unsafe version of:SubmitDebugUtilsMessageEXTstatic voidvkCmdBeginDebugUtilsLabelEXT(org.lwjgl.vulkan.VkCommandBuffer commandBuffer, VkDebugUtilsLabelEXT pLabelInfo) Open a command buffer debug label region.static voidvkCmdEndDebugUtilsLabelEXT(org.lwjgl.vulkan.VkCommandBuffer commandBuffer) Close a command buffer label region.static voidvkCmdInsertDebugUtilsLabelEXT(org.lwjgl.vulkan.VkCommandBuffer commandBuffer, VkDebugUtilsLabelEXT pLabelInfo) Insert a label into a command buffer.static intvkCreateDebugUtilsMessengerEXT(org.lwjgl.vulkan.VkInstance instance, VkDebugUtilsMessengerCreateInfoEXT pCreateInfo, @Nullable VkAllocationCallbacks pAllocator, long[] pMessenger) Array version of:CreateDebugUtilsMessengerEXTstatic intvkCreateDebugUtilsMessengerEXT(org.lwjgl.vulkan.VkInstance instance, VkDebugUtilsMessengerCreateInfoEXT pCreateInfo, @Nullable VkAllocationCallbacks pAllocator, LongBuffer pMessenger) Create a debug messenger object.static voidvkDestroyDebugUtilsMessengerEXT(org.lwjgl.vulkan.VkInstance instance, long messenger, @Nullable VkAllocationCallbacks pAllocator) Destroy a debug messenger object.static voidvkQueueBeginDebugUtilsLabelEXT(org.lwjgl.vulkan.VkQueue queue, VkDebugUtilsLabelEXT pLabelInfo) Open a queue debug label region.static voidvkQueueEndDebugUtilsLabelEXT(org.lwjgl.vulkan.VkQueue queue) Close a queue debug label region.static voidvkQueueInsertDebugUtilsLabelEXT(org.lwjgl.vulkan.VkQueue queue, VkDebugUtilsLabelEXT pLabelInfo) Insert a label into a queue.static intvkSetDebugUtilsObjectNameEXT(org.lwjgl.vulkan.VkDevice device, VkDebugUtilsObjectNameInfoEXT pNameInfo) Give an application-defined name to an object.static intvkSetDebugUtilsObjectTagEXT(org.lwjgl.vulkan.VkDevice device, VkDebugUtilsObjectTagInfoEXT pTagInfo) Attach arbitrary data to an object.static voidvkSubmitDebugUtilsMessageEXT(org.lwjgl.vulkan.VkInstance instance, int messageSeverity, int messageTypes, VkDebugUtilsMessengerCallbackDataEXT pCallbackData) Inject a message into a debug stream.
-
Field Details
-
VK_EXT_DEBUG_UTILS_SPEC_VERSION
public static final int VK_EXT_DEBUG_UTILS_SPEC_VERSIONThe extension specification version.- See Also:
-
VK_EXT_DEBUG_UTILS_EXTENSION_NAME
The extension name.- See Also:
-
VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT
public static final int VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXTExtendsVkStructureType.Enum values:
- See Also:
-
VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT
public static final int VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXTExtendsVkStructureType.Enum values:
- See Also:
-
VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT
public static final int VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXTExtendsVkStructureType.Enum values:
- See Also:
-
VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT
public static final int VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXTExtendsVkStructureType.Enum values:
- See Also:
-
VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT
public static final int VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXTExtendsVkStructureType.Enum values:
- See Also:
-
VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT
public static final int VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXTExtendsVkObjectType.- See Also:
-
VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT
public static final int VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXTVkDebugUtilsMessageSeverityFlagBitsEXT - Bitmask specifying which severities of events cause a debug messenger callbackDescription
DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXTspecifies the most verbose output indicating all diagnostic messages from the Vulkan loader, layers, and drivers should be captured.DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXTspecifies an informational message such as resource details that may be handy when debugging an application.DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXTspecifies use of Vulkan that may expose an application bug. Such cases may not be immediately harmful, such as a fragment shader outputting to a location with no attachment. Other cases may point to behavior that is almost certainly bad when unintended such as using an image whose memory has not been filled. In general if you see a warning but you know that the behavior is intended/desired, then simply ignore the warning.DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXTspecifies that the application has violated a valid usage condition of the specification.
Note
The values of
VkDebugUtilsMessageSeverityFlagBitsEXTare sorted based on severity. The higher the flag value, the more severe the message. This allows for simple boolean operation comparisons when looking atVkDebugUtilsMessageSeverityFlagBitsEXTvalues.For example:
if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { // Do something for warnings and errors }In addition, space has been left between the enums to allow for later addition of new severities in between the existing values.
See Also
VkDebugUtilsMessengerCallbackEXT,SubmitDebugUtilsMessageEXT- See Also:
-
VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT
public static final int VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXTVkDebugUtilsMessageSeverityFlagBitsEXT - Bitmask specifying which severities of events cause a debug messenger callbackDescription
DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXTspecifies the most verbose output indicating all diagnostic messages from the Vulkan loader, layers, and drivers should be captured.DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXTspecifies an informational message such as resource details that may be handy when debugging an application.DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXTspecifies use of Vulkan that may expose an application bug. Such cases may not be immediately harmful, such as a fragment shader outputting to a location with no attachment. Other cases may point to behavior that is almost certainly bad when unintended such as using an image whose memory has not been filled. In general if you see a warning but you know that the behavior is intended/desired, then simply ignore the warning.DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXTspecifies that the application has violated a valid usage condition of the specification.
Note
The values of
VkDebugUtilsMessageSeverityFlagBitsEXTare sorted based on severity. The higher the flag value, the more severe the message. This allows for simple boolean operation comparisons when looking atVkDebugUtilsMessageSeverityFlagBitsEXTvalues.For example:
if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { // Do something for warnings and errors }In addition, space has been left between the enums to allow for later addition of new severities in between the existing values.
See Also
VkDebugUtilsMessengerCallbackEXT,SubmitDebugUtilsMessageEXT- See Also:
-
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT
public static final int VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXTVkDebugUtilsMessageSeverityFlagBitsEXT - Bitmask specifying which severities of events cause a debug messenger callbackDescription
DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXTspecifies the most verbose output indicating all diagnostic messages from the Vulkan loader, layers, and drivers should be captured.DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXTspecifies an informational message such as resource details that may be handy when debugging an application.DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXTspecifies use of Vulkan that may expose an application bug. Such cases may not be immediately harmful, such as a fragment shader outputting to a location with no attachment. Other cases may point to behavior that is almost certainly bad when unintended such as using an image whose memory has not been filled. In general if you see a warning but you know that the behavior is intended/desired, then simply ignore the warning.DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXTspecifies that the application has violated a valid usage condition of the specification.
Note
The values of
VkDebugUtilsMessageSeverityFlagBitsEXTare sorted based on severity. The higher the flag value, the more severe the message. This allows for simple boolean operation comparisons when looking atVkDebugUtilsMessageSeverityFlagBitsEXTvalues.For example:
if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { // Do something for warnings and errors }In addition, space has been left between the enums to allow for later addition of new severities in between the existing values.
See Also
VkDebugUtilsMessengerCallbackEXT,SubmitDebugUtilsMessageEXT- See Also:
-
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT
public static final int VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXTVkDebugUtilsMessageSeverityFlagBitsEXT - Bitmask specifying which severities of events cause a debug messenger callbackDescription
DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXTspecifies the most verbose output indicating all diagnostic messages from the Vulkan loader, layers, and drivers should be captured.DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXTspecifies an informational message such as resource details that may be handy when debugging an application.DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXTspecifies use of Vulkan that may expose an application bug. Such cases may not be immediately harmful, such as a fragment shader outputting to a location with no attachment. Other cases may point to behavior that is almost certainly bad when unintended such as using an image whose memory has not been filled. In general if you see a warning but you know that the behavior is intended/desired, then simply ignore the warning.DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXTspecifies that the application has violated a valid usage condition of the specification.
Note
The values of
VkDebugUtilsMessageSeverityFlagBitsEXTare sorted based on severity. The higher the flag value, the more severe the message. This allows for simple boolean operation comparisons when looking atVkDebugUtilsMessageSeverityFlagBitsEXTvalues.For example:
if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { // Do something for warnings and errors }In addition, space has been left between the enums to allow for later addition of new severities in between the existing values.
See Also
VkDebugUtilsMessengerCallbackEXT,SubmitDebugUtilsMessageEXT- See Also:
-
VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT
public static final int VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXTVkDebugUtilsMessageTypeFlagBitsEXT - Bitmask specifying which types of events cause a debug messenger callbackDescription
DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXTspecifies that some general event has occurred. This is typically a non-specification, non-performance event.DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXTspecifies that something has occurred during validation against the Vulkan specification that may indicate invalid behavior.DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXTspecifies a potentially non-optimal use of Vulkan, e.g. usingCmdClearColorImagewhen settingVkAttachmentDescription::loadOptoATTACHMENT_LOAD_OP_CLEARwould have worked.DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXTspecifies that the implementation has modified the set of GPU-visible virtual addresses associated with a Vulkan object.
- See Also:
-
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT
public static final int VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXTVkDebugUtilsMessageTypeFlagBitsEXT - Bitmask specifying which types of events cause a debug messenger callbackDescription
DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXTspecifies that some general event has occurred. This is typically a non-specification, non-performance event.DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXTspecifies that something has occurred during validation against the Vulkan specification that may indicate invalid behavior.DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXTspecifies a potentially non-optimal use of Vulkan, e.g. usingCmdClearColorImagewhen settingVkAttachmentDescription::loadOptoATTACHMENT_LOAD_OP_CLEARwould have worked.DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXTspecifies that the implementation has modified the set of GPU-visible virtual addresses associated with a Vulkan object.
- See Also:
-
VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT
public static final int VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXTVkDebugUtilsMessageTypeFlagBitsEXT - Bitmask specifying which types of events cause a debug messenger callbackDescription
DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXTspecifies that some general event has occurred. This is typically a non-specification, non-performance event.DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXTspecifies that something has occurred during validation against the Vulkan specification that may indicate invalid behavior.DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXTspecifies a potentially non-optimal use of Vulkan, e.g. usingCmdClearColorImagewhen settingVkAttachmentDescription::loadOptoATTACHMENT_LOAD_OP_CLEARwould have worked.DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXTspecifies that the implementation has modified the set of GPU-visible virtual addresses associated with a Vulkan object.
- See Also:
-
-
Method Details
-
nvkSetDebugUtilsObjectNameEXT
public static int nvkSetDebugUtilsObjectNameEXT(org.lwjgl.vulkan.VkDevice device, long pNameInfo) Unsafe version of:SetDebugUtilsObjectNameEXT -
vkSetDebugUtilsObjectNameEXT
public static int vkSetDebugUtilsObjectNameEXT(org.lwjgl.vulkan.VkDevice device, VkDebugUtilsObjectNameInfoEXT pNameInfo) Give an application-defined name to an object.C Specification
An object can be given an application-defined name by calling:
VkResult vkSetDebugUtilsObjectNameEXT( VkDevice device, const VkDebugUtilsObjectNameInfoEXT* pNameInfo);Valid Usage
pNameInfo→objectTypemust not beOBJECT_TYPE_UNKNOWNpNameInfo→objectHandlemust not beNULL_HANDLE- If
pNameInfo→objectHandleis the valid handle of an instance-level object, theVkDeviceidentified bydevicemust be a descendent of the sameVkInstanceas the object identified bypNameInfo→objectHandle - If
pNameInfo→objectHandleis the valid handle of a physical-device-level object, theVkDeviceidentified bydevicemust be a descendant of the sameVkPhysicalDeviceas the object identified bypNameInfo→objectHandle - If
pNameInfo→objectHandleis the valid handle of a device-level object, that object must be a descendent of theVkDeviceidentified bydevice
Valid Usage (Implicit)
devicemust be a validVkDevicehandlepNameInfomust be a valid pointer to a validVkDebugUtilsObjectNameInfoEXTstructure
Host Synchronization
- Host access to
pNameInfo→objectHandlemust be externally synchronized
Return Codes
- On success, this command returns
- On failure, this command returns
See Also
- Parameters:
device- the device that is associated with the named object passed in viaobjectHandle.pNameInfo- a pointer to aVkDebugUtilsObjectNameInfoEXTstructure specifying parameters of the name to set on the object.
-
nvkSetDebugUtilsObjectTagEXT
public static int nvkSetDebugUtilsObjectTagEXT(org.lwjgl.vulkan.VkDevice device, long pTagInfo) Unsafe version of:SetDebugUtilsObjectTagEXT -
vkSetDebugUtilsObjectTagEXT
public static int vkSetDebugUtilsObjectTagEXT(org.lwjgl.vulkan.VkDevice device, VkDebugUtilsObjectTagInfoEXT pTagInfo) Attach arbitrary data to an object.C Specification
VkResult vkSetDebugUtilsObjectTagEXT( VkDevice device, const VkDebugUtilsObjectTagInfoEXT* pTagInfo);Valid Usage
- If
pNameInfo→objectHandleis the valid handle of an instance-level object, theVkDeviceidentified bydevicemust be a descendent of the sameVkInstanceas the object identified bypNameInfo→objectHandle - If
pNameInfo→objectHandleis the valid handle of a physical-device-level object, theVkDeviceidentified bydevicemust be a descendant of the sameVkPhysicalDeviceas the object identified bypNameInfo→objectHandle - If
pNameInfo→objectHandleis the valid handle of a device-level object, that object must be a descendent of theVkDeviceidentified bydevice
Valid Usage (Implicit)
devicemust be a validVkDevicehandlepTagInfomust be a valid pointer to a validVkDebugUtilsObjectTagInfoEXTstructure
Host Synchronization
- Host access to
pTagInfo→objectHandlemust be externally synchronized
Return Codes
- On success, this command returns
- On failure, this command returns
See Also
- Parameters:
device- the device that created the object.pTagInfo- a pointer to aVkDebugUtilsObjectTagInfoEXTstructure specifying parameters of the tag to attach to the object.
- If
-
nvkQueueBeginDebugUtilsLabelEXT
public static void nvkQueueBeginDebugUtilsLabelEXT(org.lwjgl.vulkan.VkQueue queue, long pLabelInfo) Unsafe version of:QueueBeginDebugUtilsLabelEXT -
vkQueueBeginDebugUtilsLabelEXT
public static void vkQueueBeginDebugUtilsLabelEXT(org.lwjgl.vulkan.VkQueue queue, VkDebugUtilsLabelEXT pLabelInfo) Open a queue debug label region.C Specification
A queue debug label region is opened by calling:
void vkQueueBeginDebugUtilsLabelEXT( VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo);Valid Usage (Implicit)
queuemust be a validVkQueuehandlepLabelInfomust be a valid pointer to a validVkDebugUtilsLabelEXTstructure
Command Properties
Command Buffer Levels Render Pass Scope Video Coding Scope Supported Queue Types Command Type - - - Any - See Also
- Parameters:
queue- the queue in which to start a debug label region.pLabelInfo- a pointer to aVkDebugUtilsLabelEXTstructure specifying parameters of the label region to open.
-
vkQueueEndDebugUtilsLabelEXT
public static void vkQueueEndDebugUtilsLabelEXT(org.lwjgl.vulkan.VkQueue queue) Close a queue debug label region.C Specification
A queue debug label region is closed by calling:
void vkQueueEndDebugUtilsLabelEXT( VkQueue queue);Description
The calls to
QueueBeginDebugUtilsLabelEXTandQueueEndDebugUtilsLabelEXTmust be matched and balanced.Valid Usage
- There must be an outstanding
vkQueueBeginDebugUtilsLabelEXTcommand prior to thevkQueueEndDebugUtilsLabelEXTon the queue
Valid Usage (Implicit)
queuemust be a validVkQueuehandle
Command Properties
Command Buffer Levels Render Pass Scope Video Coding Scope Supported Queue Types Command Type - - - Any - - Parameters:
queue- the queue in which a debug label region should be closed.
- There must be an outstanding
-
nvkQueueInsertDebugUtilsLabelEXT
public static void nvkQueueInsertDebugUtilsLabelEXT(org.lwjgl.vulkan.VkQueue queue, long pLabelInfo) Unsafe version of:QueueInsertDebugUtilsLabelEXT -
vkQueueInsertDebugUtilsLabelEXT
public static void vkQueueInsertDebugUtilsLabelEXT(org.lwjgl.vulkan.VkQueue queue, VkDebugUtilsLabelEXT pLabelInfo) Insert a label into a queue.C Specification
A single label can be inserted into a queue by calling:
void vkQueueInsertDebugUtilsLabelEXT( VkQueue queue, const VkDebugUtilsLabelEXT* pLabelInfo);Valid Usage (Implicit)
queuemust be a validVkQueuehandlepLabelInfomust be a valid pointer to a validVkDebugUtilsLabelEXTstructure
Command Properties
Command Buffer Levels Render Pass Scope Video Coding Scope Supported Queue Types Command Type - - - Any - See Also
- Parameters:
queue- the queue into which a debug label will be inserted.pLabelInfo- a pointer to aVkDebugUtilsLabelEXTstructure specifying parameters of the label to insert.
-
nvkCmdBeginDebugUtilsLabelEXT
public static void nvkCmdBeginDebugUtilsLabelEXT(org.lwjgl.vulkan.VkCommandBuffer commandBuffer, long pLabelInfo) Unsafe version of:CmdBeginDebugUtilsLabelEXT -
vkCmdBeginDebugUtilsLabelEXT
public static void vkCmdBeginDebugUtilsLabelEXT(org.lwjgl.vulkan.VkCommandBuffer commandBuffer, VkDebugUtilsLabelEXT pLabelInfo) Open a command buffer debug label region.C Specification
A command buffer debug label region can be opened by calling:
void vkCmdBeginDebugUtilsLabelEXT( VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT* pLabelInfo);Valid Usage (Implicit)
commandBuffermust be a validVkCommandBufferhandlepLabelInfomust be a valid pointer to a validVkDebugUtilsLabelEXTstructurecommandBuffermust be in the recording state- The
VkCommandPoolthatcommandBufferwas allocated from must support graphics, or compute operations - This command must only be called outside of a video coding scope
Host Synchronization
- Host access to
commandBuffermust be externally synchronized - Host access to the
VkCommandPoolthatcommandBufferwas allocated from must be externally synchronized
Command Properties
Command Buffer Levels Render Pass Scope Video Coding Scope Supported Queue Types Command Type Primary Secondary Both Outside Graphics Compute Action State See Also
- Parameters:
commandBuffer- the command buffer into which the command is recorded.pLabelInfo- a pointer to aVkDebugUtilsLabelEXTstructure specifying parameters of the label region to open.
-
vkCmdEndDebugUtilsLabelEXT
public static void vkCmdEndDebugUtilsLabelEXT(org.lwjgl.vulkan.VkCommandBuffer commandBuffer) Close a command buffer label region.C Specification
A command buffer label region can be closed by calling:
void vkCmdEndDebugUtilsLabelEXT( VkCommandBuffer commandBuffer);Description
An application may open a debug label region in one command buffer and close it in another, or otherwise split debug label regions across multiple command buffers or multiple queue submissions. When viewed from the linear series of submissions to a single queue, the calls to
CmdBeginDebugUtilsLabelEXTandCmdEndDebugUtilsLabelEXTmust be matched and balanced.There can be problems reporting command buffer debug labels during the recording process because command buffers may be recorded out of sequence with the resulting execution order. Since the recording order may be different, a solitary command buffer may have an inconsistent view of the debug label regions by itself. Therefore, if an issue occurs during the recording of a command buffer, and the environment requires returning debug labels, the implementation may return only those labels it is aware of. This is true even if the implementation is aware of only the debug labels within the command buffer being actively recorded.
Valid Usage
- There must be an outstanding
vkCmdBeginDebugUtilsLabelEXTcommand prior to thevkCmdEndDebugUtilsLabelEXTon the queue thatcommandBufferis submitted to - If
commandBufferis a secondary command buffer, there must be an outstandingvkCmdBeginDebugUtilsLabelEXTcommand recorded tocommandBufferthat has not previously been ended by a call tovkCmdEndDebugUtilsLabelEXT
Valid Usage (Implicit)
commandBuffermust be a validVkCommandBufferhandlecommandBuffermust be in the recording state- The
VkCommandPoolthatcommandBufferwas allocated from must support graphics, or compute operations - This command must only be called outside of a video coding scope
Host Synchronization
- Host access to
commandBuffermust be externally synchronized - Host access to the
VkCommandPoolthatcommandBufferwas allocated from must be externally synchronized
Command Properties
Command Buffer Levels Render Pass Scope Video Coding Scope Supported Queue Types Command Type Primary Secondary Both Outside Graphics Compute Action State - Parameters:
commandBuffer- the command buffer into which the command is recorded.
- There must be an outstanding
-
nvkCmdInsertDebugUtilsLabelEXT
public static void nvkCmdInsertDebugUtilsLabelEXT(org.lwjgl.vulkan.VkCommandBuffer commandBuffer, long pLabelInfo) Unsafe version of:CmdInsertDebugUtilsLabelEXT -
vkCmdInsertDebugUtilsLabelEXT
public static void vkCmdInsertDebugUtilsLabelEXT(org.lwjgl.vulkan.VkCommandBuffer commandBuffer, VkDebugUtilsLabelEXT pLabelInfo) Insert a label into a command buffer.C Specification
A single debug label can be inserted into a command buffer by calling:
void vkCmdInsertDebugUtilsLabelEXT( VkCommandBuffer commandBuffer, const VkDebugUtilsLabelEXT* pLabelInfo);Valid Usage (Implicit)
commandBuffermust be a validVkCommandBufferhandlepLabelInfomust be a valid pointer to a validVkDebugUtilsLabelEXTstructurecommandBuffermust be in the recording state- The
VkCommandPoolthatcommandBufferwas allocated from must support graphics, or compute operations - This command must only be called outside of a video coding scope
Host Synchronization
- Host access to
commandBuffermust be externally synchronized - Host access to the
VkCommandPoolthatcommandBufferwas allocated from must be externally synchronized
Command Properties
Command Buffer Levels Render Pass Scope Video Coding Scope Supported Queue Types Command Type Primary Secondary Both Outside Graphics Compute Action See Also
- Parameters:
commandBuffer- the command buffer into which the command is recorded.
-
nvkCreateDebugUtilsMessengerEXT
public static int nvkCreateDebugUtilsMessengerEXT(org.lwjgl.vulkan.VkInstance instance, long pCreateInfo, long pAllocator, long pMessenger) Unsafe version of:CreateDebugUtilsMessengerEXT -
vkCreateDebugUtilsMessengerEXT
public static int vkCreateDebugUtilsMessengerEXT(org.lwjgl.vulkan.VkInstance instance, VkDebugUtilsMessengerCreateInfoEXT pCreateInfo, @Nullable VkAllocationCallbacks pAllocator, LongBuffer pMessenger) Create a debug messenger object.C Specification
A debug messenger triggers a debug callback with a debug message when an event of interest occurs. To create a debug messenger which will trigger a debug callback, call:
VkResult vkCreateDebugUtilsMessengerEXT( VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pMessenger);Valid Usage (Implicit)
instancemust be a validVkInstancehandlepCreateInfomust be a valid pointer to a validVkDebugUtilsMessengerCreateInfoEXTstructure- If
pAllocatoris notNULL,pAllocatormust be a valid pointer to a validVkAllocationCallbacksstructure pMessengermust be a valid pointer to aVkDebugUtilsMessengerEXThandle
Return Codes
- On success, this command returns
- On failure, this command returns
The application must ensure that
CreateDebugUtilsMessengerEXTis not executed in parallel with any Vulkan command that is also called withinstanceor child ofinstanceas the dispatchable argument.See Also
- Parameters:
instance- the instance the messenger will be used with.pCreateInfo- a pointer to aVkDebugUtilsMessengerCreateInfoEXTstructure containing the callback pointer, as well as defining conditions under which this messenger will trigger the callback.pAllocator- controls host memory allocation as described in the Memory Allocation chapter.pMessenger- a pointer to aVkDebugUtilsMessengerEXThandle in which the created object is returned.
-
nvkDestroyDebugUtilsMessengerEXT
public static void nvkDestroyDebugUtilsMessengerEXT(org.lwjgl.vulkan.VkInstance instance, long messenger, long pAllocator) Unsafe version of:DestroyDebugUtilsMessengerEXT -
vkDestroyDebugUtilsMessengerEXT
public static void vkDestroyDebugUtilsMessengerEXT(org.lwjgl.vulkan.VkInstance instance, long messenger, @Nullable VkAllocationCallbacks pAllocator) Destroy a debug messenger object.C Specification
To destroy a
VkDebugUtilsMessengerEXTobject, call:void vkDestroyDebugUtilsMessengerEXT( VkInstance instance, VkDebugUtilsMessengerEXT messenger, const VkAllocationCallbacks* pAllocator);Valid Usage
- If
VkAllocationCallbackswere provided whenmessengerwas created, a compatible set of callbacks must be provided here - If no
VkAllocationCallbackswere provided whenmessengerwas created,pAllocatormust beNULL
Valid Usage (Implicit)
instancemust be a validVkInstancehandle- If
messengeris notNULL_HANDLE,messengermust be a validVkDebugUtilsMessengerEXThandle - If
pAllocatoris notNULL,pAllocatormust be a valid pointer to a validVkAllocationCallbacksstructure - If
messengeris a valid handle, it must have been created, allocated, or retrieved frominstance
Host Synchronization
- Host access to
messengermust be externally synchronized
The application must ensure that
DestroyDebugUtilsMessengerEXTis not executed in parallel with any Vulkan command that is also called withinstanceor child ofinstanceas the dispatchable argument.See Also
- Parameters:
instance- the instance where the callback was created.messenger- theVkDebugUtilsMessengerEXTobject to destroy.messengeris an externally synchronized object and must not be used on more than one thread at a time. This means thatvkDestroyDebugUtilsMessengerEXTmust not be called when a callback is active.pAllocator- controls host memory allocation as described in the Memory Allocation chapter.
- If
-
nvkSubmitDebugUtilsMessageEXT
public static void nvkSubmitDebugUtilsMessageEXT(org.lwjgl.vulkan.VkInstance instance, int messageSeverity, int messageTypes, long pCallbackData) Unsafe version of:SubmitDebugUtilsMessageEXT -
vkSubmitDebugUtilsMessageEXT
public static void vkSubmitDebugUtilsMessageEXT(org.lwjgl.vulkan.VkInstance instance, int messageSeverity, int messageTypes, VkDebugUtilsMessengerCallbackDataEXT pCallbackData) Inject a message into a debug stream.C Specification
To intentionally submit a debug message, call:
void vkSubmitDebugUtilsMessageEXT( VkInstance instance, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData);Description
The call will propagate through the layers and generate callback(s) as indicated by the message’s flags. The parameters are passed on to the callback in addition to the
pUserDatavalue that was defined at the time the messenger was registered.Valid Usage
- The
objectTypemember of each element ofpCallbackData→pObjectsmust not beOBJECT_TYPE_UNKNOWN
Valid Usage (Implicit)
instancemust be a validVkInstancehandlemessageSeveritymust be a validVkDebugUtilsMessageSeverityFlagBitsEXTvaluemessageTypesmust be a valid combination ofVkDebugUtilsMessageTypeFlagBitsEXTvaluesmessageTypesmust not be 0pCallbackDatamust be a valid pointer to a validVkDebugUtilsMessengerCallbackDataEXTstructure
See Also
- Parameters:
instance- the debug stream’sVkInstance.messageSeverity- aVkDebugUtilsMessageSeverityFlagBitsEXTvalue specifying the severity of this event/message.messageTypes- a bitmask ofVkDebugUtilsMessageTypeFlagBitsEXTspecifying which type of event(s) to identify with this message.pCallbackData- contains all the callback related data in theVkDebugUtilsMessengerCallbackDataEXTstructure.
- The
-
vkCreateDebugUtilsMessengerEXT
public static int vkCreateDebugUtilsMessengerEXT(org.lwjgl.vulkan.VkInstance instance, VkDebugUtilsMessengerCreateInfoEXT pCreateInfo, @Nullable VkAllocationCallbacks pAllocator, long[] pMessenger) Array version of:CreateDebugUtilsMessengerEXT
-