// Copyright 2018-2021 The Khronos Group, Inc.
//
// SPDX-License-Identifier: CC-BY-4.0

// This section is included inside the Debugging chapter (debugging.txt)

[[debugging-debug-markers]]
== Debug Markers

Debug markers provide a flexible way for debugging and validation layers to
receive annotation and debug information.

The <<debugging-object-annotation,Object Annotation>> section describes how
to associate a name or binary data with a Vulkan object.

The <<debugging-command-buffer-markers,Command Buffer Markers>> section
describes how to associate logical elements of the scene with commands in
the command buffer.


[[debugging-object-annotation]]
=== Object Annotation

The commands in this section allow application developers to associate
user-defined information with Vulkan objects at will.

[open,refpage='vkDebugMarkerSetObjectNameEXT',desc='Give a user-friendly name to an object',type='protos']
--
An object can be given a user-friendly name by calling:

include::{generated}/api/protos/vkDebugMarkerSetObjectNameEXT.txt[]

  * pname:device is the device that created the object.
  * pname:pNameInfo is a pointer to a slink:VkDebugMarkerObjectNameInfoEXT
    structure specifying the parameters of the name to set on the object.

include::{generated}/validity/protos/vkDebugMarkerSetObjectNameEXT.txt[]
--

[open,refpage='VkDebugMarkerObjectNameInfoEXT',desc='Specify parameters of a name to give to an object',type='structs']
--
The sname:VkDebugMarkerObjectNameInfoEXT structure is defined as:

include::{generated}/api/structs/VkDebugMarkerObjectNameInfoEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:objectType is a elink:VkDebugReportObjectTypeEXT specifying the
    type of the object to be named.
  * pname:object is the object to be named.
  * pname:pObjectName is a null-terminated UTF-8 string specifying the name
    to apply to pname:object.

Applications may: change the name associated with an object simply by
calling fname:vkDebugMarkerSetObjectNameEXT again with a new string.
To remove a previously set name, pname:pObjectName should: be set to an
empty string.

.Valid Usage
****
  * [[VUID-VkDebugMarkerObjectNameInfoEXT-objectType-01490]]
    pname:objectType must: not be
    ename:VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT
  * [[VUID-VkDebugMarkerObjectNameInfoEXT-object-01491]]
    pname:object must: not be dlink:VK_NULL_HANDLE
  * [[VUID-VkDebugMarkerObjectNameInfoEXT-object-01492]]
    pname:object must: be a Vulkan object of the type associated with
    pname:objectType as defined in <<debug-report-object-types>>
****

include::{generated}/validity/structs/VkDebugMarkerObjectNameInfoEXT.txt[]
--

[open,refpage='vkDebugMarkerSetObjectTagEXT',desc='Attach arbitrary data to an object',type='protos']
--
In addition to setting a name for an object, debugging and validation layers
may have uses for additional binary data on a per-object basis that has no
other place in the Vulkan API.
For example, a sname:VkShaderModule could have additional debugging data
attached to it to aid in offline shader tracing.
To attach data to an object, call:

include::{generated}/api/protos/vkDebugMarkerSetObjectTagEXT.txt[]

  * pname:device is the device that created the object.
  * pname:pTagInfo is a pointer to a slink:VkDebugMarkerObjectTagInfoEXT
    structure specifying the parameters of the tag to attach to the object.

include::{generated}/validity/protos/vkDebugMarkerSetObjectTagEXT.txt[]
--

[open,refpage='VkDebugMarkerObjectTagInfoEXT',desc='Specify parameters of a tag to attach to an object',type='structs']
--
The sname:VkDebugMarkerObjectTagInfoEXT structure is defined as:

include::{generated}/api/structs/VkDebugMarkerObjectTagInfoEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:objectType is a elink:VkDebugReportObjectTypeEXT specifying the
    type of the object to be named.
  * pname:object is the object to be tagged.
  * pname:tagName is a numerical identifier of the tag.
  * pname:tagSize is the number of bytes of data to attach to the object.
  * pname:pTag is a pointer to an array of pname:tagSize bytes containing
    the data to be associated with the object.

The pname:tagName parameter gives a name or identifier to the type of data
being tagged.
This can be used by debugging layers to easily filter for only data that can
be used by that implementation.

