调试

为了帮助开发人员跟踪应用程序中使用 Vulkan 时的错误,尤其是在结合外部调试器或性能分析器时,可以使用调试扩展

VkObjectType 枚举定义了一些值,每个值对应一个特定的 Vulkan 句柄类型。这些值可以用于通过一个或多个扩展将调试信息与特定类型的对象关联起来。

// Provided by VK_VERSION_1_0
typedef enum VkObjectType {
    VK_OBJECT_TYPE_UNKNOWN = 0,
    VK_OBJECT_TYPE_INSTANCE = 1,
    VK_OBJECT_TYPE_PHYSICAL_DEVICE = 2,
    VK_OBJECT_TYPE_DEVICE = 3,
    VK_OBJECT_TYPE_QUEUE = 4,
    VK_OBJECT_TYPE_SEMAPHORE = 5,
    VK_OBJECT_TYPE_COMMAND_BUFFER = 6,
    VK_OBJECT_TYPE_FENCE = 7,
    VK_OBJECT_TYPE_DEVICE_MEMORY = 8,
    VK_OBJECT_TYPE_BUFFER = 9,
    VK_OBJECT_TYPE_IMAGE = 10,
    VK_OBJECT_TYPE_EVENT = 11,
    VK_OBJECT_TYPE_QUERY_POOL = 12,
    VK_OBJECT_TYPE_BUFFER_VIEW = 13,
    VK_OBJECT_TYPE_IMAGE_VIEW = 14,
    VK_OBJECT_TYPE_SHADER_MODULE = 15,
    VK_OBJECT_TYPE_PIPELINE_CACHE = 16,
    VK_OBJECT_TYPE_PIPELINE_LAYOUT = 17,
    VK_OBJECT_TYPE_RENDER_PASS = 18,
    VK_OBJECT_TYPE_PIPELINE = 19,
    VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT = 20,
    VK_OBJECT_TYPE_SAMPLER = 21,
    VK_OBJECT_TYPE_DESCRIPTOR_POOL = 22,
    VK_OBJECT_TYPE_DESCRIPTOR_SET = 23,
    VK_OBJECT_TYPE_FRAMEBUFFER = 24,
    VK_OBJECT_TYPE_COMMAND_POOL = 25,
  // Provided by VK_VERSION_1_1
    VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION = 1000156000,
  // Provided by VK_VERSION_1_1
    VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE = 1000085000,
  // Provided by VK_VERSION_1_3
    VK_OBJECT_TYPE_PRIVATE_DATA_SLOT = 1000295000,
  // Provided by VK_KHR_surface
    VK_OBJECT_TYPE_SURFACE_KHR = 1000000000,
  // Provided by VK_KHR_swapchain
    VK_OBJECT_TYPE_SWAPCHAIN_KHR = 1000001000,
  // Provided by VK_KHR_display
    VK_OBJECT_TYPE_DISPLAY_KHR = 1000002000,
  // Provided by VK_KHR_display
    VK_OBJECT_TYPE_DISPLAY_MODE_KHR = 1000002001,
  // Provided by VK_EXT_debug_report
    VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT = 1000011000,
  // Provided by VK_KHR_video_queue
    VK_OBJECT_TYPE_VIDEO_SESSION_KHR = 1000023000,
  // Provided by VK_KHR_video_queue
    VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR = 1000023001,
  // Provided by VK_NVX_binary_import
    VK_OBJECT_TYPE_CU_MODULE_NVX = 1000029000,
  // Provided by VK_NVX_binary_import
    VK_OBJECT_TYPE_CU_FUNCTION_NVX = 1000029001,
  // Provided by VK_EXT_debug_utils
    VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT = 1000128000,
  // Provided by VK_KHR_acceleration_structure
    VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000,
  // Provided by VK_EXT_validation_cache
    VK_OBJECT_TYPE_VALIDATION_CACHE_EXT = 1000160000,
  // Provided by VK_NV_ray_tracing
    VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000,
  // Provided by VK_INTEL_performance_query
    VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL = 1000210000,
  // Provided by VK_KHR_deferred_host_operations
    VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR = 1000268000,
  // Provided by VK_NV_device_generated_commands
    VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV = 1000277000,
  // Provided by VK_NV_cuda_kernel_launch
    VK_OBJECT_TYPE_CUDA_MODULE_NV = 1000307000,
  // Provided by VK_NV_cuda_kernel_launch
    VK_OBJECT_TYPE_CUDA_FUNCTION_NV = 1000307001,
  // Provided by VK_FUCHSIA_buffer_collection
    VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA = 1000366000,
  // Provided by VK_EXT_opacity_micromap
    VK_OBJECT_TYPE_MICROMAP_EXT = 1000396000,
  // Provided by VK_NV_optical_flow
    VK_OBJECT_TYPE_OPTICAL_FLOW_SESSION_NV = 1000464000,
  // Provided by VK_EXT_shader_object
    VK_OBJECT_TYPE_SHADER_EXT = 1000482000,
  // Provided by VK_KHR_pipeline_binary
    VK_OBJECT_TYPE_PIPELINE_BINARY_KHR = 1000483000,
  // Provided by VK_EXT_device_generated_commands
    VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_EXT = 1000572000,
  // Provided by VK_EXT_device_generated_commands
    VK_OBJECT_TYPE_INDIRECT_EXECUTION_SET_EXT = 1000572001,
  // Provided by VK_KHR_descriptor_update_template
    VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR = VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE,
  // Provided by VK_KHR_sampler_ycbcr_conversion
    VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR = VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION,
  // Provided by VK_EXT_private_data
    VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT = VK_OBJECT_TYPE_PRIVATE_DATA_SLOT,
} VkObjectType;
表 1. VkObjectType 和 Vulkan 句柄关系
VkObjectType Vulkan 句柄类型

VK_OBJECT_TYPE_UNKNOWN

未知/未定义的句柄

VK_OBJECT_TYPE_INSTANCE

VkInstance

VK_OBJECT_TYPE_PHYSICAL_DEVICE

VkPhysicalDevice

VK_OBJECT_TYPE_DEVICE

VkDevice

VK_OBJECT_TYPE_QUEUE

VkQueue

VK_OBJECT_TYPE_SEMAPHORE

VkSemaphore

VK_OBJECT_TYPE_COMMAND_BUFFER

VkCommandBuffer

VK_OBJECT_TYPE_FENCE

VkFence

VK_OBJECT_TYPE_DEVICE_MEMORY

VkDeviceMemory

VK_OBJECT_TYPE_BUFFER

VkBuffer

VK_OBJECT_TYPE_IMAGE

VkImage

VK_OBJECT_TYPE_EVENT

VkEvent

VK_OBJECT_TYPE_QUERY_POOL

VkQueryPool

VK_OBJECT_TYPE_BUFFER_VIEW

VkBufferView

VK_OBJECT_TYPE_IMAGE_VIEW

VkImageView

VK_OBJECT_TYPE_SHADER_MODULE

VkShaderModule

VK_OBJECT_TYPE_PIPELINE_CACHE

VkPipelineCache

VK_OBJECT_TYPE_PIPELINE_LAYOUT

VkPipelineLayout

VK_OBJECT_TYPE_RENDER_PASS

VkRenderPass

VK_OBJECT_TYPE_PIPELINE

VkPipeline

VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT

VkDescriptorSetLayout

VK_OBJECT_TYPE_SAMPLER

VkSampler

VK_OBJECT_TYPE_DESCRIPTOR_POOL

VkDescriptorPool

VK_OBJECT_TYPE_DESCRIPTOR_SET

VkDescriptorSet

VK_OBJECT_TYPE_FRAMEBUFFER

VkFramebuffer

VK_OBJECT_TYPE_COMMAND_POOL

VkCommandPool

VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION

VkSamplerYcbcrConversion

VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE

VkDescriptorUpdateTemplate

VK_OBJECT_TYPE_PRIVATE_DATA_SLOT

VkPrivateDataSlot

VK_OBJECT_TYPE_SURFACE_KHR

VkSurfaceKHR

VK_OBJECT_TYPE_SWAPCHAIN_KHR

VkSwapchainKHR

VK_OBJECT_TYPE_DISPLAY_KHR

VkDisplayKHR

VK_OBJECT_TYPE_DISPLAY_MODE_KHR

VkDisplayModeKHR

VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT

VkDebugReportCallbackEXT

VK_OBJECT_TYPE_VIDEO_SESSION_KHR

VkVideoSessionKHR

VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR

VkVideoSessionParametersKHR

VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT

VkDebugUtilsMessengerEXT

VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR

VkAccelerationStructureKHR

VK_OBJECT_TYPE_VALIDATION_CACHE_EXT

VkValidationCacheEXT

VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV

VkAccelerationStructureNV

VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL

VkPerformanceConfigurationINTEL

VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR

VkDeferredOperationKHR

VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV

VkIndirectCommandsLayoutNV

VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_EXT

VkIndirectCommandsLayoutEXT

VK_OBJECT_TYPE_INDIRECT_EXECUTION_SET_EXT

VkIndirectExecutionSetEXT

VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA

VkBufferCollectionFUCHSIA

VK_OBJECT_TYPE_MICROMAP_EXT

VkMicromapEXT

VK_OBJECT_TYPE_OPTICAL_FLOW_SESSION_NV

VkOpticalFlowSessionNV

VK_OBJECT_TYPE_SHADER_EXT

VkShaderEXT

如果本规范是在包含任何此类扩展的情况下生成的,它们将在本章的其余部分进行描述。

调试实用程序

Vulkan 提供了灵活的调试实用程序来调试应用程序。

对象调试注释部分描述了如何将名称或二进制数据与特定的 Vulkan 对象关联起来。

队列标签部分描述了如何注释和分组提交到队列的工作。

命令缓冲区标签部分描述了如何将场景的逻辑元素与 VkCommandBuffer 中的命令关联起来。

调试信使部分描述了如何创建与应用程序提供的回调关联的调试信使对象,以捕获来自各种 Vulkan 组件的调试消息。

对象调试注释

对于应用程序来说,提供其自己的内容相对于特定的 Vulkan 对象可能很有用。

以下命令允许应用程序开发人员将应用程序定义的信息与 Vulkan 对象关联。这些命令是设备级别的命令,但它们可能引用实例级别的对象(例如 VkInstance)和物理设备级别的对象(例如 VkPhysicalDevice),但有一些限制:* 对应对象的数据在销毁用于设置该数据的相应 API 调用中的 VkDevice 之后可能仍然可用,但不能保证可以访问此数据,应避免访问。* 在多个 VkDevice 对象之间多次调用以更改同一对象的数据,可能会导致所有 VkDevice 对象的数据更改为最新版本,而不仅仅是最近 API 调用中使用的 VkDevice

对象命名

可以通过调用以下函数为对象指定应用程序定义的名称

// Provided by VK_EXT_debug_utils
VkResult vkSetDebugUtilsObjectNameEXT(
    VkDevice                                    device,
    const VkDebugUtilsObjectNameInfoEXT*        pNameInfo);
  • device 是与通过 objectHandle 传递的命名对象关联的设备。

  • pNameInfo 是指向 VkDebugUtilsObjectNameInfoEXT 结构的指针,该结构指定要在对象上设置的名称的参数。

有效用法
  • VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-02587
    pNameInfo->objectType 不得VK_OBJECT_TYPE_UNKNOWN

  • VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-02588
    pNameInfo->objectHandle 不得VK_NULL_HANDLE

  • VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-07872
    如果 pNameInfo->objectHandle 是实例级别对象的有效句柄,则由 device 标识的 VkDevice 必须是与 pNameInfo->objectHandle 标识的对象相同的 VkInstance 的后代

  • VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-07873
    如果 pNameInfo->objectHandle 是物理设备级别对象的有效句柄,则由 device 标识的 VkDevice 必须是与 pNameInfo->objectHandle 标识的对象相同的 VkPhysicalDevice 的后代

  • VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-07874
    如果 pNameInfo->objectHandle 是设备级别对象的有效句柄,则该对象必须是由 device 标识的 VkDevice 的后代

有效用法(隐式)
  • VUID-vkSetDebugUtilsObjectNameEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkSetDebugUtilsObjectNameEXT-pNameInfo-parameter
    pNameInfo 必须是指向有效 VkDebugUtilsObjectNameInfoEXT 结构的有效指针

主机同步
  • pNameInfo->objectHandle 的主机访问必须是外部同步的

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkDebugUtilsObjectNameInfoEXT 结构定义如下

// Provided by VK_EXT_debug_utils
typedef struct VkDebugUtilsObjectNameInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    VkObjectType       objectType;
    uint64_t           objectHandle;
    const char*        pObjectName;
} VkDebugUtilsObjectNameInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • objectType 是一个 VkObjectType,用于指定要命名的对象的类型。

  • objectHandle 是要命名的对象。

  • pObjectNameNULL 或以 null 结尾的 UTF-8 字符串,用于指定要应用于 objectHandle 的名称。

应用程序可以通过再次调用 vkSetDebugUtilsObjectNameEXT 并使用新字符串来更改与对象关联的名称。如果 pObjectNameNULL 或空字符串,则会删除任何先前设置的名称。

graphicsPipelineLibrary 功能允许在不事先创建 VkShaderModule 对象的情况下指定管线。为了继续允许独立命名这些着色器,VkPipelineShaderStageCreateInfopNext 链中可以包含 VkDebugUtilsObjectNameInfoEXT,它将静态名称与该特定着色器相关联。

有效用法
  • VUID-VkDebugUtilsObjectNameInfoEXT-objectType-02589
    如果 objectTypeVK_OBJECT_TYPE_UNKNOWN,则 objectHandle 不得VK_NULL_HANDLE

  • VUID-VkDebugUtilsObjectNameInfoEXT-objectType-02590
    如果 objectType 不为 VK_OBJECT_TYPE_UNKNOWN,则 objectHandle 必须VK_NULL_HANDLE 或与 VkObjectType 和 Vulkan 句柄关系 表中定义的 objectType 关联的类型的有效 Vulkan 句柄

有效用法(隐式)
  • VUID-VkDebugUtilsObjectNameInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT

  • VUID-VkDebugUtilsObjectNameInfoEXT-objectType-parameter
    objectType 必须是有效的 VkObjectType

  • VUID-VkDebugUtilsObjectNameInfoEXT-pObjectName-parameter
    如果 pObjectName 不为 NULL,则 pObjectName 必须是以 null 结尾的 UTF-8 字符串

对象数据关联

除了为对象设置名称之外,调试和验证层可能还会使用每个对象的其他二进制数据,这些数据在 Vulkan API 中没有其他位置。

例如,VkShaderModule 可以附加额外的调试数据,以帮助进行脱机着色器跟踪。

可以通过调用如下定义的 vkSetDebugUtilsObjectTagEXT 将其他数据附加到对象。

// Provided by VK_EXT_debug_utils
VkResult vkSetDebugUtilsObjectTagEXT(
    VkDevice                                    device,
    const VkDebugUtilsObjectTagInfoEXT*         pTagInfo);
  • device 是创建该对象的设备。

  • pTagInfo 是指向 VkDebugUtilsObjectTagInfoEXT 结构的指针,该结构指定要附加到对象的标签的参数。

有效用法
  • VUID-vkSetDebugUtilsObjectTagEXT-pNameInfo-07875
    如果 pNameInfo->objectHandle 是实例级别对象的有效句柄,则由 device 标识的 VkDevice 必须是与 pNameInfo->objectHandle 标识的对象相同的 VkInstance 的后代

  • VUID-vkSetDebugUtilsObjectTagEXT-pNameInfo-07876
    如果 pNameInfo->objectHandle 是物理设备级别对象的有效句柄,则由 device 标识的 VkDevice 必须是与 pNameInfo->objectHandle 标识的对象相同的 VkPhysicalDevice 的后代

  • VUID-vkSetDebugUtilsObjectTagEXT-pNameInfo-07877
    如果 pNameInfo->objectHandle 是设备级别对象的有效句柄,则该对象必须是由 device 标识的 VkDevice 的后代

有效用法(隐式)
  • VUID-vkSetDebugUtilsObjectTagEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkSetDebugUtilsObjectTagEXT-pTagInfo-parameter
    pTagInfo 必须 是指向有效 VkDebugUtilsObjectTagInfoEXT 结构的有效指针

主机同步
  • pTagInfo->objectHandle 的主机访问必须进行外部同步

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkDebugUtilsObjectTagInfoEXT 结构的定义如下:

// Provided by VK_EXT_debug_utils
typedef struct VkDebugUtilsObjectTagInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    VkObjectType       objectType;
    uint64_t           objectHandle;
    uint64_t           tagName;
    size_t             tagSize;
    const void*        pTag;
} VkDebugUtilsObjectTagInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • objectType 是一个 VkObjectType,用于指定要命名的对象的类型。

  • objectHandle 是要标记的对象。

  • tagName 是标签的数字标识符。

  • tagSize 是附加到对象的字节数据数。

  • pTag 是指向包含要与对象关联的数据的 tagSize 字节数组的指针。

tagName 参数为要标记的数据类型提供名称或标识符。调试层可以使用它来轻松过滤出仅可由该实现使用的数据。

有效用法
  • VUID-VkDebugUtilsObjectTagInfoEXT-objectType-01908
    objectType 必须 不是 VK_OBJECT_TYPE_UNKNOWN

  • VUID-VkDebugUtilsObjectTagInfoEXT-objectHandle-01910
    objectHandle 必须 是与 VkObjectType 和 Vulkan 句柄关系表中定义的 objectType 相关联的类型的有效 Vulkan 句柄

有效用法(隐式)
  • VUID-VkDebugUtilsObjectTagInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT

  • VUID-VkDebugUtilsObjectTagInfoEXT-pNext-pNext
    pNext 必须NULL

  • VUID-VkDebugUtilsObjectTagInfoEXT-objectType-parameter
    objectType 必须是有效的 VkObjectType

  • VUID-VkDebugUtilsObjectTagInfoEXT-pTag-parameter
    pTag 必须 是指向 tagSize 字节数组的有效指针

  • VUID-VkDebugUtilsObjectTagInfoEXT-tagSize-arraylength
    tagSize 必须 大于 0

队列标签

所有 Vulkan 工作都使用队列提交。应用程序可以在执行工作时使用多个队列,每个队列包含多个命令缓冲区。识别发生事情的队列,甚至是队列中的位置可能很有用。

要开始在队列内使用调试标签识别区域,可以使用 vkQueueBeginDebugUtilsLabelEXT 命令。

然后,当感兴趣的区域通过后,可以使用 vkQueueEndDebugUtilsLabelEXT 结束标签区域。

此外,可以使用 vkQueueInsertDebugUtilsLabelEXT 随时插入单个调试标签。

通过调用以下命令打开队列调试标签区域:

// Provided by VK_EXT_debug_utils
void vkQueueBeginDebugUtilsLabelEXT(
    VkQueue                                     queue,
    const VkDebugUtilsLabelEXT*                 pLabelInfo);
  • queue 是在其中启动调试标签区域的队列。

  • pLabelInfo 是指向 VkDebugUtilsLabelEXT 结构的指针,该结构指定要打开的标签区域的参数。

有效用法(隐式)
  • VUID-vkQueueBeginDebugUtilsLabelEXT-queue-parameter
    queue 必须 是有效的 VkQueue 句柄

  • VUID-vkQueueBeginDebugUtilsLabelEXT-pLabelInfo-parameter
    pLabelInfo 必须 是指向有效 VkDebugUtilsLabelEXT 结构的有效指针

VkDebugUtilsLabelEXT 结构的定义如下:

// Provided by VK_EXT_debug_utils
typedef struct VkDebugUtilsLabelEXT {
    VkStructureType    sType;
    const void*        pNext;
    const char*        pLabelName;
    float              color[4];
} VkDebugUtilsLabelEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pLabelName 是指向包含标签名称的空终止 UTF-8 字符串的指针。

  • color 是一个可选的 RGBA 颜色值,可以与标签关联。特定的实现可以选择忽略此颜色值。这些值按顺序包含 0.0 到 1.0 范围内的 RGBA 值。如果 color 中的所有元素均为 0.0,则将其忽略。

有效用法(隐式)
  • VUID-VkDebugUtilsLabelEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT

  • VUID-VkDebugUtilsLabelEXT-pNext-pNext
    pNext 必须NULL

  • VUID-VkDebugUtilsLabelEXT-pLabelName-parameter
    pLabelName 必须 是空终止的 UTF-8 字符串

通过调用以下命令关闭队列调试标签区域:

// Provided by VK_EXT_debug_utils
void vkQueueEndDebugUtilsLabelEXT(
    VkQueue                                     queue);
  • queue 是应该关闭调试标签区域的队列。

vkQueueBeginDebugUtilsLabelEXTvkQueueEndDebugUtilsLabelEXT 的调用必须匹配并平衡。

有效用法
  • VUID-vkQueueEndDebugUtilsLabelEXT-None-01911
    在队列中执行 vkQueueEndDebugUtilsLabelEXT 之前,必须有一个未完成的 vkQueueBeginDebugUtilsLabelEXT 命令

有效用法(隐式)
  • VUID-vkQueueEndDebugUtilsLabelEXT-queue-parameter
    queue 必须 是有效的 VkQueue 句柄

通过调用以下命令可以将单个标签插入队列中:

// Provided by VK_EXT_debug_utils
void vkQueueInsertDebugUtilsLabelEXT(
    VkQueue                                     queue,
    const VkDebugUtilsLabelEXT*                 pLabelInfo);
  • queue 是将插入调试标签的队列。

  • pLabelInfo 是指向 VkDebugUtilsLabelEXT 结构的指针,该结构指定要插入的标签的参数。

有效用法(隐式)
  • VUID-vkQueueInsertDebugUtilsLabelEXT-queue-parameter
    queue 必须 是有效的 VkQueue 句柄

  • VUID-vkQueueInsertDebugUtilsLabelEXT-pLabelInfo-parameter
    pLabelInfo 必须 是指向有效 VkDebugUtilsLabelEXT 结构的有效指针

命令缓冲区标签

典型的 Vulkan 应用程序将在每一帧中提交许多命令缓冲区,每个命令缓冲区包含大量单独的命令。能够以逻辑方式注释属于一起的命令缓冲区区域以及按层次结构细分帧对于开发人员整体查看命令的能力非常重要。

要标识命令缓冲区中调试标签区域的开始,可以使用如下定义的 vkCmdBeginDebugUtilsLabelEXT

要指示命令缓冲区中调试标签区域的结束,可以使用 vkCmdEndDebugUtilsLabelEXT

要在命令缓冲区内插入单个命令缓冲区调试标签,可以使用如下定义的 vkCmdInsertDebugUtilsLabelEXT

可以通过调用以下命令打开命令缓冲区调试标签区域:

// Provided by VK_EXT_debug_utils
void vkCmdBeginDebugUtilsLabelEXT(
    VkCommandBuffer                             commandBuffer,
    const VkDebugUtilsLabelEXT*                 pLabelInfo);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • pLabelInfo 是指向 VkDebugUtilsLabelEXT 结构的指针,该结构指定要打开的标签区域的参数。

有效用法(隐式)
  • VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdBeginDebugUtilsLabelEXT-pLabelInfo-parameter
    pLabelInfo 必须 是指向有效 VkDebugUtilsLabelEXT 结构的有效指针

  • VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdBeginDebugUtilsLabelEXT-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形或计算操作

  • VUID-vkCmdBeginDebugUtilsLabelEXT-videocoding
    此命令必须仅在视频编码范围之外调用

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型


两者

外部

图形
计算

动作
状态

可以通过调用来关闭命令缓冲区标签区域

// Provided by VK_EXT_debug_utils
void vkCmdEndDebugUtilsLabelEXT(
    VkCommandBuffer                             commandBuffer);
  • commandBuffer 是将命令记录到的命令缓冲区。

应用程序可以在一个命令缓冲区中打开调试标签区域,并在另一个命令缓冲区中关闭它,或者以其他方式将调试标签区域分割到多个命令缓冲区或多个队列提交中。从提交到单个队列的线性序列来看,对 vkCmdBeginDebugUtilsLabelEXTvkCmdEndDebugUtilsLabelEXT 的调用必须匹配和平衡。

在记录过程中报告命令缓冲区调试标签可能存在问题,因为命令缓冲区的记录顺序可能与最终的执行顺序不一致。由于记录顺序可能不同,单独的命令缓冲区本身可能对调试标签区域的视图不一致。因此,如果在记录命令缓冲区时发生问题,并且环境需要返回调试标签,则实现可能只返回它知道的标签。即使实现仅知道正在积极记录的命令缓冲区内的调试标签,也是如此。

有效用法
  • VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01912
    commandBuffer 提交到的队列上,vkCmdEndDebugUtilsLabelEXT 之前必须有一个未完成的 vkCmdBeginDebugUtilsLabelEXT 命令

  • VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-01913
    如果 commandBuffer 是辅助命令缓冲区,则在 commandBuffer 中记录的、之前未通过调用 vkCmdEndDebugUtilsLabelEXT 结束的必须有一个未完成的 vkCmdBeginDebugUtilsLabelEXT 命令

有效用法(隐式)
  • VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdEndDebugUtilsLabelEXT-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形或计算操作

  • VUID-vkCmdEndDebugUtilsLabelEXT-videocoding
    此命令必须仅在视频编码范围之外调用

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型


两者

外部

图形
计算

动作
状态

可以通过调用将单个调试标签插入到命令缓冲区中

// Provided by VK_EXT_debug_utils
void vkCmdInsertDebugUtilsLabelEXT(
    VkCommandBuffer                             commandBuffer,
    const VkDebugUtilsLabelEXT*                 pLabelInfo);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • pInfo 是指向 VkDebugUtilsLabelEXT 结构的指针,该结构指定要插入的标签的参数。

有效用法(隐式)
  • VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdInsertDebugUtilsLabelEXT-pLabelInfo-parameter
    pLabelInfo 必须 是指向有效 VkDebugUtilsLabelEXT 结构的有效指针

  • VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdInsertDebugUtilsLabelEXT-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形或计算操作

  • VUID-vkCmdInsertDebugUtilsLabelEXT-videocoding
    此命令必须仅在视频编码范围之外调用

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型


两者

外部

图形
计算

动作

调试消息器

Vulkan 允许应用程序向任何希望报告调试信息的 Vulkan 组件注册多个回调。某些回调可能会将信息记录到文件中,而其他回调可能会导致调试断点或其他应用程序定义的行为。回调消息的主要生产者是验证层。即使未启用任何验证层,应用程序可以注册回调,但它们只会为 Vulkan 加载器以及(如果已实现)其他层和驱动程序事件调用。

VkDebugUtilsMessengerEXT 是一个消息器对象,它处理将调试消息传递给提供的调试回调。

// Provided by VK_EXT_debug_utils
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugUtilsMessengerEXT)

当发生感兴趣的事件时,调试消息器将提供有关应用程序使用 Vulkan 的详细反馈。当发生感兴趣的事件时,调试消息器会将调试消息提交给在创建期间提供的调试回调。此外,调试消息器还负责过滤掉回调不感兴趣的调试消息,并且只提供所需的调试消息。

当发生感兴趣的事件时,调试消息器会使用调试消息触发调试回调。要创建将触发调试回调的调试消息器,请调用

// Provided by VK_EXT_debug_utils
VkResult vkCreateDebugUtilsMessengerEXT(
    VkInstance                                  instance,
    const VkDebugUtilsMessengerCreateInfoEXT*   pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkDebugUtilsMessengerEXT*                   pMessenger);
  • instance 是将使用消息器的实例。

  • pCreateInfo 是指向 VkDebugUtilsMessengerCreateInfoEXT 结构的指针,其中包含回调指针,以及定义此消息器将触发回调的条件。

  • pAllocator 控制主机内存分配,如内存分配章节中所述。

  • pMessenger 是指向 VkDebugUtilsMessengerEXT 句柄的指针,其中返回创建的对象。