.Valid Usage
****
  * [[VUID-VkDebugMarkerObjectTagInfoEXT-objectType-01493]]
    pname:objectType must: not be
    ename:VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT
  * [[VUID-VkDebugMarkerObjectTagInfoEXT-object-01494]]
    pname:object must: not be dlink:VK_NULL_HANDLE
  * [[VUID-VkDebugMarkerObjectTagInfoEXT-object-01495]]
    pname:object must: be a Vulkan object of the type associated with
    pname:objectType as defined in <<debug-report-object-types>>
****

include::{generated}/validity/structs/VkDebugMarkerObjectTagInfoEXT.txt[]
--


[[debugging-command-buffer-markers]]
=== Command Buffer Markers

Typical Vulkan applications will submit many command buffers in each frame,
with each command buffer containing a large number of individual commands.
Being able to logically annotate regions of command buffers that belong
together as well as hierarchically subdivide the frame is important to a
developer's ability to navigate the commands viewed holistically.

The marker commands fname:vkCmdDebugMarkerBeginEXT and
fname:vkCmdDebugMarkerEndEXT define regions of a series of commands that are
grouped together, and they can be nested to create a hierarchy.
The fname:vkCmdDebugMarkerInsertEXT command allows insertion of a single
label within a command buffer.

[open,refpage='vkCmdDebugMarkerBeginEXT',desc='Open a command buffer marker region',type='protos']
--
A marker region can be opened by calling:

include::{generated}/api/protos/vkCmdDebugMarkerBeginEXT.txt[]

  * pname:commandBuffer is the command buffer into which the command is
    recorded.
  * pname:pMarkerInfo is a pointer to a slink:VkDebugMarkerMarkerInfoEXT
    structure specifying the parameters of the marker region to open.

include::{generated}/validity/protos/vkCmdDebugMarkerBeginEXT.txt[]
--

[open,refpage='VkDebugMarkerMarkerInfoEXT',desc='Specify parameters of a command buffer marker region',type='structs']
--
The sname:VkDebugMarkerMarkerInfoEXT structure is defined as:

include::{generated}/api/structs/VkDebugMarkerMarkerInfoEXT.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to a structure extending this
    structure.
  * pname:pMarkerName is a pointer to a null-terminated UTF-8 string
    containing the name of the marker.
  * pname:color is an optional: RGBA color value that can be associated with
    the marker.
    A particular implementation may: choose to ignore this color value.
    The values contain RGBA values in order, in the range 0.0 to 1.0.
    If all elements in pname:color are set to 0.0 then it is ignored.

include::{generated}/validity/structs/VkDebugMarkerMarkerInfoEXT.txt[]
--

[open,refpage='vkCmdDebugMarkerEndEXT',desc='Close a command buffer marker region',type='protos']
--
A marker region can be closed by calling:

include::{generated}/api/protos/vkCmdDebugMarkerEndEXT.txt[]

  * pname:commandBuffer is the command buffer into which the command is
    recorded.

An application may: open a marker region in one command buffer and close it
in another, or otherwise split marker regions across multiple command
buffers or multiple queue submissions.
When viewed from the linear series of submissions to a single queue, the
calls to fname:vkCmdDebugMarkerBeginEXT and fname:vkCmdDebugMarkerEndEXT
must: be matched and balanced.

.Valid Usage
****
  * [[VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01239]]
    There must: be an outstanding flink:vkCmdDebugMarkerBeginEXT command
    prior to the fname:vkCmdDebugMarkerEndEXT on the queue that
    pname:commandBuffer is submitted to
  * [[VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01240]]
    If pname:commandBuffer is a secondary command buffer, there must: be an
    outstanding flink:vkCmdDebugMarkerBeginEXT command recorded to
    pname:commandBuffer that has not previously been ended by a call to
    flink:vkCmdDebugMarkerEndEXT
****

include::{generated}/validity/protos/vkCmdDebugMarkerEndEXT.txt[]
--

[open,refpage='vkCmdDebugMarkerInsertEXT',desc='Insert a marker label into a command buffer',type='protos']
--
A single marker label can be inserted into a command buffer by calling:

include::{generated}/api/protos/vkCmdDebugMarkerInsertEXT.txt[]

  * pname:commandBuffer is the command buffer into which the command is
    recorded.
  * pname:pMarkerInfo is a pointer to a slink:VkDebugMarkerMarkerInfoEXT
    structure specifying the parameters of the marker to insert.

include::{generated}/validity/protos/vkCmdDebugMarkerInsertEXT.txt[]
--