有效用法(隐式)
  • VUID-vkCreateDebugUtilsMessengerEXT-instance-parameter
    instance 必须 是一个有效的 VkInstance 句柄

  • VUID-vkCreateDebugUtilsMessengerEXT-pCreateInfo-parameter
    pCreateInfo 必须 是指向有效 VkDebugUtilsMessengerCreateInfoEXT 结构的有效指针

  • VUID-vkCreateDebugUtilsMessengerEXT-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须 是指向有效的 VkAllocationCallbacks 结构的有效指针。

  • VUID-vkCreateDebugUtilsMessengerEXT-pMessenger-parameter
    pMessenger 必须 是指向 VkDebugUtilsMessengerEXT 句柄的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

应用程序必须确保 vkCreateDebugUtilsMessengerEXT 的执行不会与任何使用 instanceinstance 的子项作为可调度参数的 Vulkan 命令并行执行。

VkDebugUtilsMessengerCreateInfoEXT 的定义如下:

// Provided by VK_EXT_debug_utils
typedef struct VkDebugUtilsMessengerCreateInfoEXT {
    VkStructureType                         sType;
    const void*                             pNext;
    VkDebugUtilsMessengerCreateFlagsEXT     flags;
    VkDebugUtilsMessageSeverityFlagsEXT     messageSeverity;
    VkDebugUtilsMessageTypeFlagsEXT         messageType;
    PFN_vkDebugUtilsMessengerCallbackEXT    pfnUserCallback;
    void*                                   pUserData;
} VkDebugUtilsMessengerCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags0,保留供将来使用。

  • messageSeverity 是一个 VkDebugUtilsMessageSeverityFlagBitsEXT 的位掩码,指定哪些严重级别的事件将导致调用此回调。

  • messageType 是一个 VkDebugUtilsMessageTypeFlagBitsEXT 的位掩码,指定哪些类型的事件将导致调用此回调。

  • pfnUserCallback 是要调用的应用程序回调函数。

  • pUserData 是要传递给回调的用户数据。

对于创建的每个 VkDebugUtilsMessengerEXTVkDebugUtilsMessengerCreateInfoEXT::messageSeverityVkDebugUtilsMessengerCreateInfoEXT::messageType 确定何时调用该 VkDebugUtilsMessengerCreateInfoEXT::pfnUserCallback。确定在发生事件时是否触发用户的 pfnUserCallback 的过程如下:

  1. 实现将事件的 VkDebugUtilsMessageSeverityFlagBitsEXT 与创建 VkDebugUtilsMessengerEXT 对象期间提供的 messageSeverity 执行按位与运算。

    1. 如果值为 0,则跳过消息。

  2. 实现将事件的 VkDebugUtilsMessageTypeFlagBitsEXT 与创建 VkDebugUtilsMessengerEXT 对象期间提供的 messageType 执行按位与运算。

    1. 如果值为 0,则跳过消息。

  3. 回调将触发当前事件的调试消息。

回调将直接来自检测到事件的组件,除非其他层为了自己的目的(以不同的方式过滤它们、记录到系统错误日志等)拦截调用。

如果创建了多个 VkDebugUtilsMessengerEXT 对象,应用程序可以接收多个回调。回调始终在与原始 Vulkan 调用相同的线程中执行。

回调可以从多个线程同时调用(如果应用程序正在从多个线程进行 Vulkan 调用)。

有效用法(隐式)
  • VUID-VkDebugUtilsMessengerCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT

  • VUID-VkDebugUtilsMessengerCreateInfoEXT-flags-zerobitmask
    flags 必须0

  • VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-parameter
    messageSeverity 必须VkDebugUtilsMessageSeverityFlagBitsEXT 值的有效组合。

  • VUID-VkDebugUtilsMessengerCreateInfoEXT-messageSeverity-requiredbitmask
    messageSeverity 不能0

  • VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-parameter
    messageType 必须VkDebugUtilsMessageTypeFlagBitsEXT 值的有效组合。

  • VUID-VkDebugUtilsMessengerCreateInfoEXT-messageType-requiredbitmask
    messageType 不能0

  • VUID-VkDebugUtilsMessengerCreateInfoEXT-pfnUserCallback-parameter
    pfnUserCallback 必须是有效的 PFN_vkDebugUtilsMessengerCallbackEXT 值。

// Provided by VK_EXT_debug_utils
typedef VkFlags VkDebugUtilsMessengerCreateFlagsEXT;

VkDebugUtilsMessengerCreateFlagsEXT 是一种用于设置掩码的位掩码类型,但目前保留供将来使用。

可以在 VkDebugUtilsMessengerCreateInfoEXT::messageSeverity 中设置的位,指定导致调试消息传递器调用回调的事件严重性,如下所示:

// Provided by VK_EXT_debug_utils
typedef enum VkDebugUtilsMessageSeverityFlagBitsEXT {
    VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT = 0x00000001,
    VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT = 0x00000010,
    VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT = 0x00000100,
    VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT = 0x00001000,
} VkDebugUtilsMessageSeverityFlagBitsEXT;
  • VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT 指定最详细的输出,指示应捕获来自 Vulkan 加载器、层和驱动程序的所有诊断消息。

  • VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT 指定信息性消息,例如在调试应用程序时可能方便的资源详细信息。

  • VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT 指定对 Vulkan 的使用可能暴露应用程序错误。这种情况可能不会立即有害,例如片段着色器输出到没有附件的位置。其他情况可能指向当非预期时几乎肯定是不良的行为,例如使用尚未填充内存的图像。一般来说,如果您看到警告但您知道该行为是预期/期望的,那么只需忽略该警告即可。

  • VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT 指定应用程序违反了规范的有效使用条件。

VkDebugUtilsMessageSeverityFlagBitsEXT 的值基于严重性排序。标志值越高,消息越严重。这允许在查看 VkDebugUtilsMessageSeverityFlagBitsEXT 值时进行简单的布尔运算比较。

例如:

    if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
        // Do something for warnings and errors
    }

此外,枚举之间留有空间,以便以后在现有值之间添加新的严重性。

// Provided by VK_EXT_debug_utils
typedef VkFlags VkDebugUtilsMessageSeverityFlagsEXT;

VkDebugUtilsMessageSeverityFlagsEXT 是一种用于设置零个或多个 VkDebugUtilsMessageSeverityFlagBitsEXT 掩码的位掩码类型。

可以在 VkDebugUtilsMessengerCreateInfoEXT::messageType 中设置的位,指定导致调试消息传递器调用回调的事件类型,如下所示:

// Provided by VK_EXT_debug_utils
typedef enum VkDebugUtilsMessageTypeFlagBitsEXT {
    VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT = 0x00000001,
    VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT = 0x00000002,
    VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT = 0x00000004,
  // Provided by VK_EXT_device_address_binding_report
    VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT = 0x00000008,
} VkDebugUtilsMessageTypeFlagBitsEXT;
  • VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT 指定发生了一些常规事件。这通常是一个非规范、非性能事件。

  • VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT 指定在针对 Vulkan 规范进行验证期间发生了一些事情,这可能表明行为无效。

  • VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT 指定潜在的非最佳 Vulkan 使用,例如当将 VkAttachmentDescription::loadOp 设置为 VK_ATTACHMENT_LOAD_OP_CLEAR 时,使用 vkCmdClearColorImage 也可以工作。

  • VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT 指定实现已修改与 Vulkan 对象关联的 GPU 可见虚拟地址集。

// Provided by VK_EXT_debug_utils
typedef VkFlags VkDebugUtilsMessageTypeFlagsEXT;

VkDebugUtilsMessageTypeFlagsEXT 是一个位掩码类型,用于设置零个或多个 VkDebugUtilsMessageTypeFlagBitsEXT 的掩码。

应用程序实现的 VkDebugUtilsMessengerCreateInfoEXT::pfnUserCallback 函数的原型是

// Provided by VK_EXT_debug_utils
typedef VkBool32 (VKAPI_PTR *PFN_vkDebugUtilsMessengerCallbackEXT)(
    VkDebugUtilsMessageSeverityFlagBitsEXT           messageSeverity,
    VkDebugUtilsMessageTypeFlagsEXT                  messageTypes,
    const VkDebugUtilsMessengerCallbackDataEXT*      pCallbackData,
    void*                                            pUserData);

回调返回一个 VkBool32,其解释方式由层指定。应用程序应该始终返回 VK_FALSEVK_TRUE 值保留用于层开发。

有效用法
  • VUID-PFN_vkDebugUtilsMessengerCallbackEXT-None-04769
    回调必须不调用任何 Vulkan 命令

VkDebugUtilsMessengerCallbackDataEXT 的定义如下:

// Provided by VK_EXT_debug_utils
typedef struct VkDebugUtilsMessengerCallbackDataEXT {
    VkStructureType                              sType;
    const void*                                  pNext;
    VkDebugUtilsMessengerCallbackDataFlagsEXT    flags;
    const char*                                  pMessageIdName;
    int32_t                                      messageIdNumber;
    const char*                                  pMessage;
    uint32_t                                     queueLabelCount;
    const VkDebugUtilsLabelEXT*                  pQueueLabels;
    uint32_t                                     cmdBufLabelCount;
    const VkDebugUtilsLabelEXT*                  pCmdBufLabels;
    uint32_t                                     objectCount;
    const VkDebugUtilsObjectNameInfoEXT*         pObjects;
} VkDebugUtilsMessengerCallbackDataEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags0,保留供将来使用。

  • pMessageIdNameNULL 或以 null 结尾的 UTF-8 字符串,用于标识与提供的消息关联的特定消息 ID。如果消息对应于验证层消息,则此字符串可能包含被认为违反的 Vulkan 规范部分。

  • messageIdNumber 是触发消息的 ID 号。如果消息对应于验证层消息,则此数字与正在触发的消息的内部编号相关。

  • 如果 messageTypes 等于 VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT,则 pMessageNULL,或者为以 null 结尾的 UTF-8 字符串,详细说明触发条件。

  • queueLabelCountpQueueLabels 数组中包含的项目计数。

  • pQueueLabelsNULL 或指向 VkDebugUtilsLabelEXT 数组的指针,这些标签在回调触发时在当前 VkQueue 中处于活动状态。有关更多信息,请参阅 队列标签

  • cmdBufLabelCountpCmdBufLabels 数组中包含的项目计数。

  • pCmdBufLabelsNULL 或指向 VkDebugUtilsLabelEXT 数组的指针,这些标签在回调触发时在当前 VkCommandBuffer 中处于活动状态。有关更多信息,请参阅 命令缓冲区标签

  • objectCountpObjects 数组中包含的项目计数。

  • pObjects 是指向与检测到的问题相关的 VkDebugUtilsObjectNameInfoEXT 对象数组的指针。该数组大致按重要性排序,但保证第 0 个元素始终是此消息的最重要对象。

此结构应仅在触发的回调的生命周期内被视为有效。

由于添加队列和命令缓冲区标签的行为类似于推入和弹出堆栈,因此 pQueueLabelspCmdBufLabels 的顺序均基于标签定义的顺序。结果是,pQueueLabelspCmdBufLabels 中的第一个标签将是第一个定义的(因此是最旧的),而每个列表中的最后一个标签将是最近的。

只有当 pObjects 中的一个对象可以直接与已关联一个或多个标签的已定义 VkQueue 相关联时,pQueueLabels 才不会为 NULL

同样,只有当 pObjects 中的一个对象可以直接与已关联一个或多个标签的已定义 VkCommandBuffer 相关联时,pCmdBufLabels 才不会为 NULL。此外,虽然命令缓冲区标签允许跨不同命令缓冲区开始和结束,但调试消息框架不能保证 pCmdBufLables 中的标签将包含在关联的命令缓冲区之外定义的标签。这部分是由于在触发调试消息时可能未定义一个命令缓冲区与另一个命令缓冲区之间的关联。

有效用法(隐式)
  • VUID-VkDebugUtilsMessengerCallbackDataEXT-sType-sType
    sType必须VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT

  • VUID-VkDebugUtilsMessengerCallbackDataEXT-pNext-pNext
    pNext必须NULL 或指向 VkDeviceAddressBindingCallbackDataEXT 的有效实例的指针

  • VUID-VkDebugUtilsMessengerCallbackDataEXT-sType-unique
    pNext 链中每个结构的 sType必须是唯一的

  • VUID-VkDebugUtilsMessengerCallbackDataEXT-flags-zerobitmask
    flags 必须0

  • VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessageIdName-parameter
    如果 pMessageIdName 不为 NULL,则 pMessageIdName必须是以 null 结尾的 UTF-8 字符串

  • VUID-VkDebugUtilsMessengerCallbackDataEXT-pMessage-parameter
    如果 pMessage 不为 NULL,则 pMessage必须是以 null 结尾的 UTF-8 字符串

  • VUID-VkDebugUtilsMessengerCallbackDataEXT-pQueueLabels-parameter
    如果 queueLabelCount 不为 0,则 pQueueLabels必须是指向 queueLabelCount 个有效 VkDebugUtilsLabelEXT 结构的数组的有效指针

  • VUID-VkDebugUtilsMessengerCallbackDataEXT-pCmdBufLabels-parameter
    如果 cmdBufLabelCount 不为 0,则 pCmdBufLabels必须是指向 cmdBufLabelCount 个有效 VkDebugUtilsLabelEXT 结构的数组的有效指针

  • VUID-VkDebugUtilsMessengerCallbackDataEXT-pObjects-parameter
    如果 objectCount 不为 0,则 pObjects必须是指向 objectCount 个有效 VkDebugUtilsObjectNameInfoEXT 结构的数组的有效指针

// Provided by VK_EXT_debug_utils
typedef VkFlags VkDebugUtilsMessengerCallbackDataFlagsEXT;

VkDebugUtilsMessengerCallbackDataFlagsEXT 是一个用于设置掩码的位掩码类型,但目前保留供将来使用。

VkDeviceAddressBindingCallbackDataEXT 的定义如下:

// Provided by VK_EXT_device_address_binding_report
typedef struct VkDeviceAddressBindingCallbackDataEXT {
    VkStructureType                   sType;
    void*                             pNext;
    VkDeviceAddressBindingFlagsEXT    flags;
    VkDeviceAddress                   baseAddress;
    VkDeviceSize                      size;
    VkDeviceAddressBindingTypeEXT     bindingType;
} VkDeviceAddressBindingCallbackDataEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkDeviceAddressBindingFlagBitsEXT 的位掩码,用于指定有关导致调用回调的绑定事件的其他信息。

  • baseAddress 是一个 GPU 可访问的虚拟地址,用于标识与 Vulkan 对象关联的虚拟地址空间的区域的起始位置,如 VkDebugUtilsMessengerCallbackDataEXTpObjects 成员所标识。

  • size 是 GPU 可访问虚拟地址空间区域的大小(以字节为单位)。

  • bindingType 是一个 VkDeviceAddressBindingTypeEXT,用于指定导致回调被调用的绑定事件类型。

如果启用了 reportAddressBinding 功能,并且实现绑定或解绑了与 Vulkan 对象关联的虚拟地址空间区域,则实现必须提交具有以下属性的调试消息

  • messageSeverity 等于 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT

  • messageTypes 等于 VK_DEBUG_UTILS_MESSAGE_TYPE_DEVICE_ADDRESS_BINDING_BIT_EXT

  • VkDebugUtilsMessengerCallbackDataEXT::pObjects 必须标识关联的 Vulkan 对象

  • VkDeviceAddressBindingCallbackDataEXT 必须包含在 VkDebugUtilsMessengerCallbackDataEXTpNext 链中

这些调试消息必须为通过 vkBind*Memory/vkBind*Memory2 函数显式绑定到 Vulkan 对象的 GPU 虚拟地址空间区域,以及通过内存分配或导入外部内存隐式生成的区域发出。

实现可以在对象通过其他 Vulkan 命令对应用程序可见之前,通过 VkDebugUtilsMessengerEXT 报告与 Vulkan 对象关联的绑定事件。例如,对象创建函数可以报告在对象创建期间发生的绑定事件。在这种情况下,VkDeviceAddressBindingCallbackDataEXT::flags 必须包含 VK_DEVICE_ADDRESS_BINDING_INTERNAL_OBJECT_BIT_EXT

以这种方式报告的对象句柄不是有效的对象句柄必须不作为任何 Vulkan 命令的输入参数使用。

对象创建函数返回的任何有效对象句柄必须与之前报告的与对象创建关联的任何绑定事件中指定的句柄匹配。

有效用法(隐式)
  • VUID-VkDeviceAddressBindingCallbackDataEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT

  • VUID-VkDeviceAddressBindingCallbackDataEXT-flags-parameter
    flags 必须VkDeviceAddressBindingFlagBitsEXT 值的有效组合

  • VUID-VkDeviceAddressBindingCallbackDataEXT-bindingType-parameter
    bindingType 必须是一个有效的 VkDeviceAddressBindingTypeEXT

VkDeviceAddressBindingCallbackDataEXT::flags 中可以设置的位,用于指定关于绑定事件的附加信息,有:

// Provided by VK_EXT_device_address_binding_report
typedef enum VkDeviceAddressBindingFlagBitsEXT {
    VK_DEVICE_ADDRESS_BINDING_INTERNAL_OBJECT_BIT_EXT = 0x00000001,
} VkDeviceAddressBindingFlagBitsEXT;
// Provided by VK_EXT_device_address_binding_report
typedef VkFlags VkDeviceAddressBindingFlagsEXT;

VkDeviceAddressBindingFlagsEXT 是一个位掩码类型,用于设置零个或多个 VkDeviceAddressBindingFlagBitsEXT 的掩码。

VkDeviceAddressBindingTypeEXT 枚举定义如下:

// Provided by VK_EXT_device_address_binding_report
typedef enum VkDeviceAddressBindingTypeEXT {
    VK_DEVICE_ADDRESS_BINDING_TYPE_BIND_EXT = 0,
    VK_DEVICE_ADDRESS_BINDING_TYPE_UNBIND_EXT = 1,
} VkDeviceAddressBindingTypeEXT;
  • VK_DEVICE_ADDRESS_BINDING_TYPE_BIND_EXT 指定已绑定新的 GPU 可访问的虚拟地址范围。

  • VK_DEVICE_ADDRESS_BINDING_TYPE_UNBIND_EXT 指定已解绑 GPU 可访问的虚拟地址范围。

要有意提交调试消息,请调用

// Provided by VK_EXT_debug_utils
void vkSubmitDebugUtilsMessageEXT(
    VkInstance                                  instance,
    VkDebugUtilsMessageSeverityFlagBitsEXT      messageSeverity,
    VkDebugUtilsMessageTypeFlagsEXT             messageTypes,
    const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData);

调用将通过层传播,并根据消息的标志生成回调。除了注册 messenger 时定义的 pUserData 值之外,参数还会传递给回调。

有效用法
  • VUID-vkSubmitDebugUtilsMessageEXT-objectType-02591
    pCallbackData->pObjects 的每个元素的 objectType 成员必须不能是 VK_OBJECT_TYPE_UNKNOWN

有效用法(隐式)
  • VUID-vkSubmitDebugUtilsMessageEXT-instance-parameter
    instance 必须 是一个有效的 VkInstance 句柄

  • VUID-vkSubmitDebugUtilsMessageEXT-messageSeverity-parameter
    messageSeverity 必须是一个有效的 VkDebugUtilsMessageSeverityFlagBitsEXT

  • VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-parameter
    messageTypes 必须VkDebugUtilsMessageTypeFlagBitsEXT 值的有效组合

  • VUID-vkSubmitDebugUtilsMessageEXT-messageTypes-requiredbitmask
    messageTypes 必须不能为 0

  • VUID-vkSubmitDebugUtilsMessageEXT-pCallbackData-parameter
    pCallbackData 必须是指向有效 VkDebugUtilsMessengerCallbackDataEXT 结构的有效指针

要销毁 VkDebugUtilsMessengerEXT 对象,请调用

// Provided by VK_EXT_debug_utils
void vkDestroyDebugUtilsMessengerEXT(
    VkInstance                                  instance,
    VkDebugUtilsMessengerEXT                    messenger,
    const VkAllocationCallbacks*                pAllocator);
  • instance 是创建回调的实例。

  • messenger 是要销毁的 VkDebugUtilsMessengerEXT 对象。 messenger 是一个外部同步的对象,必须不能在同一时间在多个线程上使用。这意味着在回调处于活动状态时必须不调用 vkDestroyDebugUtilsMessengerEXT

  • pAllocator 控制主机内存分配,如内存分配章节中所述。

有效用法
  • VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01915
    如果在创建 messenger 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调

  • VUID-vkDestroyDebugUtilsMessengerEXT-messenger-01916
    如果在创建 messenger 时没有提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroyDebugUtilsMessengerEXT-instance-parameter
    instance 必须 是一个有效的 VkInstance 句柄

  • VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parameter
    如果 messenger 不是 VK_NULL_HANDLE,则 messenger 必须是一个有效的 VkDebugUtilsMessengerEXT 句柄

  • VUID-vkDestroyDebugUtilsMessengerEXT-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须 是指向有效的 VkAllocationCallbacks 结构的有效指针。

  • VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent
    如果 messenger 是一个有效的句柄,它必须是从 instance 创建、分配或检索的

主机同步
  • messenger 的主机访问必须进行外部同步

应用程序必须确保 vkDestroyDebugUtilsMessengerEXT 不会与也以 instanceinstance 的子对象作为可调度参数调用的任何 Vulkan 命令并行执行。

调试标记

调试标记提供了一种灵活的方式,使调试和验证层能够接收注释和调试信息。

对象注释 部分描述了如何将名称或二进制数据与 Vulkan 对象关联。

命令缓冲区标记 部分描述了如何将场景的逻辑元素与命令缓冲区中的命令关联。

对象注解

本节中的命令允许应用程序开发人员随意将应用程序定义的信息与 Vulkan 对象相关联。

可以通过调用以下函数为对象指定应用程序定义的名称

// Provided by VK_EXT_debug_marker
VkResult vkDebugMarkerSetObjectNameEXT(
    VkDevice                                    device,
    const VkDebugMarkerObjectNameInfoEXT*       pNameInfo);
  • device 是创建该对象的设备。

  • pNameInfo 是指向 VkDebugMarkerObjectNameInfoEXT 结构的指针,该结构指定要在对象上设置的名称的参数。

有效用法(隐式)
  • VUID-vkDebugMarkerSetObjectNameEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkDebugMarkerSetObjectNameEXT-pNameInfo-parameter
    pNameInfo 必须是指向有效 VkDebugMarkerObjectNameInfoEXT 结构的有效指针

主机同步
  • pNameInfo->object 的主机访问必须是外部同步的

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkDebugMarkerObjectNameInfoEXT 结构的定义如下

// Provided by VK_EXT_debug_marker
typedef struct VkDebugMarkerObjectNameInfoEXT {
    VkStructureType               sType;
    const void*                   pNext;
    VkDebugReportObjectTypeEXT    objectType;
    uint64_t                      object;
    const char*                   pObjectName;
} VkDebugMarkerObjectNameInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • objectType 是一个 VkDebugReportObjectTypeEXT,指定要命名的对象的类型。

  • object 是要命名的对象。

  • pObjectName 是一个以 null 结尾的 UTF-8 字符串,指定要应用于 object 的名称。

应用程序可以通过再次调用 vkDebugMarkerSetObjectNameEXT 并使用新字符串来更改与对象关联的名称。要删除先前设置的名称,pObjectName 应该是一个空字符串。

有效用法
  • VUID-VkDebugMarkerObjectNameInfoEXT-objectType-01490
    objectType 不能VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT

  • VUID-VkDebugMarkerObjectNameInfoEXT-object-01491
    object 不能VK_NULL_HANDLE

  • VUID-VkDebugMarkerObjectNameInfoEXT-object-01492
    object 必须是与 objectType 关联类型的 Vulkan 对象,如 VkDebugReportObjectTypeEXT 和 Vulkan 句柄关系 中所定义

有效用法(隐式)
  • VUID-VkDebugMarkerObjectNameInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT

  • VUID-VkDebugMarkerObjectNameInfoEXT-pNext-pNext
    pNext 必须NULL

  • VUID-VkDebugMarkerObjectNameInfoEXT-objectType-parameter
    objectType 必须是一个有效的 VkDebugReportObjectTypeEXT

  • VUID-VkDebugMarkerObjectNameInfoEXT-pObjectName-parameter
    pObjectName 必须是一个以 null 结尾的 UTF-8 字符串

除了为对象设置名称外,调试和验证层可能还需要在每个对象的基础上使用额外的二进制数据,这些数据在 Vulkan API 中没有其他位置。例如,VkShaderModule 可以附加额外的调试数据,以帮助进行离线着色器跟踪。要将数据附加到对象,请调用

// Provided by VK_EXT_debug_marker
VkResult vkDebugMarkerSetObjectTagEXT(
    VkDevice                                    device,
    const VkDebugMarkerObjectTagInfoEXT*        pTagInfo);
  • device 是创建该对象的设备。

  • pTagInfo 是指向 VkDebugMarkerObjectTagInfoEXT 结构的指针,该结构指定要附加到对象的标签的参数。

有效用法(隐式)
  • VUID-vkDebugMarkerSetObjectTagEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkDebugMarkerSetObjectTagEXT-pTagInfo-parameter
    pTagInfo 必须是指向有效 VkDebugMarkerObjectTagInfoEXT 结构的有效指针

主机同步
  • pTagInfo->object 的主机访问必须是外部同步的

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkDebugMarkerObjectTagInfoEXT 结构的定义如下

// Provided by VK_EXT_debug_marker
typedef struct VkDebugMarkerObjectTagInfoEXT {
    VkStructureType               sType;
    const void*                   pNext;
    VkDebugReportObjectTypeEXT    objectType;
    uint64_t                      object;
    uint64_t                      tagName;
    size_t                        tagSize;
    const void*                   pTag;
} VkDebugMarkerObjectTagInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • objectType 是一个 VkDebugReportObjectTypeEXT,指定要命名的对象的类型。

  • object 是要标记的对象。

  • tagName 是标签的数字标识符。

  • tagSize 是附加到对象的字节数据数。

  • pTag 是指向包含要与对象关联的数据的 tagSize 字节数组的指针。

tagName 参数为要标记的数据类型提供名称或标识符。调试层可以使用它来轻松过滤出仅可由该实现使用的数据。

有效用法
  • VUID-VkDebugMarkerObjectTagInfoEXT-objectType-01493
    objectType 不能VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT

  • VUID-VkDebugMarkerObjectTagInfoEXT-object-01494
    object 不能VK_NULL_HANDLE

  • VUID-VkDebugMarkerObjectTagInfoEXT-object-01495
    object 必须是与 objectType 关联类型的 Vulkan 对象,如 VkDebugReportObjectTypeEXT 和 Vulkan 句柄关系 中所定义

有效用法(隐式)
  • VUID-VkDebugMarkerObjectTagInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT

  • VUID-VkDebugMarkerObjectTagInfoEXT-pNext-pNext
    pNext 必须NULL

  • VUID-VkDebugMarkerObjectTagInfoEXT-objectType-parameter
    objectType 必须是一个有效的 VkDebugReportObjectTypeEXT

  • VUID-VkDebugMarkerObjectTagInfoEXT-pTag-parameter
    pTag 必须 是指向 tagSize 字节数组的有效指针

  • VUID-VkDebugMarkerObjectTagInfoEXT-tagSize-arraylength
    tagSize 必须 大于 0

命令缓冲区标记

典型的 Vulkan 应用程序将在每一帧中提交许多命令缓冲区,每个命令缓冲区包含大量单独的命令。能够以逻辑方式注释属于一起的命令缓冲区区域以及按层次结构细分帧对于开发人员整体查看命令的能力非常重要。

标记命令 vkCmdDebugMarkerBeginEXTvkCmdDebugMarkerEndEXT 定义了一系列命令的区域,这些命令组合在一起,并且可以嵌套以创建层次结构。vkCmdDebugMarkerInsertEXT 命令允许在命令缓冲区内插入单个标签。

可以通过调用以下命令打开标记区域

// Provided by VK_EXT_debug_marker
void vkCmdDebugMarkerBeginEXT(
    VkCommandBuffer                             commandBuffer,
    const VkDebugMarkerMarkerInfoEXT*           pMarkerInfo);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • pMarkerInfo 是指向 VkDebugMarkerMarkerInfoEXT 结构的指针,该结构指定要打开的标记区域的参数。

有效用法(隐式)
  • VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdDebugMarkerBeginEXT-pMarkerInfo-parameter
    pMarkerInfo 必须是指向有效 VkDebugMarkerMarkerInfoEXT 结构的有效指针

  • VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdDebugMarkerBeginEXT-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形或计算操作

  • VUID-vkCmdDebugMarkerBeginEXT-videocoding
    此命令必须仅在视频编码范围之外调用

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型


两者

外部

图形
计算

动作

VkDebugMarkerMarkerInfoEXT 结构的定义如下

// Provided by VK_EXT_debug_marker
typedef struct VkDebugMarkerMarkerInfoEXT {
    VkStructureType    sType;
    const void*        pNext;
    const char*        pMarkerName;
    float              color[4];
} VkDebugMarkerMarkerInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • pMarkerName 是指向以 null 结尾的 UTF-8 字符串的指针,其中包含标记的名称。

  • color 是与标记关联的可选 RGBA 颜色值。特定的实现可以选择忽略此颜色值。这些值按顺序包含 RGBA 值,范围为 0.0 到 1.0。如果 color 中的所有元素均为 0.0,则会将其忽略。

有效用法(隐式)
  • VUID-VkDebugMarkerMarkerInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT

  • VUID-VkDebugMarkerMarkerInfoEXT-pNext-pNext
    pNext 必须NULL

  • VUID-VkDebugMarkerMarkerInfoEXT-pMarkerName-parameter
    pMarkerName 必须是一个以 null 结尾的 UTF-8 字符串

可以通过调用以下命令关闭标记区域

// Provided by VK_EXT_debug_marker
void vkCmdDebugMarkerEndEXT(
    VkCommandBuffer                             commandBuffer);
  • commandBuffer 是将命令记录到的命令缓冲区。

应用程序可以在一个命令缓冲区中打开一个标记区域,并在另一个命令缓冲区中关闭它,或者将标记区域拆分到多个命令缓冲区或多个队列提交中。当从提交到单个队列的线性序列来看时,对 vkCmdDebugMarkerBeginEXTvkCmdDebugMarkerEndEXT 的调用必须是匹配和平衡的。

有效用法
  • VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01239
    在将 commandBuffer 提交到的队列上,执行 vkCmdDebugMarkerEndEXT 之前必须有一个未完成的 vkCmdDebugMarkerBeginEXT 命令。

  • VUID-vkCmdDebugMarkerEndEXT-commandBuffer-01240
    如果 commandBuffer 是辅助命令缓冲区,则在 commandBuffer 中记录的,且之前没有被 vkCmdDebugMarkerEndEXT 调用结束的,必须有一个未完成的 vkCmdDebugMarkerBeginEXT 命令。

有效用法(隐式)
  • VUID-vkCmdDebugMarkerEndEXT-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdDebugMarkerEndEXT-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdDebugMarkerEndEXT-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形或计算操作

  • VUID-vkCmdDebugMarkerEndEXT-videocoding
    此命令必须仅在视频编码范围之外调用

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型


两者

外部

图形
计算

动作

通过调用,可以将单个标记标签插入到命令缓冲区中

// Provided by VK_EXT_debug_marker
void vkCmdDebugMarkerInsertEXT(
    VkCommandBuffer                             commandBuffer,
    const VkDebugMarkerMarkerInfoEXT*           pMarkerInfo);
  • commandBuffer 是将命令记录到的命令缓冲区。

  • pMarkerInfo 是指向 VkDebugMarkerMarkerInfoEXT 结构的指针,该结构指定要插入的标记的参数。

有效用法(隐式)
  • VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdDebugMarkerInsertEXT-pMarkerInfo-parameter
    pMarkerInfo 必须是指向有效 VkDebugMarkerMarkerInfoEXT 结构的有效指针

  • VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdDebugMarkerInsertEXT-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持图形或计算操作

  • VUID-vkCmdDebugMarkerInsertEXT-videocoding
    此命令必须仅在视频编码范围之外调用

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型


两者

外部

图形
计算

动作

调试报告回调

调试报告回调由 VkDebugReportCallbackEXT 句柄表示

// Provided by VK_EXT_debug_report
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDebugReportCallbackEXT)

当发生感兴趣的事件时,调试报告回调会提供有关应用程序使用 Vulkan 的更详细反馈。

要注册调试报告回调,应用程序使用 vkCreateDebugReportCallbackEXT

// Provided by VK_EXT_debug_report
VkResult vkCreateDebugReportCallbackEXT(
    VkInstance                                  instance,
    const VkDebugReportCallbackCreateInfoEXT*   pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkDebugReportCallbackEXT*                   pCallback);
有效用法(隐式)
  • VUID-vkCreateDebugReportCallbackEXT-instance-parameter
    instance 必须 是一个有效的 VkInstance 句柄

  • VUID-vkCreateDebugReportCallbackEXT-pCreateInfo-parameter
    pCreateInfo 必须是指向有效的 VkDebugReportCallbackCreateInfoEXT 结构的有效指针

  • VUID-vkCreateDebugReportCallbackEXT-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须 是指向有效的 VkAllocationCallbacks 结构的有效指针。

  • VUID-vkCreateDebugReportCallbackEXT-pCallback-parameter
    pCallback 必须是指向 VkDebugReportCallbackEXT 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

// Provided by VK_EXT_debug_report
typedef struct VkDebugReportCallbackCreateInfoEXT {
    VkStructureType                 sType;
    const void*                     pNext;
    VkDebugReportFlagsEXT           flags;
    PFN_vkDebugReportCallbackEXT    pfnCallback;
    void*                           pUserData;
} VkDebugReportCallbackCreateInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flagsVkDebugReportFlagBitsEXT 的位掩码,指定哪些事件将导致调用此回调。

  • pfnCallback 是要调用的应用程序回调函数。

  • pUserData 是要传递给回调的用户数据。

对于创建的每个 VkDebugReportCallbackEXTVkDebugReportCallbackCreateInfoEXT::flags 确定何时调用该 VkDebugReportCallbackCreateInfoEXT::pfnCallback。当发生事件时,实现将事件的 VkDebugReportFlagBitsEXT 标志与每个 VkDebugReportCallbackEXT 对象的标志进行按位与运算。对于每个非零结果,将调用相应的回调。回调将直接来自检测到事件的组件,除非其他层为了自己的目的(以不同的方式过滤它们,记录到系统错误日志等)拦截了调用。

如果创建了多个 VkDebugReportCallbackEXT 对象,应用程序可以接收多个回调。回调将始终在与发起 Vulkan 调用的线程相同的线程中执行。

回调可能会同时从多个线程调用(如果应用程序正在从多个线程进行 Vulkan 调用)。

有效用法(隐式)
  • VUID-VkDebugReportCallbackCreateInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT

  • VUID-VkDebugReportCallbackCreateInfoEXT-flags-parameter
    flags 必须VkDebugReportFlagBitsEXT 值的有效组合

  • VUID-VkDebugReportCallbackCreateInfoEXT-pfnCallback-parameter
    pfnCallback 必须是有效的 PFN_vkDebugReportCallbackEXT

可以在 VkDebugReportCallbackCreateInfoEXT::flags 中设置的位,用于指定导致调试报告的事件,包括

// Provided by VK_EXT_debug_report
typedef enum VkDebugReportFlagBitsEXT {
    VK_DEBUG_REPORT_INFORMATION_BIT_EXT = 0x00000001,
    VK_DEBUG_REPORT_WARNING_BIT_EXT = 0x00000002,
    VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT = 0x00000004,
    VK_DEBUG_REPORT_ERROR_BIT_EXT = 0x00000008,
    VK_DEBUG_REPORT_DEBUG_BIT_EXT = 0x00000010,
} VkDebugReportFlagBitsEXT;
  • VK_DEBUG_REPORT_ERROR_BIT_EXT 指定应用程序违反了规范的有效使用条件。

  • VK_DEBUG_REPORT_WARNING_BIT_EXT 指定使用了 Vulkan,这可能会暴露应用程序错误。这种情况可能不会立即造成危害,例如片段着色器输出到没有附件的位置。其他情况可能指向当非预期时几乎肯定是错误的行为,例如使用内存尚未填充的图像。一般来说,如果您看到警告但您知道该行为是预期/期望的,那么只需忽略该警告即可。

  • VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT 指定了 Vulkan 的一种可能非最优的使用方式,例如当设置 VkAttachmentDescription::loadOpVK_ATTACHMENT_LOAD_OP_CLEAR 时,使用 vkCmdClearColorImage 可能会导致性能问题。

  • VK_DEBUG_REPORT_INFORMATION_BIT_EXT 指定了一条信息性消息,例如在调试应用程序时可能很方便的资源详细信息。

  • VK_DEBUG_REPORT_DEBUG_BIT_EXT 指定了来自实现和层的诊断信息。

// Provided by VK_EXT_debug_report
typedef VkFlags VkDebugReportFlagsEXT;

VkDebugReportFlagsEXT 是一个位掩码类型,用于设置零个或多个 VkDebugReportFlagBitsEXT 的掩码。

应用程序实现的 VkDebugReportCallbackCreateInfoEXT::pfnCallback 函数的原型为:

// Provided by VK_EXT_debug_report
typedef VkBool32 (VKAPI_PTR *PFN_vkDebugReportCallbackEXT)(
    VkDebugReportFlagsEXT                       flags,
    VkDebugReportObjectTypeEXT                  objectType,
    uint64_t                                    object,
    size_t                                      location,
    int32_t                                     messageCode,
    const char*                                 pLayerPrefix,
    const char*                                 pMessage,
    void*                                       pUserData);
  • flags 指定触发此回调的 VkDebugReportFlagBitsEXT

  • objectType 是一个 VkDebugReportObjectTypeEXT 值,指定在事件触发时正在使用或创建的对象类型。

  • object 是检测到问题的对象。如果 objectTypeVK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT,则 object未定义的

  • location 是一个由组件(层、驱动程序、加载器)定义的值,指定触发器的位置。这是一个可选值。

  • messageCode 是一个由层定义的值,指示触发此回调的测试。

  • pLayerPrefix 是一个以 null 结尾的 UTF-8 字符串,它是进行回调的组件名称的缩写。pLayerPrefix 仅在回调期间有效。

  • pMessage 是一个以 null 结尾的 UTF-8 字符串,详细说明触发条件。pMessage 仅在回调期间有效。

  • pUserData 是创建 VkDebugReportCallbackEXT 时给定的用户数据。

回调不得调用 vkDestroyDebugReportCallbackEXT

回调返回一个 VkBool32,其解释方式由层指定。应用程序应该始终返回 VK_FALSEVK_TRUE 值保留用于层开发。

object 必须是一个 Vulkan 对象或 VK_NULL_HANDLE。如果 objectType 不是 VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT 并且 object 不是 VK_NULL_HANDLE,则 object 必须是与 VkDebugReportObjectTypeEXT 和 Vulkan 句柄关系中定义的 objectType 关联的相应类型的 Vulkan 对象。

传递给由 VkDebugReportCallbackCreateInfoEXT::pfnCallback 指定的回调函数的 objectType 参数的可能值,指定正在报告的对象句柄的类型,如下所示:

// Provided by VK_EXT_debug_marker, VK_EXT_debug_report
typedef enum VkDebugReportObjectTypeEXT {
    VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT = 0,
    VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT = 1,
    VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT = 2,
    VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT = 3,
    VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT = 4,
    VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT = 5,
    VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT = 6,
    VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT = 7,
    VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT = 8,
    VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT = 9,
    VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT = 10,
    VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT = 11,
    VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT = 12,
    VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT = 13,
    VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT = 14,
    VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT = 15,
    VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT = 16,
    VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT = 17,
    VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT = 18,
    VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT = 19,
    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT = 20,
    VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT = 21,
    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT = 22,
    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT = 23,
    VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT = 24,
    VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT = 25,
    VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT = 26,
    VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT = 27,
    VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT = 28,
    VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT = 29,
    VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT = 30,
    VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT = 33,
  // Provided by VK_VERSION_1_1 with VK_EXT_debug_report, VK_KHR_sampler_ycbcr_conversion with VK_EXT_debug_report
    VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT = 1000156000,
  // Provided by VK_VERSION_1_1 with VK_EXT_debug_report
    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT = 1000085000,
  // Provided by VK_EXT_debug_report with VK_NVX_binary_import
    VK_DEBUG_REPORT_OBJECT_TYPE_CU_MODULE_NVX_EXT = 1000029000,
  // Provided by VK_EXT_debug_report with VK_NVX_binary_import
    VK_DEBUG_REPORT_OBJECT_TYPE_CU_FUNCTION_NVX_EXT = 1000029001,
  // Provided by VK_KHR_acceleration_structure with VK_EXT_debug_report
    VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR_EXT = 1000150000,
  // Provided by VK_EXT_debug_report with VK_NV_ray_tracing
    VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT = 1000165000,
  // Provided by VK_EXT_debug_report with VK_NV_cuda_kernel_launch
    VK_DEBUG_REPORT_OBJECT_TYPE_CUDA_MODULE_NV_EXT = 1000307000,
  // Provided by VK_EXT_debug_report with VK_NV_cuda_kernel_launch
    VK_DEBUG_REPORT_OBJECT_TYPE_CUDA_FUNCTION_NV_EXT = 1000307001,
  // Provided by VK_EXT_debug_report with VK_FUCHSIA_buffer_collection
    VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA_EXT = 1000366000,
  // VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT is a deprecated alias
    VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT,
  // VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT is a deprecated alias
    VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT,
  // Provided by VK_KHR_descriptor_update_template with VK_EXT_debug_report
    VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_KHR_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT,
  // Provided by VK_KHR_sampler_ycbcr_conversion with VK_EXT_debug_report
    VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_KHR_EXT = VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT,
} VkDebugReportObjectTypeEXT;
表 2. VkDebugReportObjectTypeEXT 和 Vulkan 句柄关系
VkDebugReportObjectTypeEXT Vulkan 句柄类型

VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT

未知/未定义的句柄

VK_DEBUG_REPORT_OBJECT_TYPE_INSTANCE_EXT

VkInstance

VK_DEBUG_REPORT_OBJECT_TYPE_PHYSICAL_DEVICE_EXT

VkPhysicalDevice

VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT

VkDevice

VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT

VkQueue

VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT

VkSemaphore

VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT

VkCommandBuffer

VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT

VkFence

VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT

VkDeviceMemory

VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT

VkBuffer

VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT

VkImage

VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT

VkEvent

VK_DEBUG_REPORT_OBJECT_TYPE_QUERY_POOL_EXT

VkQueryPool

VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_VIEW_EXT

VkBufferView

VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_VIEW_EXT

VkImageView

VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT

VkShaderModule

VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_CACHE_EXT

VkPipelineCache

VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT

VkPipelineLayout

VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT

VkRenderPass

VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT

VkPipeline

VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT

VkDescriptorSetLayout

VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT

VkSampler

VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_POOL_EXT

VkDescriptorPool

VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT

VkDescriptorSet

VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT

VkFramebuffer

VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_POOL_EXT

VkCommandPool

VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT

VkSurfaceKHR

VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT

VkSwapchainKHR

VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT_EXT

VkDebugReportCallbackEXT

VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT

VkDisplayKHR

VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT

VkDisplayModeKHR

VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT

VkDescriptorUpdateTemplate

VK_ERROR_VALIDATION_FAILED_EXT 的主要预期用途是用于验证层测试。应用程序在正常使用验证层期间不应看到此错误代码。

要将自己的消息注入调试流,请调用

// Provided by VK_EXT_debug_report
void vkDebugReportMessageEXT(
    VkInstance                                  instance,
    VkDebugReportFlagsEXT                       flags,
    VkDebugReportObjectTypeEXT                  objectType,
    uint64_t                                    object,
    size_t                                      location,
    int32_t                                     messageCode,
    const char*                                 pLayerPrefix,
    const char*                                 pMessage);
  • instance 是调试流的 VkInstance

  • flags 指定此事件/消息的 VkDebugReportFlagBitsEXT 分类。

  • objectType 是一个 VkDebugReportObjectTypeEXT,指定在事件触发时正在使用或创建的对象类型。

  • object 是检测到问题的对象。如果事件没有关联对象,则 object 可以VK_NULL_HANDLE

  • location 是一个应用程序定义的值。

  • messageCode 是一个应用程序定义的值。

  • pLayerPrefix 是生成此事件/消息的组件的缩写。

  • pMessage 是一个以 null 结尾的 UTF-8 字符串,详细说明触发条件。

调用将通过各层传播,并根据消息的标志生成回调。这些参数将传递给回调,此外还有在注册回调时定义的 pUserData 值。

有效用法
有效用法(隐式)
  • VUID-vkDebugReportMessageEXT-instance-parameter
    instance 必须 是一个有效的 VkInstance 句柄

  • VUID-vkDebugReportMessageEXT-flags-parameter
    flags 必须VkDebugReportFlagBitsEXT 值的有效组合

  • VUID-vkDebugReportMessageEXT-flags-requiredbitmask
    flags 不得0

  • VUID-vkDebugReportMessageEXT-objectType-parameter
    objectType 必须是一个有效的 VkDebugReportObjectTypeEXT

  • VUID-vkDebugReportMessageEXT-pLayerPrefix-parameter
    pLayerPrefix 必须是一个以 null 结尾的 UTF-8 字符串。

  • VUID-vkDebugReportMessageEXT-pMessage-parameter
    pMessage 必须是一个以 null 结尾的 UTF-8 字符串。

要销毁 VkDebugReportCallbackEXT 对象,请调用

// Provided by VK_EXT_debug_report
void vkDestroyDebugReportCallbackEXT(
    VkInstance                                  instance,
    VkDebugReportCallbackEXT                    callback,
    const VkAllocationCallbacks*                pAllocator);
  • instance 是创建回调的实例。

  • callback 是要销毁的 VkDebugReportCallbackEXT 对象。callback 是一个外部同步对象,必须不同时在多个线程上使用。这意味着当回调处于活动状态时,不得调用 vkDestroyDebugReportCallbackEXT

  • pAllocator 控制主机内存分配,如内存分配章节中所述。

有效用法
  • VUID-vkDestroyDebugReportCallbackEXT-instance-01242
    如果在创建 callback 时提供了 VkAllocationCallbacks,则此处必须提供一组兼容的回调。

  • VUID-vkDestroyDebugReportCallbackEXT-instance-01243
    如果在创建 callback 时没有提供 VkAllocationCallbacks,则 pAllocator 必须NULL

有效用法(隐式)
  • VUID-vkDestroyDebugReportCallbackEXT-instance-parameter
    instance 必须 是一个有效的 VkInstance 句柄

  • VUID-vkDestroyDebugReportCallbackEXT-callback-parameter
    如果 callback 不是 VK_NULL_HANDLE,则 callback 必须 是一个有效的 VkDebugReportCallbackEXT 句柄

  • VUID-vkDestroyDebugReportCallbackEXT-pAllocator-parameter
    如果 pAllocator 不是 NULL,则 pAllocator 必须 是指向有效的 VkAllocationCallbacks 结构的有效指针。

  • VUID-vkDestroyDebugReportCallbackEXT-callback-parent
    如果 callback 是一个有效的句柄,它必须是从 instance 创建、分配或检索的

主机同步
  • callback 的主机访问必须进行外部同步

设备丢失调试

设备诊断检查点

可以通过用应用程序定义的诊断检查点注释命令流来跟踪设备执行进度,以用于调试设备丢失。

通过调用 vkCmdSetCheckpointNV 将设备诊断检查点插入到命令流中。

// Provided by VK_NV_device_diagnostic_checkpoints
void vkCmdSetCheckpointNV(
    VkCommandBuffer                             commandBuffer,
    const void*                                 pCheckpointMarker);
  • commandBuffer 是将接收标记的命令缓冲区

  • pCheckpointMarker 是一个由应用程序提供的,与检查点关联的不透明值。

有效用法(隐式)
  • VUID-vkCmdSetCheckpointNV-commandBuffer-parameter
    commandBuffer 必须 是一个有效的 VkCommandBuffer 句柄

  • VUID-vkCmdSetCheckpointNV-commandBuffer-recording
    commandBuffer 必须 处于记录状态

  • VUID-vkCmdSetCheckpointNV-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持图形、计算或传输操作

  • VUID-vkCmdSetCheckpointNV-videocoding
    此命令必须仅在视频编码范围之外调用

主机同步
  • commandBuffer 的主机访问必须进行外部同步

  • 对分配 commandBufferVkCommandPool 的主机访问必须进行外部同步

命令属性
命令缓冲区级别 渲染通道范围 视频编码范围 支持的队列类型 命令类型


两者

外部

图形
计算
传输

动作

请注意,pCheckpointMarker 被视为不透明值。它不需要是一个有效的指针,并且不会被实现取消引用。

如果在执行期间设备遇到错误,实现将在主机执行期间的某个时刻向应用程序返回一个 VK_ERROR_DEVICE_LOST 错误。当发生这种情况时,应用程序可以调用 vkGetQueueCheckpointData2NV 来检索有关设备执行的最近诊断检查点的信息。

// Provided by VK_NV_device_diagnostic_checkpoints with VK_VERSION_1_3 or VK_KHR_synchronization2
void vkGetQueueCheckpointData2NV(
    VkQueue                                     queue,
    uint32_t*                                   pCheckpointDataCount,
    VkCheckpointData2NV*                        pCheckpointData);
  • queue 是调用者想要检索检查点数据的 VkQueue 对象

  • pCheckpointDataCount 是一个指向与可用或查询的检查点标记数量相关的整数的指针,如下所述。

  • pCheckpointData 要么是 NULL,要么是指向 VkCheckpointData2NV 结构数组的指针。

如果 pCheckpointDataNULL,则在 pCheckpointDataCount 中返回可用的检查点标记的数量。否则,pCheckpointDataCount 必须指向一个由应用程序设置为 pCheckpointData 数组中元素数量的变量,并且在返回时,该变量将被实际写入 pCheckpointData 的结构数量覆盖。

如果 pCheckpointDataCount 小于可用检查点标记的数量,则最多写入 pCheckpointDataCount 个结构。

有效用法
  • VUID-vkGetQueueCheckpointData2NV-queue-03892
    queue 所属的设备必须处于丢失状态

有效用法(隐式)
  • VUID-vkGetQueueCheckpointData2NV-queue-parameter
    queue 必须 是有效的 VkQueue 句柄

  • VUID-vkGetQueueCheckpointData2NV-pCheckpointDataCount-parameter
    pCheckpointDataCount 必须是指向 uint32_t 值的有效指针

  • VUID-vkGetQueueCheckpointData2NV-pCheckpointData-parameter
    如果 pCheckpointDataCount 引用的值不是 0,并且 pCheckpointData 不是 NULL,则 pCheckpointData 必须是指向 pCheckpointDataCountVkCheckpointData2NV 结构数组的有效指针

VkCheckpointData2NV 结构定义为

// Provided by VK_NV_device_diagnostic_checkpoints with VK_VERSION_1_3 or VK_KHR_synchronization2
typedef struct VkCheckpointData2NV {
    VkStructureType          sType;
    void*                    pNext;
    VkPipelineStageFlags2    stage;
    void*                    pCheckpointMarker;
} VkCheckpointData2NV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stage 指示检查点标记数据引用的单个管线阶段。

  • pCheckpointMarker 包含 stage 引用的阶段中执行的最后一个检查点标记的值。

有效用法(隐式)
  • VUID-VkCheckpointData2NV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV

  • VUID-VkCheckpointData2NV-pNext-pNext
    pNext 必须NULL

可以执行检查点标记的阶段是实现定义的,并且可以通过调用 vkGetPhysicalDeviceQueueFamilyProperties2 查询。

如果在执行期间设备遇到错误,实现将在主机执行期间的某个时刻向应用程序返回一个 VK_ERROR_DEVICE_LOST 错误。当发生这种情况时,应用程序可以调用 vkGetQueueCheckpointDataNV 来检索有关设备执行的最近诊断检查点的信息。

// Provided by VK_NV_device_diagnostic_checkpoints
void vkGetQueueCheckpointDataNV(
    VkQueue                                     queue,
    uint32_t*                                   pCheckpointDataCount,
    VkCheckpointDataNV*                         pCheckpointData);
  • queue 是调用者想要检索检查点数据的 VkQueue 对象

  • pCheckpointDataCount 是一个指向与可用或查询的检查点标记数量相关的整数的指针,如下所述。

  • pCheckpointData 要么是 NULL,要么是指向 VkCheckpointDataNV 结构数组的指针。

如果 pCheckpointDataNULL,则在 pCheckpointDataCount 中返回可用的检查点标记的数量。

否则,pCheckpointDataCount 必须指向一个由应用程序设置为 pCheckpointData 数组中元素数量的变量,并且在返回时,该变量将被实际写入 pCheckpointData 的结构数量覆盖。

如果 pCheckpointDataCount 小于可用检查点标记的数量,则最多写入 pCheckpointDataCount 个结构。

有效用法
  • VUID-vkGetQueueCheckpointDataNV-queue-02025
    queue 所属的设备必须处于丢失状态

有效用法(隐式)
  • VUID-vkGetQueueCheckpointDataNV-queue-parameter
    queue 必须 是有效的 VkQueue 句柄

  • VUID-vkGetQueueCheckpointDataNV-pCheckpointDataCount-parameter
    pCheckpointDataCount 必须是指向 uint32_t 值的有效指针

  • VUID-vkGetQueueCheckpointDataNV-pCheckpointData-parameter
    如果 pCheckpointDataCount 引用的值不是 0,并且 pCheckpointData 不是 NULL,则 pCheckpointData 必须是指向 pCheckpointDataCountVkCheckpointDataNV 结构数组的有效指针

VkCheckpointDataNV 结构定义为

// Provided by VK_NV_device_diagnostic_checkpoints
typedef struct VkCheckpointDataNV {
    VkStructureType            sType;
    void*                      pNext;
    VkPipelineStageFlagBits    stage;
    void*                      pCheckpointMarker;
} VkCheckpointDataNV;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • stage 是一个 VkPipelineStageFlagBits 值,指定检查点标记数据引用的管线阶段。

  • pCheckpointMarker 包含 stage 引用的阶段中执行的最后一个检查点标记的值。

可以执行检查点标记的阶段是实现定义的,并且可以通过调用 vkGetPhysicalDeviceQueueFamilyProperties2 查询。

有效用法(隐式)
  • VUID-VkCheckpointDataNV-sType-sType
    sType 必须VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV

  • VUID-VkCheckpointDataNV-pNext-pNext
    pNext 必须NULL

设备故障诊断

要检索有关可能导致设备丢失的故障的诊断信息,请调用

// Provided by VK_EXT_device_fault
VkResult vkGetDeviceFaultInfoEXT(
    VkDevice                                    device,
    VkDeviceFaultCountsEXT*                     pFaultCounts,
    VkDeviceFaultInfoEXT*                       pFaultInfo);
  • device 是要从中查询诊断故障信息的逻辑设备。

  • pFaultCounts 是指向 VkDeviceFaultCountsEXT 结构的指针,其中返回描述附加故障信息的结构计数。

  • pFaultInfoNULL 或指向 VkDeviceFaultInfoEXT 结构的指针,其中返回故障信息。

如果 pFaultInfoNULL,则在 pFaultCountsaddressInfoCountvendorInfoCount 成员中返回相应的附加故障信息结构的计数。此外,任何供应商特定的二进制崩溃转储的大小都将在 pFaultCountsvendorBinarySize 成员中返回。

如果 pFaultInfo 不是 NULL,则 pFaultCounts 必须 指向一个 VkDeviceFaultCountsEXT 结构体,其中每个结构体的计数或大小成员(addressInfoCountvendorInfoCountvendorBinarySize)由应用程序设置为 pFaultInfo 的相应输出数组成员(pAddressInfospVendorInfos)中的元素数量,或者设置为输出缓冲区的大小(以字节为单位,即 pVendorBinaryData)。返回时,每个结构体的计数成员将被实际写入 pFaultInfo 的相应输出数组成员的结构体数量覆盖。类似地,vendorBinarySize 将被实际写入 pFaultInfopVendorBinaryData 成员的字节数覆盖。

如果供应商特定的崩溃转储功能未启用,则实现必须pFaultCounts->vendorBinarySize 设置为零,并且必须不修改 pFaultInfo->pVendorBinaryData

如果任何 pFaultCounts 结构体的计数成员小于可用的相应故障属性的数量,则最多会将结构体计数 (addressInfoCount, vendorInfoCount) 个元素写入关联的 pFaultInfo 输出数组。类似地,如果 vendorBinarySize 小于可用崩溃转储数据的大小(以字节为单位),则最多会将 vendorBinarySize 个元素写入 pVendorBinaryData

如果 pFaultInfoNULL,则后续对同一个 device 调用 vkGetDeviceFaultInfoEXT 时,pFaultCountsaddressInfoCountvendorInfoCountvendorBinarySize 成员必须返回相同的值。

如果 pFaultInfo 不为 NULL,则后续对同一个 device 调用 vkGetDeviceFaultInfoEXT 时,pFaultInfo 的输出成员(pAddressInfospVendorInfospVendorBinaryData必须返回相同的值,直到 pFaultCounts 的结构体计数和缓冲区大小成员(addressInfoCountvendorInfoCountvendorBinarySize)所描述的限制。如果后续调用 vkGetDeviceFaultInfoEXTpFaultInfo 的输出成员的大小增加,则可能会在额外的可用空间中返回补充信息。

如果任何 pFaultCounts 结构体的计数成员小于可用的相应故障属性的数量,或者如果 pFaultCounts->vendorBinarySize 小于生成的二进制崩溃转储数据的大小(以字节为单位),则会返回 VK_INCOMPLETE 而不是 VK_SUCCESS,以指示并非所有可用的属性都被返回。

如果 pFaultCounts->vendorBinarySize 小于存储二进制崩溃转储头部所需的大小,则不会写入任何内容到 pFaultInfo->pVendorBinaryData,并且将零写入 pFaultCounts->vendorBinarySize

有效用法
  • VUID-vkGetDeviceFaultInfoEXT-device-07336
    device 必须处于丢失状态

  • VUID-vkGetDeviceFaultInfoEXT-pFaultCounts-07337
    如果 pFaultCounts->addressInfoCount 引用的值不为 0,且 pFaultInfo->pAddressInfos 不为 NULL,则 pFaultInfo->pAddressInfos 必须是指向 pFaultCounts->addressInfoCountVkDeviceFaultAddressInfoEXT 结构体的有效指针数组。

  • VUID-vkGetDeviceFaultInfoEXT-pFaultCounts-07338
    如果 pFaultCounts->vendorInfoCount 引用的值不为 0,且 pFaultInfo->pVendorInfos 不为 NULL,则 pFaultInfo->pVendorInfos 必须是指向 pFaultCounts->vendorInfoCountVkDeviceFaultVendorInfoEXT 结构体的有效指针数组。

  • VUID-vkGetDeviceFaultInfoEXT-pFaultCounts-07339
    如果 pFaultCounts->vendorBinarySize 引用的值不为 0,且 pFaultInfo->pVendorBinaryData 不为 NULL,则 pFaultInfo->pVendorBinaryData 必须是指向 pFaultCounts->vendorBinarySize 个字节的有效指针数组。

有效用法(隐式)
  • VUID-vkGetDeviceFaultInfoEXT-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkGetDeviceFaultInfoEXT-pFaultCounts-parameter
    pFaultCounts 必须是指向 VkDeviceFaultCountsEXT 结构体的有效指针。

  • VUID-vkGetDeviceFaultInfoEXT-pFaultInfo-parameter
    如果 pFaultInfo 不为 NULL,则 pFaultInfo 必须是指向 VkDeviceFaultInfoEXT 结构体的有效指针。

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

VkDeviceFaultCountsEXT 结构体定义为:

// Provided by VK_EXT_device_fault
typedef struct VkDeviceFaultCountsEXT {
    VkStructureType    sType;
    void*              pNext;
    uint32_t           addressInfoCount;
    uint32_t           vendorInfoCount;
    VkDeviceSize       vendorBinarySize;
} VkDeviceFaultCountsEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • addressInfoCount 是描述可能导致页面错误的内存访问,或者在发生错误时活动指令的地址的 VkDeviceFaultAddressInfoEXT 结构体的数量。

  • vendorInfoCount 是描述供应商特定故障信息的 VkDeviceFaultVendorInfoEXT 结构体的数量。

  • vendorBinarySize 是供应商特定的二进制崩溃转储的大小(以字节为单位),当导入到外部工具时,可能会提供额外的信息。

有效用法(隐式)
  • VUID-VkDeviceFaultCountsEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_FAULT_COUNTS_EXT

  • VUID-VkDeviceFaultCountsEXT-pNext-pNext
    pNext 必须NULL

VkDeviceFaultInfoEXT 结构体定义为:

// Provided by VK_EXT_device_fault
typedef struct VkDeviceFaultInfoEXT {
    VkStructureType                 sType;
    void*                           pNext;
    char                            description[VK_MAX_DESCRIPTION_SIZE];
    VkDeviceFaultAddressInfoEXT*    pAddressInfos;
    VkDeviceFaultVendorInfoEXT*     pVendorInfos;
    void*                           pVendorBinaryData;
} VkDeviceFaultInfoEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • description 是一个 char 类型的数组,大小为 VK_MAX_DESCRIPTION_SIZE,其中包含以 null 结尾的 UTF-8 字符串,该字符串是人类可读的故障描述。

  • pAddressInfosNULL 或指向 VkDeviceFaultAddressInfoEXT 结构体数组的指针,该数组描述了可能导致页面错误的内存访问,或者描述了发生错误时的活动指令指针。如果不是 NULL,则 pAddressInfos 的每个元素都描述了 GPU 虚拟地址空间的一个有界区域,其中包含被访问的 GPU 虚拟地址或活动指令指针的值。

  • pVendorInfosNULL 或指向 VkDeviceFaultVendorInfoEXT 结构体数组的指针,该数组描述了供应商特定的故障信息。

  • pVendorBinaryDataNULL 或指向 vendorBinarySize 个字节的数据的指针,该数据将填充供应商特定的二进制崩溃转储,如 供应商二进制崩溃转储 中所述。

在给定故障发生时可用的信息和实现本身的约束条件下,实现应该尽可能填充 VkDeviceFaultInfoEXT 的多个成员。

由于硬件限制,pAddressInfos 描述的是 GPU 虚拟地址空间的范围,而不是精确的地址。访问的精确内存地址或指令指针的精确值必须位于所描述的区域内。

pAddressInfos 的每个元素描述以下之一:

  • 可能触发页面错误并可能导致设备丢失的内存访问

  • 发生故障时活动指令指针的值。该值可能指示设备丢失时活动的管线或着色器

pAddressInfos 描述的 GPU 虚拟地址与 VK_EXT_device_address_binding_report 扩展报告的 GPU 虚拟地址范围进行比较,可以允许应用程序将这些地址与 Vulkan 对象相关联。应用程序应注意,这些地址也可能对应于实现内部的资源,这些资源将不会通过 VK_EXT_device_address_binding_report 扩展报告。

有效用法(隐式)
  • VUID-VkDeviceFaultInfoEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_DEVICE_FAULT_INFO_EXT

  • VUID-VkDeviceFaultInfoEXT-pNext-pNext
    pNext 必须NULL

VkDeviceFaultAddressInfoEXT 结构的定义如下:

// Provided by VK_EXT_device_fault
typedef struct VkDeviceFaultAddressInfoEXT {
    VkDeviceFaultAddressTypeEXT    addressType;
    VkDeviceAddress                reportedAddress;
    VkDeviceSize                   addressPrecision;
} VkDeviceFaultAddressInfoEXT;
  • addressType 是触发页面错误的内存操作类型,或是指令指针与错误之间关联的类型。

  • reportedAddress 是设备记录的 GPU 虚拟地址。

  • addressPrecision 是 2 的幂值,指定设备报告地址的精确程度。

reportedAddressaddressPrecision 的组合允许计算可能的地址范围,使得:

lower_address = (pInfo->reportedAddress & ~(pInfo->addressPrecision-1))
upper_address = (pInfo->reportedAddress |  (pInfo->addressPrecision-1))

reportedAddress 可以包含比 addressPrecision 指示的更精确的地址,这是有效的。在这种情况下,reportedAddress 的值应被视为触发页面错误的地址值或指令指针值的额外提示。

有效用法(隐式)

VkDeviceFaultAddressInfoEXT::addressType 的可能值为:

// Provided by VK_EXT_device_fault
typedef enum VkDeviceFaultAddressTypeEXT {
    VK_DEVICE_FAULT_ADDRESS_TYPE_NONE_EXT = 0,
    VK_DEVICE_FAULT_ADDRESS_TYPE_READ_INVALID_EXT = 1,
    VK_DEVICE_FAULT_ADDRESS_TYPE_WRITE_INVALID_EXT = 2,
    VK_DEVICE_FAULT_ADDRESS_TYPE_EXECUTE_INVALID_EXT = 3,
    VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_UNKNOWN_EXT = 4,
    VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_INVALID_EXT = 5,
    VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_FAULT_EXT = 6,
} VkDeviceFaultAddressTypeEXT;
  • VK_DEVICE_FAULT_ADDRESS_TYPE_NONE_EXT 指定 VkDeviceFaultAddressInfoEXT 不描述页面错误或指令地址。

  • VK_DEVICE_FAULT_ADDRESS_TYPE_READ_INVALID_EXT 指定 VkDeviceFaultAddressInfoEXT 描述由无效的读取操作触发的页面错误。

  • VK_DEVICE_FAULT_ADDRESS_TYPE_WRITE_INVALID_EXT 指定 VkDeviceFaultAddressInfoEXT 描述由无效的写入操作触发的页面错误。

  • VK_DEVICE_FAULT_ADDRESS_TYPE_EXECUTE_INVALID_EXT 描述试图执行不可执行内存而触发的页面错误。

  • VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_UNKNOWN_EXT 指定发生错误时的指令指针值。这可能与错误有关,也可能无关。

  • VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_INVALID_EXT 指定与无效指令错误相关的指令指针值。

  • VK_DEVICE_FAULT_ADDRESS_TYPE_INSTRUCTION_POINTER_FAULT_EXT 指定与错误关联的指令指针值。

记录的指令指针值可能无法识别触发错误的特定指令。报告的指令指针和触发指令之间的关系将是特定于供应商的。

VkDeviceFaultVendorInfoEXT 结构的定义如下:

// Provided by VK_EXT_device_fault
typedef struct VkDeviceFaultVendorInfoEXT {
    char        description[VK_MAX_DESCRIPTION_SIZE];
    uint64_t    vendorFaultCode;
    uint64_t    vendorFaultData;
} VkDeviceFaultVendorInfoEXT;
  • description 是一个 char 类型的数组,大小为 VK_MAX_DESCRIPTION_SIZE,其中包含以 null 结尾的 UTF-8 字符串,该字符串是人类可读的故障描述。

  • vendorFaultCode 是此错误的供应商特定错误代码。

  • vendorFaultData 是与此错误关联的供应商特定错误数据。

供应商二进制崩溃转储

应用程序可以存储调用 vkGetDeviceFaultInfoEXT 获取的供应商特定二进制崩溃转储数据,以便以后使用外部工具进行分析。

但是,此数据的格式可能取决于供应商 ID、设备 ID、驱动程序版本以及设备的其它详细信息。为了使外部应用程序能够识别生成崩溃转储的原始设备,写入 VkDeviceFaultInfoEXT::pVendorBinaryData 的初始字节必须以有效的崩溃转储标头开始。

崩溃转储标头的第一版本定义如下:

// Provided by VK_EXT_device_fault
typedef struct VkDeviceFaultVendorBinaryHeaderVersionOneEXT {
    uint32_t                                     headerSize;
    VkDeviceFaultVendorBinaryHeaderVersionEXT    headerVersion;
    uint32_t                                     vendorID;
    uint32_t                                     deviceID;
    uint32_t                                     driverVersion;
    uint8_t                                      pipelineCacheUUID[VK_UUID_SIZE];
    uint32_t                                     applicationNameOffset;
    uint32_t                                     applicationVersion;
    uint32_t                                     engineNameOffset;
    uint32_t                                     engineVersion;
    uint32_t                                     apiVersion;
} VkDeviceFaultVendorBinaryHeaderVersionOneEXT;
  • headerSize 是崩溃转储标头的长度(以字节为单位)。

  • headerVersion 是一个 VkDeviceFaultVendorBinaryHeaderVersionEXT 枚举值,指定标头的版本。崩溃转储的使用者应该使用标头版本来解释标头的其余部分。

  • vendorID 是实现的 VkPhysicalDeviceProperties::vendorID

  • deviceID 是实现的 VkPhysicalDeviceProperties::deviceID

  • driverVersion 是实现的 VkPhysicalDeviceProperties::driverVersion

  • pipelineCacheUUID 是与实现的 VkPhysicalDeviceProperties::pipelineCacheUUID 属性匹配的 VK_UUID_SIZE uint8_t 值数组。

  • applicationNameOffset 为零,或从崩溃转储标头的基址到包含应用程序名称的以 null 结尾的 UTF-8 字符串的偏移量。如果 applicationNameOffset 非零,则此字符串必须与实例创建期间通过 VkApplicationInfo::pApplicationName 指定的应用程序名称匹配。

  • applicationVersion 必须为零或在实例创建期间由 VkApplicationInfo::applicationVersion 指定的值。

  • engineNameOffset 为零,或从崩溃转储标头的基址到包含用于创建应用程序的引擎名称(如果有)的以 null 结尾的 UTF-8 字符串的偏移量。如果 engineNameOffset 非零,则此字符串必须与实例创建期间通过 VkApplicationInfo::pEngineName 指定的引擎名称匹配。

  • engineVersion 必须为零或在实例创建期间由 VkApplicationInfo::engineVersion 指定的值。

  • apiVersion 必须为零或在实例创建期间由 VkApplicationInfo::apiVersion 指定的值。

与 Vulkan API 声明的大多数结构不同,此结构的所有字段都以最低有效字节优先写入,而不管主机字节顺序如何。

C 语言规范未定义结构成员的打包方式。此布局假定紧凑的结构成员打包,成员按照结构中列出的顺序布局,并且结构的预期大小为 56 字节。如果编译器生成偏离该模式的代码,则应用程序必须采用其他方法在正确的偏移量处设置值。

有效用法
  • VUID-VkDeviceFaultVendorBinaryHeaderVersionOneEXT-headerSize-07340
    headerSize 必须为 56

  • VUID-VkDeviceFaultVendorBinaryHeaderVersionOneEXT-headerVersion-07341
    headerVersion 必须VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT

有效用法(隐式)

崩溃转储标头的 headerVersion 值的可能值为:

// Provided by VK_EXT_device_fault
typedef enum VkDeviceFaultVendorBinaryHeaderVersionEXT {
    VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT = 1,
} VkDeviceFaultVendorBinaryHeaderVersionEXT;
  • VK_DEVICE_FAULT_VENDOR_BINARY_HEADER_VERSION_ONE_EXT 指定二进制崩溃转储标头的第一版本。

活动工具信息

可以通过调用以下命令获取关于为给定物理设备提供调试、分析或类似服务的工具的信息:

// Provided by VK_VERSION_1_3
VkResult vkGetPhysicalDeviceToolProperties(
    VkPhysicalDevice                            physicalDevice,
    uint32_t*                                   pToolCount,
    VkPhysicalDeviceToolProperties*             pToolProperties);

或等效命令:

// Provided by VK_EXT_tooling_info
VkResult vkGetPhysicalDeviceToolPropertiesEXT(
    VkPhysicalDevice                            physicalDevice,
    uint32_t*                                   pToolCount,
    VkPhysicalDeviceToolProperties*             pToolProperties);
  • physicalDevice 是要查询活动工具的物理设备的句柄。

  • pToolCount 是指向描述 physicalDevice 上活动工具数量的整数的指针。

  • pToolProperties 可以是 NULL,也可以是指向 VkPhysicalDeviceToolProperties 结构数组的指针。

如果 pToolPropertiesNULL,则 physicalDevice 上当前活动工具的数量将在 pToolCount 中返回。否则,pToolCount 必须指向一个由应用程序设置为 pToolProperties 数组中元素数量的变量,并且在返回时,该变量将被实际写入 pToolProperties 的结构数量覆盖。如果 pToolCount 小于当前活动工具的数量,则最多写入 pToolCount 个结构。

活动工具的计数和属性可能会响应规范范围之外的事件而更改。应用程序应该假定这些属性可能在任何给定时间更改。

有效用法(隐式)
  • VUID-vkGetPhysicalDeviceToolProperties-physicalDevice-parameter
    physicalDevice 必须 是一个有效的 VkPhysicalDevice 句柄

  • VUID-vkGetPhysicalDeviceToolProperties-pToolCount-parameter
    pToolCount 必须 是一个指向 uint32_t 值的有效指针

  • VUID-vkGetPhysicalDeviceToolProperties-pToolProperties-parameter
    如果 pToolCount 引用的值不为 0,并且 pToolProperties 不为 NULL,则 pToolProperties 必须 是一个指向 pToolCountVkPhysicalDeviceToolProperties 结构体数组的有效指针

返回代码
成功
  • VK_SUCCESS

  • VK_INCOMPLETE

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

VkPhysicalDeviceToolProperties 结构体定义如下:

// Provided by VK_VERSION_1_3
typedef struct VkPhysicalDeviceToolProperties {
    VkStructureType       sType;
    void*                 pNext;
    char                  name[VK_MAX_EXTENSION_NAME_SIZE];
    char                  version[VK_MAX_EXTENSION_NAME_SIZE];
    VkToolPurposeFlags    purposes;
    char                  description[VK_MAX_DESCRIPTION_SIZE];
    char                  layer[VK_MAX_EXTENSION_NAME_SIZE];
} VkPhysicalDeviceToolProperties;

或者等效于:

// Provided by VK_EXT_tooling_info
typedef VkPhysicalDeviceToolProperties VkPhysicalDeviceToolPropertiesEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • name 是一个以 null 结尾的 UTF-8 字符串,包含工具的名称。

  • version 是一个以 null 结尾的 UTF-8 字符串,包含工具的版本。

  • purposes 是一个 VkToolPurposeFlagBits 的位掩码,其中填充了工具支持的目的。

  • description 是一个以 null 结尾的 UTF-8 字符串,包含工具的描述。

  • layer 是一个以 null 结尾的 UTF-8 字符串,包含实现工具的层的名称,如果工具在层中实现 - 否则它可能是一个空字符串。

有效用法(隐式)
  • VUID-VkPhysicalDeviceToolProperties-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES

  • VUID-VkPhysicalDeviceToolProperties-pNext-pNext
    pNext 必须NULL

VkPhysicalDeviceToolProperties::purposes可以设置的位,用于指定活动工具的目的,包括:

// Provided by VK_VERSION_1_3
typedef enum VkToolPurposeFlagBits {
    VK_TOOL_PURPOSE_VALIDATION_BIT = 0x00000001,
    VK_TOOL_PURPOSE_PROFILING_BIT = 0x00000002,
    VK_TOOL_PURPOSE_TRACING_BIT = 0x00000004,
    VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT = 0x00000008,
    VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT = 0x00000010,
  // Provided by VK_EXT_debug_report with VK_EXT_tooling_info, VK_EXT_debug_utils with VK_EXT_tooling_info
    VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT = 0x00000020,
  // Provided by VK_EXT_debug_marker with VK_EXT_tooling_info, VK_EXT_debug_utils with VK_EXT_tooling_info
    VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT = 0x00000040,
  // Provided by VK_EXT_tooling_info
    VK_TOOL_PURPOSE_VALIDATION_BIT_EXT = VK_TOOL_PURPOSE_VALIDATION_BIT,
  // Provided by VK_EXT_tooling_info
    VK_TOOL_PURPOSE_PROFILING_BIT_EXT = VK_TOOL_PURPOSE_PROFILING_BIT,
  // Provided by VK_EXT_tooling_info
    VK_TOOL_PURPOSE_TRACING_BIT_EXT = VK_TOOL_PURPOSE_TRACING_BIT,
  // Provided by VK_EXT_tooling_info
    VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT_EXT = VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT,
  // Provided by VK_EXT_tooling_info
    VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT_EXT = VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT,
} VkToolPurposeFlagBits;

或者等效于:

// Provided by VK_EXT_tooling_info
typedef VkToolPurposeFlagBits VkToolPurposeFlagBitsEXT;
  • VK_TOOL_PURPOSE_VALIDATION_BIT 指定该工具提供 API 使用的验证。

  • VK_TOOL_PURPOSE_PROFILING_BIT 指定该工具提供 API 使用的性能分析。

  • VK_TOOL_PURPOSE_TRACING_BIT 指定该工具正在捕获有关应用程序 API 使用情况的数据,包括从简单日志记录到捕获数据以便稍后重放的任何内容。

  • VK_TOOL_PURPOSE_ADDITIONAL_FEATURES_BIT 指定该工具在底层实现之上提供额外的 API 功能/扩展。

  • VK_TOOL_PURPOSE_MODIFYING_FEATURES_BIT 指定该工具修改呈现给应用程序的 API 功能/限制/扩展。

  • VK_TOOL_PURPOSE_DEBUG_REPORTING_BIT_EXT 指定该工具通过 vkCreateDebugReportCallbackEXTvkCreateDebugUtilsMessengerEXT 指定的回调向应用程序报告其他信息

  • VK_TOOL_PURPOSE_DEBUG_MARKERS_BIT_EXT 指定该工具使用 调试标记对象调试注释队列标签命令缓冲区标签

// Provided by VK_VERSION_1_3
typedef VkFlags VkToolPurposeFlags;

或者等效于:

// Provided by VK_EXT_tooling_info
typedef VkToolPurposeFlags VkToolPurposeFlagsEXT;

VkToolPurposeFlags 是一种位掩码类型,用于设置零个或多个 VkToolPurposeFlagBits 的掩码。

帧边界

VkFrameBoundaryEXT 结构体定义如下:

// Provided by VK_EXT_frame_boundary
typedef struct VkFrameBoundaryEXT {
    VkStructureType            sType;
    const void*                pNext;
    VkFrameBoundaryFlagsEXT    flags;
    uint64_t                   frameID;
    uint32_t                   imageCount;
    const VkImage*             pImages;
    uint32_t                   bufferCount;
    const VkBuffer*            pBuffers;
    uint64_t                   tagName;
    size_t                     tagSize;
    const void*                pTag;
} VkFrameBoundaryEXT;
  • sType 是一个 VkStructureType 值,用于标识此结构。

  • pNextNULL 或指向扩展此结构的结构的指针。

  • flags 是一个 VkFrameBoundaryFlagBitsEXT 的位掩码,可以标记帧标识符的最后一次提交。

  • frameID 是帧标识符。

  • imageCount 是存储帧结果的图像数量。

  • pImages 是指向具有 imageCount 个条目的 VkImage 对象数组的指针。

  • bufferCount 是存储帧结果的缓冲区数量。

  • pBuffers 是指向具有 bufferCount 个条目的 VkBuffer 对象数组的指针。

  • tagName 是标签数据的数字标识符。

  • tagSize 是标签数据的字节数。

  • pTag 是指向包含标签数据的 tagSize 字节数组的指针。

应用程序可以通过将 VkFrameBoundaryEXT 结构添加到 队列提交VkPresentInfoKHRVkBindSparseInfopNext 链中,将帧边界信息与队列提交调用关联起来。

帧标识符用于将一个或多个队列提交与帧关联起来。它旨在在帧生命周期内是唯一的,即可以(尽管不建议)重用帧标识符,只要任何两个可能具有重叠队列提交的帧(如上面的示例所示)使用不同的帧标识符。

由于帧的概念取决于应用程序,因此无法验证帧标识符的使用。 良好的做法是使用单调递增的计数器作为帧标识符,并且不要在帧之间重用标识符。

pImagespBuffers 数组包含存储帧“最终结果”的图像和缓冲区列表。由于帧的概念取决于应用程序,并非所有帧可能会在图像或缓冲区中产生其结果,但这是 VkFrameBoundaryEXT 要处理的一个足够常见的用例。 请注意,由于图像旨在由已经跟踪此必需信息的工具使用,因此不提供额外的信息(例如图像布局)。 有可能传递最终结果图像列表,使得 VkFrameBoundaryEXTvkQueuePresentKHR 一样具有表达能力,后者通常是默认的帧边界分隔符。

应用程序可以通过使用 tagNametagSizepTag 通过标签数据关联任意额外的额外信息。 此额外信息通常是特定于工具的。

有效用法(隐式)
  • VUID-VkFrameBoundaryEXT-sType-sType
    sType 必须VK_STRUCTURE_TYPE_FRAME_BOUNDARY_EXT

  • VUID-VkFrameBoundaryEXT-flags-parameter
    flags 必须VkFrameBoundaryFlagBitsEXT 值的有效组合

  • VUID-VkFrameBoundaryEXT-pImages-parameter
    如果 imageCount 不为 0,并且 pImages 不为 NULL,则 pImages 必须 是指向 imageCount 个有效 VkImage 句柄数组的有效指针

  • VUID-VkFrameBoundaryEXT-pBuffers-parameter
    如果 bufferCount 不为 0,并且 pBuffers 不为 NULL,则 pBuffers 必须 是指向 bufferCount 个有效 VkBuffer 句柄数组的有效指针

  • VUID-VkFrameBoundaryEXT-pTag-parameter
    如果 tagSize 不为 0,并且 pTag 不为 NULL,则 pTag 必须 是指向 tagSize 字节数组的有效指针

  • VUID-VkFrameBoundaryEXT-commonparent
    pBuffers 的元素和 pImages 的元素(作为未忽略参数的有效句柄)必须已从同一个 VkDevice 创建、分配或检索。

VkFrameBoundaryEXT::flags可以设置的位是

// Provided by VK_EXT_frame_boundary
typedef enum VkFrameBoundaryFlagBitsEXT {
    VK_FRAME_BOUNDARY_FRAME_END_BIT_EXT = 0x00000001,
} VkFrameBoundaryFlagBitsEXT;
  • VK_FRAME_BOUNDARY_FRAME_END_BIT_EXT 指定此队列提交是此帧的最后一个提交,即一旦此队列提交终止,则此帧的工作就完成了。

请注意,在存在时间线信号量的情况下,最后一个队列提交可能不是最后一个被提交的,因为时间线信号量允许先等待后发送信号的提交。在帧边界的上下文中,应该标记为最后一个的队列提交是计划最后执行的提交,即使它可能不是最后一个被提交的。

// Provided by VK_EXT_frame_boundary
typedef VkFlags VkFrameBoundaryFlagsEXT;

VkFrameBoundaryFlagsEXT 是一个位掩码类型,用于设置零个或多个 VkFrameBoundaryFlagBitsEXT 的掩码。