查询

查询提供了一种机制来返回有关 Vulkan 命令序列处理的信息。查询操作是异步的,因此,它们的结果不会立即返回。相反,它们的结果及其可用性状态存储在查询池中。这些查询的状态可以在主机上读取,或复制到设备上的缓冲区对象。

支持的查询类型为遮挡查询管线统计查询结果状态查询视频编码反馈查询时间戳查询。如果相关的扩展可用,则支持性能查询。如果相关的扩展可用,则支持转换反馈查询。如果相关的扩展可用,则支持英特尔性能查询。如果相关的扩展可用,则支持网格着色器查询

如果支持相应的扩展,则可以使用与光线追踪相关的几个具有特定用途的附加查询,如VkQueryType中所述。

查询池

查询使用查询池对象进行管理。每个查询池是特定类型特定数量的查询的集合。

查询池由 VkQueryPool 句柄表示

// Provided by VK_VERSION_1_0
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkQueryPool)

要创建查询池,请调用

// Provided by VK_VERSION_1_0
VkResult vkCreateQueryPool(
    VkDevice                                    device,
    const VkQueryPoolCreateInfo*                pCreateInfo,
    const VkAllocationCallbacks*                pAllocator,
    VkQueryPool*                                pQueryPool);
  • device 是创建查询池的逻辑设备。

  • pCreateInfo 是指向 VkQueryPoolCreateInfo 结构的指针,其中包含池管理的查询数量和类型。

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

  • pQueryPool 是指向 VkQueryPool 句柄的指针,该句柄将返回生成的查询池对象。

有效用法
  • VUID-vkCreateQueryPool-device-09663
    device 必须支持至少一个具有 VK_QUEUE_VIDEO_ENCODE_BIT_KHRVK_QUEUE_VIDEO_DECODE_BIT_KHRVK_QUEUE_COMPUTE_BITVK_QUEUE_GRAPHICS_BIT 功能的队列族

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

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

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

  • VUID-vkCreateQueryPool-pQueryPool-parameter
    pQueryPool 必须是指向 VkQueryPool 句柄的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

VkQueryPoolCreateInfo 结构定义为

// Provided by VK_VERSION_1_0
typedef struct VkQueryPoolCreateInfo {
    VkStructureType                  sType;
    const void*                      pNext;
    VkQueryPoolCreateFlags           flags;
    VkQueryType                      queryType;
    uint32_t                         queryCount;
    VkQueryPipelineStatisticFlags    pipelineStatistics;
} VkQueryPoolCreateInfo;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 保留供将来使用。

  • queryType 是一个 VkQueryType 值,用于指定池管理的查询类型。

  • queryCount 是池管理的查询数量。

  • pipelineStatistics 是一个 VkQueryPipelineStatisticFlagBits 的位掩码,指定将在新池的查询中返回哪些计数器,如下面管线统计查询中所述。

如果 queryType 不是 VK_QUERY_TYPE_PIPELINE_STATISTICS,则忽略 pipelineStatistics

有效用法
  • VUID-VkQueryPoolCreateInfo-queryType-00791
    如果未启用 pipelineStatisticsQuery 功能,则 queryType 必须不是 VK_QUERY_TYPE_PIPELINE_STATISTICS

  • VUID-VkQueryPoolCreateInfo-meshShaderQueries-07068
    如果未启用meshShaderQueries特性,则 queryType **必须** 不能是 VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT

  • VUID-VkQueryPoolCreateInfo-meshShaderQueries-07069
    如果未启用meshShaderQueries特性,且 queryTypeVK_QUERY_TYPE_PIPELINE_STATISTICS,则 pipelineStatistics **必须** 不包含 VK_QUERY_PIPELINE_STATISTIC_TASK_SHADER_INVOCATIONS_BIT_EXTVK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT

  • VUID-VkQueryPoolCreateInfo-queryType-00792
    如果 queryTypeVK_QUERY_TYPE_PIPELINE_STATISTICS,则 pipelineStatistics **必须** 是 VkQueryPipelineStatisticFlagBits 值的有效组合

  • VUID-VkQueryPoolCreateInfo-queryType-09534
    如果 queryTypeVK_QUERY_TYPE_PIPELINE_STATISTICS,则 pipelineStatistics **必须** 不为零

  • VUID-VkQueryPoolCreateInfo-queryType-03222
    如果 queryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则 pNext 链 **必须** 包含 VkQueryPoolPerformanceCreateInfoKHR 结构体

  • VUID-VkQueryPoolCreateInfo-queryCount-02763
    queryCount **必须** 大于 0

  • VUID-VkQueryPoolCreateInfo-queryType-07133
    如果 queryTypeVK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR,则 pNext 链 **必须** 包含 VkVideoProfileInfoKHR 结构体,且该结构体的 videoCodecOperation 指定一个编码操作

  • VUID-VkQueryPoolCreateInfo-queryType-07906
    如果 queryTypeVK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR,则 pNext 链 **必须** 包含 VkQueryPoolVideoEncodeFeedbackCreateInfoKHR 结构体

  • VUID-VkQueryPoolCreateInfo-queryType-07907
    如果 queryTypeVK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR,且 pNext 链包含 VkVideoProfileInfoKHR 结构体和 VkQueryPoolVideoEncodeFeedbackCreateInfoKHR 结构体,则 VkQueryPoolVideoEncodeFeedbackCreateInfoKHR::encodeFeedbackFlags **必须** 不包含 VkVideoEncodeCapabilitiesKHR::supportedEncodeFeedbackFlags 中未设置的任何位,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR视频配置文件 返回,该视频配置文件由 VkVideoProfileInfoKHR 及其 pNext 链描述

  • VUID-VkQueryPoolCreateInfo-pNext-10248
    如果 pNext 链包含 VkVideoProfileInfoKHR 结构体,且其 videoCodecOperation 成员是 VK_VIDEO_CODEC_OPERATION_ENCODE_AV1_BIT_KHR,则 **必须** 启用 videoEncodeAV1 特性

有效用法(隐式)
// Provided by VK_VERSION_1_0
typedef VkFlags VkQueryPoolCreateFlags;

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

VkQueryPoolPerformanceCreateInfoKHR 结构体的定义如下

// Provided by VK_KHR_performance_query
typedef struct VkQueryPoolPerformanceCreateInfoKHR {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           queueFamilyIndex;
    uint32_t           counterIndexCount;
    const uint32_t*    pCounterIndices;
} VkQueryPoolPerformanceCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • queueFamilyIndex 是创建此性能查询池的队列族索引。

  • counterIndexCountpCounterIndices 数组的长度。

  • pCounterIndices 是指向索引数组的指针,该索引指向 vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR::pCounters 以在此性能查询池中启用。

有效用法
  • VUID-VkQueryPoolPerformanceCreateInfoKHR-queueFamilyIndex-03236
    queueFamilyIndex **必须** 是设备的有效队列族索引

  • VUID-VkQueryPoolPerformanceCreateInfoKHR-performanceCounterQueryPools-03237
    **必须** 启用 performanceCounterQueryPools 特性

  • VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-03321
    pCounterIndices 的每个元素 **必须** 在 vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHRqueueFamilyIndex 中指定的队列族报告的计数器范围内

有效用法(隐式)
  • VUID-VkQueryPoolPerformanceCreateInfoKHR-sType-sType
    sType **必须** 是 VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR

  • VUID-VkQueryPoolPerformanceCreateInfoKHR-pCounterIndices-parameter
    pCounterIndices **必须** 是指向 counterIndexCountuint32_t 值的数组的有效指针

  • VUID-VkQueryPoolPerformanceCreateInfoKHR-counterIndexCount-arraylength
    counterIndexCount **必须** 大于 0

要查询物理设备上查询性能查询池所需的通道数,请调用

// Provided by VK_KHR_performance_query
void vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR(
    VkPhysicalDevice                            physicalDevice,
    const VkQueryPoolPerformanceCreateInfoKHR*  pPerformanceQueryCreateInfo,
    uint32_t*                                   pNumPasses);
  • physicalDevice 是要查询其队列族性能查询计数器属性的物理设备的句柄。

  • pPerformanceQueryCreateInfo 是指向要创建的性能查询的 VkQueryPoolPerformanceCreateInfoKHR 的指针。

  • pNumPasses 是一个指向整数的指针,该整数与查询性能查询池所需的次数相关,如下所述。

pPerformanceQueryCreateInfo 成员 VkQueryPoolPerformanceCreateInfoKHR::queueFamilyIndex 必须physicalDevice 的队列族。 pPerformanceQueryCreateInfo 成员 VkQueryPoolPerformanceCreateInfoKHR::pCounters 中指定的计数器捕获所需的次数会在 pNumPasses 中返回。

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

  • VUID-vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR-pPerformanceQueryCreateInfo-parameter
    pPerformanceQueryCreateInfo 必须 是一个指向有效的 VkQueryPoolPerformanceCreateInfoKHR 结构的有效指针

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

要销毁一个查询池,请调用

// Provided by VK_VERSION_1_0
void vkDestroyQueryPool(
    VkDevice                                    device,
    VkQueryPool                                 queryPool,
    const VkAllocationCallbacks*                pAllocator);
  • device 是销毁查询池的逻辑设备。

  • queryPool 是要销毁的查询池。

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

有效用法
  • VUID-vkDestroyQueryPool-queryPool-00793
    所有引用 queryPool 的已提交命令必须已完成执行

  • VUID-vkDestroyQueryPool-queryPool-00794
    如果在创建 queryPool 时提供了 VkAllocationCallbacks,则此处必须提供兼容的回调集

  • VUID-vkDestroyQueryPool-queryPool-00795
    如果在创建 queryPool 时未提供 VkAllocationCallbacks,则 pAllocator 必须NULL

应用程序可以通过检查不带 VK_QUERY_RESULT_PARTIAL_BIT 标志的 vkGetQueryPoolResults() 对于在提交执行的命令缓冲区中使用的所有查询返回 VK_SUCCESS,来验证 queryPool 可以被销毁。

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

  • VUID-vkDestroyQueryPool-queryPool-parameter
    如果 queryPool 不是 VK_NULL_HANDLE,则 queryPool 必须是有效的 VkQueryPool 句柄

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

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

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

VkQueryPoolCreateInfo::queryType 的可能值,指定池管理的查询类型为

// Provided by VK_VERSION_1_0
typedef enum VkQueryType {
    VK_QUERY_TYPE_OCCLUSION = 0,
    VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,
    VK_QUERY_TYPE_TIMESTAMP = 2,
  // Provided by VK_KHR_video_queue
    VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR = 1000023000,
  // Provided by VK_EXT_transform_feedback
    VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT = 1000028004,
  // Provided by VK_KHR_performance_query
    VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR = 1000116000,
  // Provided by VK_KHR_acceleration_structure
    VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR = 1000150000,
  // Provided by VK_KHR_acceleration_structure
    VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR = 1000150001,
  // Provided by VK_NV_ray_tracing
    VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV = 1000165000,
  // Provided by VK_INTEL_performance_query
    VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL = 1000210000,
  // Provided by VK_KHR_video_encode_queue
    VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR = 1000299000,
  // Provided by VK_EXT_mesh_shader
    VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT = 1000328000,
  // Provided by VK_EXT_primitives_generated_query
    VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT = 1000382000,
  // Provided by VK_KHR_ray_tracing_maintenance1
    VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR = 1000386000,
  // Provided by VK_KHR_ray_tracing_maintenance1
    VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR = 1000386001,
  // Provided by VK_EXT_opacity_micromap
    VK_QUERY_TYPE_MICROMAP_SERIALIZATION_SIZE_EXT = 1000396000,
  // Provided by VK_EXT_opacity_micromap
    VK_QUERY_TYPE_MICROMAP_COMPACTED_SIZE_EXT = 1000396001,
} VkQueryType;

查询操作

为了使 VkCommandBuffer 记录查询管理命令,为其创建 VkCommandPool 的队列族必须支持适用于给定查询池的查询类型的相应操作类型(图形、计算)。

查询池中的每个查询都有一个状态,要么是不可用,要么是可用,并且还具有用于存储创建查询池时请求的查询操作的数值结果的状态。通过 vkCmdResetQueryPoolvkResetQueryPool 重置查询会将状态设置为不可用,并使数值结果未定义。通过 vkCmdEndQueryvkCmdEndQueryIndexedEXTvkCmdWriteTimestamp2vkCmdWriteTimestamp 的操作使查询可用。可用性状态和数值结果可以通过调用 vkGetQueryPoolResultsvkCmdCopyQueryPoolResults 来检索。

在查询池创建之后,每个查询都处于未初始化状态,并且在使用之前必须重置。查询在使用之间也必须重置。

如果逻辑设备包含多个物理设备,则每个写入查询的命令必须在单个物理设备上执行,并且任何对 vkCmdBeginQuery 的调用必须在同一物理设备上执行相应的 vkCmdEndQuery 命令。

要在队列上重置查询池中的一系列查询,请调用

// Provided by VK_VERSION_1_0
void vkCmdResetQueryPool(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery,
    uint32_t                                    queryCount);
  • commandBuffer 是将记录此命令的命令缓冲区。

  • queryPool 是管理正在重置的查询的查询池的句柄。

  • firstQuery 是要重置的初始查询索引。

  • queryCount 是要重置的查询数量。

当在队列上执行时,此命令将查询索引 [firstQuery, firstQuery + queryCount - 1] 的状态设置为不可用。

此命令定义了引用同一查询的其他查询命令之间的执行依赖关系。

第一个同步范围包括所有引用由firstQueryqueryCount指示的queryPool中的查询的命令,这些命令在提交顺序中较早出现。

第二个同步范围包括所有引用由firstQueryqueryCount指示的queryPool中的查询的命令,这些命令在提交顺序中较晚出现。

此命令的操作发生在第一个范围之后,并且发生在第二个范围之前。

如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则此命令会将查询索引 [firstQuery, firstQuery + queryCount - 1] 的状态设置为不可用,对于 queryPool 的每次pass,如调用 vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR 所指示。

由于 vkCmdResetQueryPool 会重置指定查询的所有pass,应用程序不能为使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR 创建的 queryPool 记录 vkCmdResetQueryPool 命令到需要多次提交的命令缓冲区中,如调用 vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR 所指示。否则,应用程序将永远无法完成记录的查询。

有效用法
  • VUID-vkCmdResetQueryPool-firstQuery-09436
    firstQuery 必须小于 queryPool 中的查询数量

  • VUID-vkCmdResetQueryPool-firstQuery-09437
    firstQueryqueryCount 的总和必须小于或等于 queryPool 中的查询数量

  • VUID-vkCmdResetQueryPool-None-02841
    该命令使用的所有查询必须未激活

  • VUID-vkCmdResetQueryPool-firstQuery-02862
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR 创建的,则此命令必须不能记录在直接或通过二级命令缓冲区也包含 [firstQuery, firstQuery + queryCount - 1] 查询集合的开始命令的命令缓冲区中

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

  • VUID-vkCmdResetQueryPool-queryPool-parameter
    queryPool 必须是一个有效的 VkQueryPool 句柄

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

  • VUID-vkCmdResetQueryPool-commandBuffer-cmdpool
    从中分配 commandBufferVkCommandPool 必须支持图形、计算、解码、编码或光流操作

  • VUID-vkCmdResetQueryPool-renderpass
    此命令必须仅在渲染通道实例之外调用

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

  • VUID-vkCmdResetQueryPool-commonparent
    commandBufferqueryPool必须已从相同的 VkDevice 创建、分配或检索

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

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

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

主要
次要

外部

外部

图形
计算
解码
编码
光流

操作

要在主机上重置查询池中的一系列查询,请调用

// Provided by VK_VERSION_1_2
void vkResetQueryPool(
    VkDevice                                    device,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery,
    uint32_t                                    queryCount);

或等效命令

// Provided by VK_EXT_host_query_reset
void vkResetQueryPoolEXT(
    VkDevice                                    device,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery,
    uint32_t                                    queryCount);
  • device 是拥有查询池的逻辑设备。

  • queryPool 是管理正在重置的查询的查询池的句柄。

  • firstQuery 是要重置的初始查询索引。

  • queryCount 是要重置的查询数量。

此命令将查询索引 [firstQuery, firstQuery + queryCount - 1] 的状态设置为不可用。

如果 queryPoolVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则此命令会将查询索引 [firstQuery, firstQuery + queryCount - 1] 的状态设置为对于每个 pass 都是不可用的。

有效用法
  • VUID-vkResetQueryPool-firstQuery-09436
    firstQuery 必须小于 queryPool 中的查询数量

  • VUID-vkResetQueryPool-firstQuery-09437
    firstQueryqueryCount 的总和必须小于或等于 queryPool 中的查询数量

  • VUID-vkResetQueryPool-None-02665
    hostQueryReset 特性必须启用

  • VUID-vkResetQueryPool-firstQuery-02741
    引用于 queryPoolfirstQueryqueryCount 指定的范围的已提交命令必须已完成执行

  • VUID-vkResetQueryPool-firstQuery-02742
    queryPool 中由 firstQueryqueryCount 指定的查询范围必须不在其他线程的 vkGetQueryPoolResultsvkResetQueryPool 调用中使用

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

  • VUID-vkResetQueryPool-queryPool-parameter
    queryPool 必须是一个有效的 VkQueryPool 句柄

  • VUID-vkResetQueryPool-queryPool-parent
    queryPool 必须已从 device 创建、分配或检索

一旦查询被重置并准备好使用,就可以向命令缓冲区发出查询命令。遮挡查询和管线统计查询分别计算事件——绘制的样本和管线阶段的调用——这些事件是由在指定的命令缓冲区内的 vkCmdBeginQuery 命令和 vkCmdEndQuery 命令之间记录的命令产生的,有效地限定了一组绘制和/或调度命令的范围。时间戳查询将时间戳写入查询池。性能查询将性能计数器记录到查询池。

查询必须在同一个命令缓冲区中开始和结束。但是,如果它是主命令缓冲区,并且启用了inheritedQueries特性,则在查询操作期间可以执行二级命令缓冲区。为了在查询活动期间执行二级命令缓冲区,它必须VkCommandBufferInheritanceInfoocclusionQueryEnablequeryFlags和/或pipelineStatistics成员设置为保守值,如命令缓冲区录制部分所述。查询必须在渲染通道实例的同一个子通道内开始和结束,或者必须在渲染通道实例之外开始和结束(即包含整个渲染通道实例)。

如果在启用了多视图的渲染通道实例执行期间使用查询,则查询在查询池中使用 N 个连续的查询索引(从 query 开始),其中 N 是查询所在子通道的视图掩码中设置的位数。查询的数值结果如何在查询之间分配取决于具体实现。例如,一些实现可能将每个视图的结果写入不同的查询,而其他实现可能将总结果写入第一个查询,并将零写入其他查询。但是,所有查询的结果总和必须准确反映所有视图的总查询结果。应用程序可以对所有查询的结果求和以计算总结果。

用于多视图渲染的查询必须不跨越子通道,即它们必须在同一个子通道中开始和结束。

查询必须在同一个视频编码范围之内开始和结束,或者必须在视频编码范围之外开始和结束,并且必须不包含整个视频编码范围。

要开始一个查询,请调用

// Provided by VK_VERSION_1_0
void vkCmdBeginQuery(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    query,
    VkQueryControlFlags                         flags);
  • commandBuffer 是将记录此命令的命令缓冲区。

  • queryPool 是将管理查询结果的查询池。

  • query 是查询池中将包含结果的查询索引。

  • flags 是一个 VkQueryControlFlagBits 的位掩码,指定可以执行的查询类型的约束。

如果池的 queryTypeVK_QUERY_TYPE_OCCLUSION 并且 flags 包含 VK_QUERY_CONTROL_PRECISE_BIT,则实现必须返回与实际传递的样本数匹配的结果。这在遮挡查询中有更详细的描述。

调用 vkCmdBeginQuery 等效于调用 vkCmdBeginQueryIndexedEXT,并将 index 参数设置为零。

开始查询后,该查询在其被调用的命令缓冲区内被认为是活动的,直到该查询结束为止。在执行二级命令缓冲区时,主命令缓冲区中活动的查询被认为对这些二级命令缓冲区是活动的。

此外,如果查询在视频编码范围之内启动,则为查询类型初始化以下命令缓冲区状态:

  • active_query_index 被设置为 query 指定的值。

  • last activatable query index 也被设置为 query 指定的值。

每个视频编码操作都会将结果存储到与当前活动查询索引对应的查询中,然后递增活动查询索引。如果活动查询索引递增超过了最后一个可激活查询索引,则发布任何进一步的视频编码操作将导致未定义的行为。

实际上,这意味着目前在开始和结束查询对之间必须发出不超过一个视频编码操作。

此命令定义了引用同一查询的其他查询命令之间的执行依赖关系。

第一个 同步范围 包括在 提交顺序 中较早出现的所有引用 query 指示的 queryPool 中的查询的命令。

第二个 同步范围 包括在 提交顺序 中较晚出现的所有引用 query 指示的 queryPool 中的查询的命令。

此命令的操作发生在第一个范围之后,并且发生在第二个范围之前。

有效用法
  • VUID-vkCmdBeginQuery-None-00807
    该命令使用的所有查询必须不可用

  • VUID-vkCmdBeginQuery-queryType-02804
    用于创建 queryPoolqueryType 必须不是 VK_QUERY_TYPE_TIMESTAMP

  • VUID-vkCmdBeginQuery-queryType-04728
    用于创建 queryPoolqueryType 必须不是 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHRVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR

  • VUID-vkCmdBeginQuery-queryType-06741
    用于创建 queryPoolqueryType 必须不是 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHRVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR

  • VUID-vkCmdBeginQuery-queryType-04729
    用于创建 queryPoolqueryType 必须不是 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV

  • VUID-vkCmdBeginQuery-queryType-00800
    如果未启用 occlusionQueryPrecise 特性,或者用于创建 queryPoolqueryType 不是 VK_QUERY_TYPE_OCCLUSION,则 flags 必须不包含 VK_QUERY_CONTROL_PRECISE_BIT

  • VUID-vkCmdBeginQuery-query-00802
    query 必须小于 queryPool 中的查询数

  • VUID-vkCmdBeginQuery-queryType-00803
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_OCCLUSION,则分配 commandBufferVkCommandPool 必须支持图形操作

  • VUID-vkCmdBeginQuery-queryType-00804
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PIPELINE_STATISTICS 并且任何 pipelineStatistics 指示图形操作,则分配 commandBufferVkCommandPool 必须支持图形操作

  • VUID-vkCmdBeginQuery-queryType-00805
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PIPELINE_STATISTICS 并且任何 pipelineStatistics 指示计算操作,则分配 commandBufferVkCommandPool 必须支持计算操作。

  • VUID-vkCmdBeginQuery-commandBuffer-01885
    commandBuffer 不能是受保护的命令缓冲区。

  • VUID-vkCmdBeginQuery-query-00808
    如果在渲染过程实例中调用,则 query 和当前子过程的视图掩码中设置的位数之和必须小于或等于 queryPool 中的查询数量。

  • VUID-vkCmdBeginQuery-queryType-07126
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR,则分配 commandBufferVkCommandPool 必须已使用支持结果状态查询的队列族索引创建,如 VkQueueFamilyQueryResultStatusPropertiesKHR::queryResultStatusSupport 所示。

  • VUID-vkCmdBeginQuery-None-07127
    如果存在绑定的视频会话,则必须没有 活跃 查询。

  • VUID-vkCmdBeginQuery-None-08370
    如果存在绑定的视频会话,则它不能使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 创建。

  • VUID-vkCmdBeginQuery-queryType-07128
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR 并且存在绑定的视频会话,则 queryPool 必须已使用包含在 VkQueryPoolCreateInfopNext 链中的 VkVideoProfileInfoKHR 结构创建,该结构与创建绑定视频会话时在 VkVideoSessionCreateInfoKHR::pVideoProfile 中指定的结构相同。

  • VUID-vkCmdBeginQuery-queryType-07129
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR,则必须存在绑定的视频会话。

  • VUID-vkCmdBeginQuery-queryType-07130
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR 并且存在绑定的视频会话,则 queryPool 必须已使用包含在 VkQueryPoolCreateInfopNext 链中的 VkVideoProfileInfoKHR 结构创建,该结构与创建绑定视频会话时在 VkVideoSessionCreateInfoKHR::pVideoProfile 中指定的结构相同。

  • VUID-vkCmdBeginQuery-queryType-07131
    如果用于创建 queryPoolqueryType 不是 VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHRVK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR,则必须没有绑定的视频会话。

  • VUID-vkCmdBeginQuery-queryPool-01922
    queryPool 必须已使用与 commandBuffer 中任何 活跃 查询的 queryType 不同的 queryType 创建。

  • VUID-vkCmdBeginQuery-queryType-07070
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT,则分配 commandBufferVkCommandPool 必须支持图形操作。

  • VUID-vkCmdBeginQuery-queryType-02327
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT,则分配 commandBufferVkCommandPool 必须支持图形操作。

  • VUID-vkCmdBeginQuery-queryType-02328
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT,则必须支持 VkPhysicalDeviceTransformFeedbackPropertiesEXT::transformFeedbackQueries

  • VUID-vkCmdBeginQuery-queryType-06687
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,则分配 commandBufferVkCommandPool 必须支持图形操作。

  • VUID-vkCmdBeginQuery-queryType-06688
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,则必须启用 primitivesGeneratedQuery

  • VUID-vkCmdBeginQuery-queryPool-07289
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建的,则创建 queryPoolVkQueryPoolPerformanceCreateInfoKHR::queueFamilyIndex 必须等于分配 commandBufferVkCommandPool 的队列族索引。

  • VUID-vkCmdBeginQuery-queryPool-03223
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建的,则必须在对 commandBuffer 调用 vkBeginCommandBuffer 之前持有性能分析锁

  • VUID-vkCmdBeginQuery-queryPool-03224
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建的,并且用于创建 queryPool 的计数器之一是 VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR,则查询开始必须commandBuffer 中记录的第一个命令。

  • VUID-vkCmdBeginQuery-queryPool-03225
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建的,并且用于创建 queryPool 的计数器之一是 VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR,则开始命令不能在渲染过程实例中记录。

  • VUID-vkCmdBeginQuery-queryPool-03226
    如果使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建了 queryPool,并且在 commandBuffer、其父级主命令缓冲区或记录在与 commandBuffer 相同的父级主命令缓冲区内的二级命令缓冲区中使用了另一个 queryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR 的查询池,则必须启用 performanceCounterMultipleQueryPools 功能。

  • VUID-vkCmdBeginQuery-None-02863
    如果使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建了 queryPool,则此命令不能记录在直接或通过二级命令缓冲区也包含影响同一查询的 vkCmdResetQueryPool 命令的命令缓冲区中。

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

  • VUID-vkCmdBeginQuery-queryPool-parameter
    queryPool 必须是一个有效的 VkQueryPool 句柄

  • VUID-vkCmdBeginQuery-flags-parameter
    flags 必须VkQueryControlFlagBits 值的有效组合。

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

  • VUID-vkCmdBeginQuery-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形、计算、解码或编码操作。

  • VUID-vkCmdBeginQuery-commonparent
    commandBufferqueryPool必须已从相同的 VkDevice 创建、分配或检索

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

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

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

主要
次要

两者

两者

图形
计算
解码
编码

操作
状态

要开始索引查询,请调用

// Provided by VK_EXT_transform_feedback
void vkCmdBeginQueryIndexedEXT(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    query,
    VkQueryControlFlags                         flags,
    uint32_t                                    index);
  • commandBuffer 是将记录此命令的命令缓冲区。

  • queryPool 是将管理查询结果的查询池。

  • query 是查询池中将包含结果的查询索引。

  • flags 是一个 VkQueryControlFlagBits 的位掩码,指定可以执行的查询类型的约束。

  • index 是特定于查询类型的索引。当查询类型为 VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXTVK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT 时,索引表示顶点流。

vkCmdBeginQueryIndexedEXT 命令的操作与 vkCmdBeginQuery 命令相同,只是它还接受特定于查询类型的 index 参数。

此命令定义了引用同一查询索引的其他查询命令之间的执行依赖关系。

第一个同步范围包括在提交顺序中较早出现的所有引用 queryPool 中由 queryindex 指示的查询的命令。

第二个同步范围包括在提交顺序中较晚出现的所有引用 queryPool 中由 queryindex 指示的查询的命令。

此命令的操作发生在第一个范围之后,并且发生在第二个范围之前。

有效用法
  • VUID-vkCmdBeginQueryIndexedEXT-None-00807
    该命令使用的所有查询必须不可用

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-02804
    用于创建 queryPoolqueryType 必须不是 VK_QUERY_TYPE_TIMESTAMP

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-04728
    用于创建 queryPoolqueryType 必须不是 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHRVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-06741
    用于创建 queryPoolqueryType 必须不是 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHRVK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-04729
    用于创建 queryPoolqueryType 必须不是 VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-00800
    如果未启用 occlusionQueryPrecise 特性,或者用于创建 queryPoolqueryType 不是 VK_QUERY_TYPE_OCCLUSION,则 flags 必须不包含 VK_QUERY_CONTROL_PRECISE_BIT

  • VUID-vkCmdBeginQueryIndexedEXT-query-00802
    query 必须小于 queryPool 中的查询数

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-00803
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_OCCLUSION,则分配 commandBufferVkCommandPool 必须支持图形操作

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-00804
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PIPELINE_STATISTICS 并且任何 pipelineStatistics 指示图形操作,则分配 commandBufferVkCommandPool 必须支持图形操作

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-00805
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PIPELINE_STATISTICS 并且任何 pipelineStatistics 指示计算操作,则分配 commandBufferVkCommandPool 必须支持计算操作。

  • VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-01885
    commandBuffer 不能是受保护的命令缓冲区。

  • VUID-vkCmdBeginQueryIndexedEXT-query-00808
    如果在渲染过程实例中调用,则 query 和当前子过程的视图掩码中设置的位数之和必须小于或等于 queryPool 中的查询数量。

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-07126
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR,则分配 commandBufferVkCommandPool 必须已使用支持结果状态查询的队列族索引创建,如 VkQueueFamilyQueryResultStatusPropertiesKHR::queryResultStatusSupport 所示。

  • VUID-vkCmdBeginQueryIndexedEXT-None-07127
    如果存在绑定的视频会话,则必须没有 活跃 查询。

  • VUID-vkCmdBeginQueryIndexedEXT-None-08370
    如果存在绑定的视频会话,则它不能使用 VK_VIDEO_SESSION_CREATE_INLINE_QUERIES_BIT_KHR 创建。

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-07128
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR 并且存在绑定的视频会话,则 queryPool 必须已使用包含在 VkQueryPoolCreateInfopNext 链中的 VkVideoProfileInfoKHR 结构创建,该结构与创建绑定视频会话时在 VkVideoSessionCreateInfoKHR::pVideoProfile 中指定的结构相同。

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-07129
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR,则必须存在绑定的视频会话。

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-07130
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR 并且存在绑定的视频会话,则 queryPool 必须已使用包含在 VkQueryPoolCreateInfopNext 链中的 VkVideoProfileInfoKHR 结构创建,该结构与创建绑定视频会话时在 VkVideoSessionCreateInfoKHR::pVideoProfile 中指定的结构相同。

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-07131
    如果用于创建 queryPoolqueryType 不是 VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHRVK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR,则必须没有绑定的视频会话。

  • VUID-vkCmdBeginQueryIndexedEXT-queryPool-04753
    如果 queryPool 是使用与 commandBuffer 中另一个 活动 查询相同的 queryType 创建的,则 index 不能与活动查询使用的索引匹配。

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-02338
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT,则分配 commandBufferVkCommandPool 必须支持图形操作。

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-02339
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT,则 index 参数必须小于 VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackStreams

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-06692
    如果用于创建 queryPoolqueryType 不是 VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT 且不是 VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,则 index 必须为零。

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-06689
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,则分配 commandBufferVkCommandPool 必须支持图形操作。

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-06690
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,则 index 参数必须小于 VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackStreams

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-06691
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,并且 primitivesGeneratedQueryWithNonZeroStreams 功能未启用,则 index 参数必须为零。

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-06693
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,则必须启用 primitivesGeneratedQuery

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-02341
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT,则必须支持 VkPhysicalDeviceTransformFeedbackPropertiesEXT::transformFeedbackQueries

  • VUID-vkCmdBeginQueryIndexedEXT-queryType-07071
    用于创建 queryPoolqueryType 必须不是 VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT

  • VUID-vkCmdBeginQueryIndexedEXT-queryPool-07289
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建的,则创建 queryPoolVkQueryPoolPerformanceCreateInfoKHR::queueFamilyIndex 必须等于分配 commandBufferVkCommandPool 的队列族索引。

  • VUID-vkCmdBeginQueryIndexedEXT-queryPool-03223
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建的,则必须在对 commandBuffer 调用 vkBeginCommandBuffer 之前持有性能分析锁

  • VUID-vkCmdBeginQueryIndexedEXT-queryPool-03224
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建的,并且用于创建 queryPool 的计数器之一是 VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR,则查询开始必须commandBuffer 中记录的第一个命令。

  • VUID-vkCmdBeginQueryIndexedEXT-queryPool-03225
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建的,并且用于创建 queryPool 的计数器之一是 VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR,则开始命令不能在渲染过程实例中记录。

  • VUID-vkCmdBeginQueryIndexedEXT-queryPool-03226
    如果使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建了 queryPool,并且在 commandBuffer、其父级主命令缓冲区或记录在与 commandBuffer 相同的父级主命令缓冲区内的二级命令缓冲区中使用了另一个 queryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR 的查询池,则必须启用 performanceCounterMultipleQueryPools 功能。

  • VUID-vkCmdBeginQueryIndexedEXT-None-02863
    如果使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建了 queryPool,则此命令不能记录在直接或通过二级命令缓冲区也包含影响同一查询的 vkCmdResetQueryPool 命令的命令缓冲区中。

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

  • VUID-vkCmdBeginQueryIndexedEXT-queryPool-parameter
    queryPool 必须是一个有效的 VkQueryPool 句柄

  • VUID-vkCmdBeginQueryIndexedEXT-flags-parameter
    flags 必须VkQueryControlFlagBits 值的有效组合。

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

  • VUID-vkCmdBeginQueryIndexedEXT-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形、计算、解码或编码操作。

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

  • VUID-vkCmdBeginQueryIndexedEXT-commonparent
    commandBufferqueryPool必须已从相同的 VkDevice 创建、分配或检索

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

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

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

主要
次要

两者

外部

图形
计算
解码
编码

操作
状态

vkCmdBeginQuery::flags可以设置的位,用于指定可以执行的查询类型的约束,如下所示:

// Provided by VK_VERSION_1_0
typedef enum VkQueryControlFlagBits {
    VK_QUERY_CONTROL_PRECISE_BIT = 0x00000001,
} VkQueryControlFlagBits;
  • VK_QUERY_CONTROL_PRECISE_BIT 指定 遮挡查询的精度。

// Provided by VK_VERSION_1_0
typedef VkFlags VkQueryControlFlags;

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

要在执行完所需的绘制或分派命令集后结束查询,请调用

// Provided by VK_VERSION_1_0
void vkCmdEndQuery(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    query);
  • commandBuffer 是将记录此命令的命令缓冲区。

  • queryPool 是管理查询结果的查询池。

  • query 是查询池中存储结果的查询索引。

此命令完成 queryPool 中由 query 标识的查询,并将其标记为可用。

此命令定义了引用同一查询的其他查询命令之间的执行依赖关系。

第一个 同步范围 包括在 提交顺序 中较早出现的所有引用 query 指示的 queryPool 中的查询的命令。

第二个 同步范围 仅包含此命令的操作。

调用 vkCmdEndQuery 等效于调用 vkCmdEndQueryIndexedEXT 并将 index 参数设置为零。

有效用法
  • VUID-vkCmdEndQuery-None-01923
    该命令使用的所有查询必须活动的

  • VUID-vkCmdEndQuery-query-00810
    query 必须小于 queryPool 中的查询数

  • VUID-vkCmdEndQuery-commandBuffer-01886
    commandBuffer 不能是受保护的命令缓冲区。

  • VUID-vkCmdEndQuery-query-00812
    如果在渲染过程实例中调用 vkCmdEndQuery,则 query 和当前子过程的视图掩码中设置的位数之和必须小于或等于 queryPool 中的查询数量。

  • VUID-vkCmdEndQuery-queryPool-03227
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建的,并且用于创建 queryPool 的一个或多个计数器是 VK_PERFORMANCE_COUNTER_SCOPE_COMMAND_BUFFER_KHR,则 vkCmdEndQuery 必须commandBuffer 中记录的最后一个命令。

  • VUID-vkCmdEndQuery-queryPool-03228
    如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHRqueryType 创建的,并且用于创建 queryPool 的一个或多个计数器是 VK_PERFORMANCE_COUNTER_SCOPE_RENDER_PASS_KHR,则 vkCmdEndQuery 必须不能在渲染过程实例中记录。

  • VUID-vkCmdEndQuery-None-07007
    如果在渲染过程实例的子过程中调用,则相应的 vkCmdBeginQuery* 命令必须已在同一子过程内先前调用过。

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

  • VUID-vkCmdEndQuery-queryPool-parameter
    queryPool 必须是一个有效的 VkQueryPool 句柄

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

  • VUID-vkCmdEndQuery-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形、计算、解码或编码操作。

  • VUID-vkCmdEndQuery-commonparent
    commandBufferqueryPool必须已从相同的 VkDevice 创建、分配或检索

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

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

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

主要
次要

两者

两者

图形
计算
解码
编码

操作
状态

要在记录完所需的绘制或分派命令集后结束索引查询,请调用

// Provided by VK_EXT_transform_feedback
void vkCmdEndQueryIndexedEXT(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    query,
    uint32_t                                    index);
  • commandBuffer 是将记录此命令的命令缓冲区。

  • queryPool 是管理查询结果的查询池。

  • query 是查询池中存储结果的查询索引。

  • index 是查询类型特定的索引。

此命令完成 queryPool 中由 queryindex 标识的查询,并将其标记为可用。

vkCmdEndQueryIndexedEXT 命令的操作与 vkCmdEndQuery 命令相同,只不过它还接受一个查询类型特定的 index 参数。

此命令定义了引用同一查询索引的其他查询命令之间的执行依赖关系。

第一个 同步范围 包括在 提交顺序 中较早出现的所有引用 query 指示的 queryPool 中的查询的命令。

第二个 同步范围 仅包含此命令的操作。

有效用法
  • VUID-vkCmdEndQueryIndexedEXT-None-02342
    该命令使用的所有查询必须活动的

  • VUID-vkCmdEndQueryIndexedEXT-query-02343
    query 必须小于 queryPool 中的查询数

  • VUID-vkCmdEndQueryIndexedEXT-commandBuffer-02344
    commandBuffer 不能是受保护的命令缓冲区。

  • VUID-vkCmdEndQueryIndexedEXT-query-02345
    如果在渲染过程实例中调用 vkCmdEndQueryIndexedEXT,则 query 和当前子过程的视图掩码中设置的位数之和必须小于或等于 queryPool 中的查询数量。

  • VUID-vkCmdEndQueryIndexedEXT-queryType-06694
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXTVK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,则 index 参数必须小于 VkPhysicalDeviceTransformFeedbackPropertiesEXT::maxTransformFeedbackStreams

  • VUID-vkCmdEndQueryIndexedEXT-queryType-06695
    如果用于创建 queryPoolqueryType 不是 VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT 且不是 VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,则 index 必须为零。

  • VUID-vkCmdEndQueryIndexedEXT-queryType-06696
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXTVK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT,则 index 必须等于开始查询时使用的 index

  • VUID-vkCmdEndQueryIndexedEXT-None-07007
    如果在渲染过程实例的子过程中调用,则相应的 vkCmdBeginQuery* 命令必须已在同一子过程内先前调用过。

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

  • VUID-vkCmdEndQueryIndexedEXT-queryPool-parameter
    queryPool 必须是一个有效的 VkQueryPool 句柄

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

  • VUID-vkCmdEndQueryIndexedEXT-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须支持图形、计算、解码或编码操作。

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

  • VUID-vkCmdEndQueryIndexedEXT-commonparent
    commandBufferqueryPool必须已从相同的 VkDevice 创建、分配或检索

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

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

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

主要
次要

两者

外部

图形
计算
解码
编码

操作
状态

应用程序可以通过请求将结果写入应用程序提供的内存,或通过请求将其复制到 VkBuffer 中来检索结果。无论哪种情况,内存中的布局都定义如下:

  • 第一个查询的结果从命令请求的第一个字节开始写入,每个后续查询的结果从 stride 字节之后开始。

  • 遮挡查询、管线统计查询、变换反馈查询、图元生成查询、网格着色器查询、视频编码反馈查询和时间戳查询将结果存储在紧密排列的无符号整数数组中,可以是 32 位或 64 位,具体取决于命令的请求,存储数值结果,并且如果请求了可用性状态,也会存储该状态。

  • 性能查询将结果存储在紧密排列的数组中,其类型由相应 VkPerformanceCounterKHRunit 成员确定。

  • 如果使用了 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT,则每个查询结果的最后一个元素是一个整数,指示查询结果是否可用,任何非零值都表示可用。

  • 如果使用了 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR,则每个查询结果的最后一个元素是一个整数值,指示查询结果的状态。正值表示成功,负值表示失败,0 表示结果尚未可用。特定的错误代码编码在 VkQueryResultStatusKHR 枚举中。

  • 遮挡查询写入一个整数值 - 通过的样本数。管线统计查询为创建池时在 pipelineStatistics 中启用的每个位写入一个整数值,并且统计值按照从最低有效位开始的位顺序写入。时间戳查询写入一个整数值。性能查询为查询中的每个 VkPerformanceCounterKHR 写入一个 VkPerformanceCounterResultKHR 值。变换反馈查询写入两个整数;第一个整数是成功写入相应变换反馈缓冲区的图元数量,第二个是输出到顶点流的图元数量,无论它们是否被成功捕获。换句话说,如果变换反馈缓冲区的大小对于顶点流输出的图元数量来说太小,则第一个整数表示实际写入的图元数量,第二个是如果与该顶点流关联的所有变换反馈缓冲区足够大,则应该写入的图元数量。图元生成查询写入输出到顶点流的图元数量,无论变换反馈是否处于活动状态,或者它们是否被变换反馈成功捕获。如果变换反馈处于活动状态,则这与变换反馈查询的第二个整数相同。网格着色器查询写入一个整数。视频编码反馈查询为创建池时在 VkQueryPoolVideoEncodeFeedbackCreateInfoKHR::encodeFeedbackFlags 中启用的每个位写入一个或多个整数值,并且反馈值按照从最低有效位开始的位顺序写入,如此处所述。

  • 如果检索了多个查询,并且 stride 不至少与单个查询对应的值数组的大小一样大,则写入内存的值是未定义的

要检索一组查询的状态和结果,请调用

// Provided by VK_VERSION_1_0
VkResult vkGetQueryPoolResults(
    VkDevice                                    device,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery,
    uint32_t                                    queryCount,
    size_t                                      dataSize,
    void*                                       pData,
    VkDeviceSize                                stride,
    VkQueryResultFlags                          flags);
  • device 是拥有查询池的逻辑设备。

  • queryPool 是管理包含所需结果的查询的查询池。

  • firstQuery 是初始查询索引。

  • queryCount 是要读取的查询数量。

  • dataSizepData 指向的缓冲区的大小(以字节为单位)。

  • pData 是指向应用程序分配的缓冲区的指针,结果将写入其中。

  • stridepData 中各个查询的结果之间的步幅(以字节为单位)。

  • flagsVkQueryResultFlagBits 的位掩码,指定如何以及何时返回结果。

为查询写入的任何结果都根据 依赖于查询类型的布局写入。

如果在 flags 中未设置任何位,并且所有请求的查询都处于可用状态,则结果将写入为 32 位无符号整数值的数组。当并非所有查询都可用时的行为将在 下方描述。

如果设置了 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT,则 queryPool 中由 firstQueryqueryCount 标识的所有查询的结果都会复制到 pData,并在每个查询的结果之后直接写入一个额外的可用性或状态值,并将其解释为无符号整数。值为零表示结果尚不可用,否则查询已完成,并且结果可用。如果 flags 中设置了 VK_QUERY_RESULT_64_BIT,则可用性或状态值的大小为 64 位。否则,它为 32 位。

如果设置了 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR,则由 firstQueryqueryCount 标识的 queryPool 中所有查询的结果,以及紧随每个查询结果之后写入的额外状态值(解释为有符号整数),都会被复制到 pData 中。值为零表示结果尚不可用。正值表示查询内的操作已成功完成,并且查询结果有效。负值表示查询内的操作未成功完成。

VkQueryResultStatusKHR 定义了此处返回的值的具体含义,但实现可以自由返回其他值。

如果写入的状态值为负数,表示查询内的操作未成功完成,则此命令写入的所有其他结果都是未定义的,除非为所用查询类型的任何结果另有规定。

如果设置了 VK_QUERY_RESULT_WITH_AVAILABILITY_BITVK_QUERY_RESULT_WITH_STATUS_BIT_KHR,则缓冲区中数据的布局是每个返回的查询的 (结果,可用性)(结果,状态) 对,而 stride 是每对之间的步幅。

此命令写入的任何可用查询的结果都是最终的,表示查询的最终结果。如果设置了 VK_QUERY_RESULT_PARTIAL_BIT,那么对于任何不可用的查询,都会为该查询写入介于零和最终结果值之间的中间结果。否则,此命令写入的任何结果都是未定义的。

如果设置了 VK_QUERY_RESULT_64_BIT,则所有查询的结果以及返回的可用性或状态值都将作为 64 位值的数组写入。如果使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR 创建了 queryPool,则每个查询的结果都将作为 VkPerformanceCounterKHR::storage 指示的类型数组写入,用于被查询的计数器。否则,结果和可用性或状态值将作为 32 位值的数组写入。如果无符号整数查询的值溢出结果类型,则该值可能会回绕或饱和。如果启用了 maintenance7 功能,则对于无符号整数查询,32 位结果值必须等于等效的 64 位结果值的最低有效 32 位。如果有符号整数查询的值溢出结果类型,则该值是未定义的。如果浮点查询的值无法表示为结果类型,则该值是未定义的。

如果设置了 VK_QUERY_RESULT_WAIT_BIT,则此命令定义与任何较早写入其中一个已识别查询的命令的执行依赖关系。第一个同步范围包括引用 queryPool 中由 firstQueryqueryCount 指示的任何查询的 vkCmdEndQueryvkCmdEndQueryIndexedEXTvkCmdWriteTimestamp2vkCmdWriteTimestamp 的所有实例。第二个同步范围包括此命令的主机操作。

如果未设置 VK_QUERY_RESULT_WAIT_BIT,如果存在处于不可用状态的查询,则 vkGetQueryPoolResults 可能返回 VK_NOT_READY

应用程序必须注意确保使用 VK_QUERY_RESULT_WAIT_BIT 位具有所需的效果。

例如,如果之前使用过查询,并且命令缓冲区记录了该查询的命令 vkCmdResetQueryPoolvkCmdBeginQueryvkCmdEndQuery,则该查询将保持可用状态,直到调用 vkResetQueryPool 或在队列上执行 vkCmdResetQueryPool 命令。应用程序可以使用栅栏或事件来确保在检查其结果或可用性状态之前,查询已经重置。否则,可能会从上次使用该查询返回过时的值。

VK_QUERY_RESULT_WAIT_BITVK_QUERY_RESULT_WITH_AVAILABILITY_BIT 结合使用时,以上情况也适用。在这种情况下,返回的可用性状态可能反映上次使用查询的结果,除非自上次使用查询以来已调用 vkResetQueryPool 或已执行 vkCmdResetQueryPool 命令。

使用 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR 标志也会出现类似的情况。

应用程序可以使用双缓冲查询池,每个帧一个池,并在读取查询的帧末尾重置查询。

有效用法
  • VUID-vkGetQueryPoolResults-firstQuery-09436
    firstQuery 必须小于 queryPool 中的查询数量

  • VUID-vkGetQueryPoolResults-firstQuery-09437
    firstQueryqueryCount 的总和必须小于或等于 queryPool 中的查询数量

  • VUID-vkGetQueryPoolResults-queryCount-09438
    如果 queryCount 大于 1,则 stride 必须不为零

  • VUID-vkGetQueryPoolResults-queryType-09439
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_TIMESTAMP,则 flags 必须不包含 VK_QUERY_RESULT_PARTIAL_BIT

  • VUID-vkGetQueryPoolResults-queryType-09440
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则 flags 必须不包含 VK_QUERY_RESULT_WITH_AVAILABILITY_BITVK_QUERY_RESULT_WITH_STATUS_BIT_KHRVK_QUERY_RESULT_PARTIAL_BITVK_QUERY_RESULT_64_BIT

  • VUID-vkGetQueryPoolResults-queryType-09441
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则 queryPool 必须已针对每次传递记录一次,并通过调用 vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR 检索。

  • VUID-vkGetQueryPoolResults-queryType-09442
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR,则 flags 必须包含 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR

  • VUID-vkGetQueryPoolResults-flags-09443
    如果 flags 包含 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR,则它必须不包含 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT

  • VUID-vkGetQueryPoolResults-None-09401
    该命令使用的所有查询必须未初始化

  • VUID-vkGetQueryPoolResults-flags-02828
    如果 flags 中未设置 VK_QUERY_RESULT_64_BIT,并且用于创建 queryPoolqueryType 不是 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则 pDatastride 必须4 的倍数。

  • VUID-vkGetQueryPoolResults-flags-00815
    如果 flags 中设置了 VK_QUERY_RESULT_64_BIT,则 pDatastride 必须8 的倍数。

  • VUID-vkGetQueryPoolResults-stride-08993
    如果设置了 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT,则 stride 必须足够大,除了查询结果外,还包含表示可用性或状态的无符号整数。

  • VUID-vkGetQueryPoolResults-queryType-03229
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则 pDatastride 必须VkPerformanceCounterResultKHR 大小的倍数。

  • VUID-vkGetQueryPoolResults-queryType-04519
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则 stride 必须足够大,以包含用于创建 queryPoolVkQueryPoolPerformanceCreateInfoKHR::counterIndexCount 乘以 VkPerformanceCounterResultKHR 的大小。

  • VUID-vkGetQueryPoolResults-dataSize-00817
    dataSize 必须足够大,以包含每个查询的结果,如此处所述。

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

  • VUID-vkGetQueryPoolResults-queryPool-parameter
    queryPool 必须是一个有效的 VkQueryPool 句柄

  • VUID-vkGetQueryPoolResults-pData-parameter
    pData 必须是指向 dataSize 字节数组的有效指针。

  • VUID-vkGetQueryPoolResults-flags-parameter
    flags 必须VkQueryResultFlagBits 值的有效组合。

  • VUID-vkGetQueryPoolResults-dataSize-arraylength
    dataSize 必须大于 0

  • VUID-vkGetQueryPoolResults-queryPool-parent
    queryPool 必须已从 device 创建、分配或检索

返回代码
成功
  • VK_SUCCESS

  • VK_NOT_READY

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_ERROR_OUT_OF_DEVICE_MEMORY

  • VK_ERROR_DEVICE_LOST

以下位可以在 vkGetQueryPoolResults::flagsvkCmdCopyQueryPoolResults::flags 中设置,用于指定如何以及何时返回结果:

// Provided by VK_VERSION_1_0
typedef enum VkQueryResultFlagBits {
    VK_QUERY_RESULT_64_BIT = 0x00000001,
    VK_QUERY_RESULT_WAIT_BIT = 0x00000002,
    VK_QUERY_RESULT_WITH_AVAILABILITY_BIT = 0x00000004,
    VK_QUERY_RESULT_PARTIAL_BIT = 0x00000008,
  // Provided by VK_KHR_video_queue
    VK_QUERY_RESULT_WITH_STATUS_BIT_KHR = 0x00000010,
} VkQueryResultFlagBits;
  • VK_QUERY_RESULT_64_BIT 指定结果将作为 64 位无符号整数值数组写入。如果未设置此位,结果将作为 32 位无符号整数值数组写入。

  • VK_QUERY_RESULT_WAIT_BIT 指定 Vulkan 将等待每个查询的状态变为可用,然后检索其结果。

  • VK_QUERY_RESULT_WITH_AVAILABILITY_BIT 指定可用性状态伴随结果一起返回。

  • VK_QUERY_RESULT_PARTIAL_BIT 指定接受返回部分结果。

  • VK_QUERY_RESULT_WITH_STATUS_BIT_KHR 指定查询中返回的最后一个值是 VkQueryResultStatusKHR 值。有关应用程序如何确定是否支持使用此标志位的信息,请参阅结果状态查询

// Provided by VK_VERSION_1_0
typedef VkFlags VkQueryResultFlags;

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

以下是查询可以返回的特定状态代码:

// Provided by VK_KHR_video_queue
typedef enum VkQueryResultStatusKHR {
    VK_QUERY_RESULT_STATUS_ERROR_KHR = -1,
    VK_QUERY_RESULT_STATUS_NOT_READY_KHR = 0,
    VK_QUERY_RESULT_STATUS_COMPLETE_KHR = 1,
  // Provided by VK_KHR_video_encode_queue
    VK_QUERY_RESULT_STATUS_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_KHR = -1000299000,
} VkQueryResultStatusKHR;
  • VK_QUERY_RESULT_STATUS_NOT_READY_KHR 指定查询结果尚不可用。

  • VK_QUERY_RESULT_STATUS_ERROR_KHR 指定操作未成功完成。

  • VK_QUERY_RESULT_STATUS_COMPLETE_KHR 指定操作已成功完成,并且查询结果可用。

  • VK_QUERY_RESULT_STATUS_INSUFFICIENT_BITSTREAM_BUFFER_RANGE_KHR 指定由于目标视频比特流缓冲区的范围不足以容纳编码后的比特流数据,导致视频编码操作未成功完成。

要将查询状态和数值结果直接复制到缓冲区内存,请调用

// Provided by VK_VERSION_1_0
void vkCmdCopyQueryPoolResults(
    VkCommandBuffer                             commandBuffer,
    VkQueryPool                                 queryPool,
    uint32_t                                    firstQuery,
    uint32_t                                    queryCount,
    VkBuffer                                    dstBuffer,
    VkDeviceSize                                dstOffset,
    VkDeviceSize                                stride,
    VkQueryResultFlags                          flags);
  • commandBuffer 是将记录此命令的命令缓冲区。

  • queryPool 是管理包含所需结果的查询的查询池。

  • firstQuery 是初始查询索引。

  • queryCount 是查询的数量。firstQueryqueryCount 一起定义一个查询范围。

  • dstBuffer 是一个 VkBuffer 对象,它将接收复制命令的结果。

  • dstOffsetdstBuffer 中的偏移量。

  • stridedstBuffer 中各个查询结果之间的字节步幅。dstBuffer 的后备内存所需大小的确定方式与上述 vkGetQueryPoolResults 的描述相同。

  • flagsVkQueryResultFlagBits 的位掩码,指定如何以及何时返回结果。

为查询写入的任何结果都根据 依赖于查询类型的布局写入。

对于 queryPool 中由 firstQueryqueryCount 标识的任何可用查询的结果,都会复制到 dstBuffer 中。

如果设置了 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT,则 queryPool 中由 firstQueryqueryCount 标识的所有查询的结果,以及每个查询结果后直接写入的额外的可用性值,都会被复制到 dstBuffer 中,并将该值解释为无符号整数。值为零表示结果尚不可用,否则表示查询已完成且结果可用。

如果设置了 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR,则 queryPool 中由 firstQueryqueryCount 标识的所有查询的结果,以及每个查询结果后直接写入的额外的状态值,都会被复制到 dstBuffer 中,并将该值解释为有符号整数。值为零表示结果尚不可用。正值表示查询内的操作已成功完成,并且查询结果有效。负值表示查询内的操作未成功完成。

VkQueryResultStatusKHR 定义了此处返回的值的具体含义,但实现可以自由返回其他值。

如果写入的状态值为负数,表示查询内的操作未成功完成,则此命令写入的所有其他结果都是未定义的,除非为所用查询类型的任何结果另有规定。

此命令写入的任何可用查询的结果都是最终的,表示查询的最终结果。如果设置了 VK_QUERY_RESULT_PARTIAL_BIT,那么对于任何不可用的查询,都会为该查询写入介于零和最终结果值之间的中间结果。否则,此命令写入的任何结果都是未定义的。

如果设置了 VK_QUERY_RESULT_64_BIT,则所有查询的结果和可用性或状态值都将作为 64 位值数组写入。如果 queryPool 是使用 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR 创建的,则每个查询的结果都将作为由 VkPerformanceCounterKHR::storage 指示的类型写入,以便进行查询计数器。否则,结果和可用性或状态值将作为 32 位值数组写入。如果无符号整数查询的值溢出结果类型,则该值可能会环绕或饱和。如果启用了maintenance7 功能,则对于无符号整数查询,32 位结果值必须等于等效 64 位结果值的 32 个最低有效位。如果带符号整数查询的值溢出结果类型,则该值未定义。如果浮点数查询的值不能表示为结果类型,则该值未定义

此命令定义了引用同一查询的其他查询命令之间的执行依赖关系。

第一个同步范围包括所有引用由query指示的queryPool中查询的命令,这些命令在提交顺序中较早出现。如果flags不包含VK_QUERY_RESULT_WAIT_BIT,则vkCmdEndQueryIndexedEXTvkCmdWriteTimestamp2vkCmdEndQueryvkCmdWriteTimestamp将不包括在此范围内。

第二个 同步范围 包括在 提交顺序 中较晚出现的所有引用 query 指示的 queryPool 中的查询的命令。

此命令的操作发生在第一个范围之后,并且发生在第二个范围之前。

vkCmdCopyQueryPoolResults被视为传输操作,其对缓冲区内存的写入必须在使用结果之前使用VK_PIPELINE_STAGE_TRANSFER_BITVK_ACCESS_TRANSFER_WRITE_BIT进行同步。

有效用法
  • VUID-vkCmdCopyQueryPoolResults-firstQuery-09436
    firstQuery 必须小于 queryPool 中的查询数量

  • VUID-vkCmdCopyQueryPoolResults-firstQuery-09437
    firstQueryqueryCount 的总和必须小于或等于 queryPool 中的查询数量

  • VUID-vkCmdCopyQueryPoolResults-queryCount-09438
    如果 queryCount 大于 1,则 stride 必须不为零

  • VUID-vkCmdCopyQueryPoolResults-queryType-09439
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_TIMESTAMP,则 flags 必须不包含 VK_QUERY_RESULT_PARTIAL_BIT

  • VUID-vkCmdCopyQueryPoolResults-queryType-09440
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则 flags 必须不包含 VK_QUERY_RESULT_WITH_AVAILABILITY_BITVK_QUERY_RESULT_WITH_STATUS_BIT_KHRVK_QUERY_RESULT_PARTIAL_BITVK_QUERY_RESULT_64_BIT

  • VUID-vkCmdCopyQueryPoolResults-queryType-09441
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则 queryPool 必须已针对每次传递记录一次,并通过调用 vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR 检索。

  • VUID-vkCmdCopyQueryPoolResults-queryType-09442
    如果用于创建 queryPoolqueryTypeVK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR,则 flags 必须包含 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR

  • VUID-vkCmdCopyQueryPoolResults-flags-09443
    如果 flags 包含 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR,则它必须不包含 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT

  • VUID-vkCmdCopyQueryPoolResults-None-09402
    当命令执行时,命令使用的所有查询必须已初始化。

  • VUID-vkCmdCopyQueryPoolResults-dstOffset-00819
    dstOffset 必须小于dstBuffer的大小。

  • VUID-vkCmdCopyQueryPoolResults-flags-00822
    如果flags中未设置VK_QUERY_RESULT_64_BIT,则dstOffsetstride必须4的倍数。

  • VUID-vkCmdCopyQueryPoolResults-flags-00823
    如果flags中设置了VK_QUERY_RESULT_64_BIT,则dstOffsetstride必须8的倍数。

  • VUID-vkCmdCopyQueryPoolResults-dstBuffer-00824
    dstBuffer 必须dstOffset开始有足够的存储空间来包含每个查询的结果,如此处所述。

  • VUID-vkCmdCopyQueryPoolResults-dstBuffer-00825
    创建dstBuffer必须使用VK_BUFFER_USAGE_TRANSFER_DST_BIT使用标志。

  • VUID-vkCmdCopyQueryPoolResults-dstBuffer-00826
    如果dstBuffer是非稀疏的,则它必须完整且连续地绑定到单个VkDeviceMemory对象。

  • VUID-vkCmdCopyQueryPoolResults-queryType-03232
    如果用于创建queryPoolqueryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_KHR,则VkPhysicalDevicePerformanceQueryPropertiesKHR::allowCommandBufferQueryCopies必须VK_TRUE

  • VUID-vkCmdCopyQueryPoolResults-queryType-02734
    如果用于创建queryPoolqueryTypeVK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL,则必须不调用vkCmdCopyQueryPoolResults

  • VUID-vkCmdCopyQueryPoolResults-None-07429
    该命令使用的所有查询必须未激活

  • VUID-vkCmdCopyQueryPoolResults-None-08752
    命令使用的所有查询必须已通过先前执行的命令可用

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

  • VUID-vkCmdCopyQueryPoolResults-queryPool-parameter
    queryPool 必须是一个有效的 VkQueryPool 句柄

  • VUID-vkCmdCopyQueryPoolResults-dstBuffer-parameter
    dstBuffer 必须是有效的VkBuffer句柄。

  • VUID-vkCmdCopyQueryPoolResults-flags-parameter
    flags 必须VkQueryResultFlagBits 值的有效组合。

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

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

  • VUID-vkCmdCopyQueryPoolResults-renderpass
    此命令必须仅在渲染通道实例之外调用

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

  • VUID-vkCmdCopyQueryPoolResults-commonparent
    commandBufferdstBufferqueryPool中的每一个必须已从同一个VkDevice创建、分配或检索。

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

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

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

主要
次要

外部

外部

图形
计算

操作

诸如清除、MSAA 解析、附件加载/存储操作和 blit 之类的渲染操作可能会影响查询的结果。此行为取决于具体实现,并且可能因实现中使用的路径而异。例如,某些实现有几种类型的清除,其中一些可能包括顶点,而另一些则不包括。

遮挡查询

遮挡查询跟踪一组绘制命令中通过每个片段测试的样本数量。因此,遮挡查询仅在支持图形操作的队列族上可用。然后,应用程序可以使用这些结果来为未来的渲染决策提供信息。遮挡查询分别通过调用vkCmdBeginQueryvkCmdEndQuery开始和结束。当遮挡查询开始时,通过样本的计数始终从零开始。对于每个绘制命令,计数会按照样本计数中所述的方式递增。如果flags不包含VK_QUERY_CONTROL_PRECISE_BIT,则如果通过的样本计数不为零,则实现可能为查询生成任何非零结果值。

在某些实现中,不设置VK_QUERY_CONTROL_PRECISE_BIT模式可能效率更高,并且如果足以知道是否有任何样本通过每个片段测试的布尔结果,则应该使用该模式。在这种情况下,某些实现可能仅返回零或一,而与通过每个片段测试的样本的实际数量无关。

设置VK_QUERY_CONTROL_PRECISE_BIT并不保证不同的实现返回遮挡查询中相同的样本数量。某些实现可能预光栅化着色器阶段中杀死片段,并且这些被杀死的片段不会影响查询的最终结果。某些实现可能为查询生成零结果值,而其他实现则生成非零值。

当遮挡查询完成时,该查询的结果会被标记为可用。应用程序可以选择将结果复制到缓冲区(通过 vkCmdCopyQueryPoolResults),或者请求将其放入主机内存(通过 vkGetQueryPoolResults)。

如果遮挡几何体不是首先绘制的,那么采样可能会通过深度测试,但仍然在最终图像中不可见。

管线统计查询

管线统计查询允许应用程序采样一组指定的 VkPipeline 计数器。Vulkan 为一组绘制或分派命令累积这些计数器,当管线统计查询处于活动状态时。因此,管线统计查询在支持图形或计算操作的队列族上可用。管线统计查询的可用性由 VkPhysicalDeviceFeatures 对象的 pipelineStatisticsQuery 成员指示(有关在 VkDevice 上检测和请求此查询类型,请参阅 vkGetPhysicalDeviceFeaturesvkCreateDevice)。

通过分别调用 vkCmdBeginQueryvkCmdEndQuery 来开始和结束管线统计查询。当管线统计查询开始时,所有统计计数器都会设置为零。当查询处于活动状态时,管线类型确定可用的统计信息集,但这些必须在创建查询池时配置。如果在不支持相应操作的命令缓冲区上发出统计计数器,或者计数器对应于在查询处于活动状态时使用的任何管线中都缺失的着色阶段,则在查询可用后该计数器的值是未定义的。必须启用至少一个与记录命令缓冲区上支持的操作相关的统计计数器。

以下是在 VkQueryPoolCreateInfo::pipelineStatistics 中为查询池以及在 VkCommandBufferInheritanceInfo::pipelineStatistics 中为辅助命令缓冲区设置的位,这些位分别启用管线统计计数器:

// Provided by VK_VERSION_1_0
typedef enum VkQueryPipelineStatisticFlagBits {
    VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT = 0x00000001,
    VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT = 0x00000002,
    VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT = 0x00000004,
    VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT = 0x00000008,
    VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT = 0x00000010,
    VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT = 0x00000020,
    VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT = 0x00000040,
    VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT = 0x00000080,
    VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = 0x00000100,
    VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = 0x00000200,
    VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = 0x00000400,
  // Provided by VK_EXT_mesh_shader
    VK_QUERY_PIPELINE_STATISTIC_TASK_SHADER_INVOCATIONS_BIT_EXT = 0x00000800,
  // Provided by VK_EXT_mesh_shader
    VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT = 0x00001000,
  // Provided by VK_HUAWEI_cluster_culling_shader
    VK_QUERY_PIPELINE_STATISTIC_CLUSTER_CULLING_SHADER_INVOCATIONS_BIT_HUAWEI = 0x00002000,
} VkQueryPipelineStatisticFlagBits;
  • VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_VERTICES_BIT 指定由池管理的查询将计算 输入汇编阶段处理的顶点数。对应于不完整图元的顶点可能计入计数。

  • VK_QUERY_PIPELINE_STATISTIC_INPUT_ASSEMBLY_PRIMITIVES_BIT 指定由池管理的查询将计算 输入汇编阶段处理的图元数。如果启用了图元重启,则重启图元拓扑对计数没有影响。不完整的图元可能会被计数。

  • VK_QUERY_PIPELINE_STATISTIC_VERTEX_SHADER_INVOCATIONS_BIT 指定由池管理的查询将计算顶点着色器调用次数。每次调用顶点着色器时,此计数器的值都会增加。

  • VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_INVOCATIONS_BIT 指定由池管理的查询将计算几何着色器调用次数。每次调用几何着色器时,此计数器的值都会增加。在实例化几何着色器的情况下,每个单独的实例化调用都会增加几何着色器调用计数。

  • VK_QUERY_PIPELINE_STATISTIC_GEOMETRY_SHADER_PRIMITIVES_BIT 指定由池管理的查询将计算几何着色器调用生成的图元数。每次几何着色器发出图元时,计数器的值都会增加。使用 SPIR-V 指令 OpEndPrimitiveOpEndStreamPrimitive 重启图元拓扑对几何着色器输出图元计数没有影响。

  • VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT 指定由池管理的查询将计算管线的图元裁剪阶段处理的图元数。每次图元到达图元裁剪阶段时,计数器的值都会增加。

  • VK_QUERY_PIPELINE_STATISTIC_CLIPPING_PRIMITIVES_BIT 指定由池管理的查询将计算管线的图元裁剪阶段输出的图元数。每次图元通过图元裁剪阶段时,计数器的值都会增加。特定输入图元的图元裁剪阶段输出的实际图元数量取决于实现,但必须满足以下条件:

    • 如果输入图元的至少一个顶点位于裁剪体积内,则计数器会增加一或更多。

    • 否则,计数器会增加零或更多。

  • VK_QUERY_PIPELINE_STATISTIC_FRAGMENT_SHADER_INVOCATIONS_BIT 指定由池管理的查询将计算片段着色器调用次数。每次调用片段着色器时,计数器的值都会增加。

  • VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT 指定由池管理的查询将计算细分控制着色器处理的补丁数。每次调用细分控制着色器时,都会为每个补丁增加计数器的值。

  • VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT 指定由池管理的查询将计算细分评估着色器的调用次数。每次调用细分评估着色器时,计数器的值都会增加。

  • VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT 指定由池管理的查询将计算计算着色器调用次数。每次调用计算着色器时,计数器的值都会增加。只要渲染结果保持不变,出于与实现相关的理由,实现可能会跳过某些计算着色器调用的执行或执行额外的计算着色器调用。

  • VK_QUERY_PIPELINE_STATISTIC_TASK_SHADER_INVOCATIONS_BIT_EXT 指定由池管理的查询将计算任务着色器调用次数。每次调用任务着色器时,计数器的值都会增加。

  • VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT 指定由池管理的查询将计算网格着色器调用次数。每次调用网格着色器时,计数器的值都会增加。

这些值旨在衡量一个实现上的相对统计信息。各种设备架构将以不同的方式计算这些值。任何或所有计数器可能会受到查询操作中描述的问题的影响。

如果管线包含网格或任务着色器,则这种计数差异尤其明显,这可能会以意想不到的方式影响多个计数器。

例如,基于瓦片的渲染设备可能需要多次重放场景,从而影响某些计数。

如果管线启用了 rasterizerDiscardEnable,则实现可能会在最终的预光栅化着色器阶段之后丢弃图元。因此,如果启用了 rasterizerDiscardEnable,则裁剪输入和输出图元计数器可能不会增加。

当管线统计查询完成时,该查询的结果会被标记为可用。应用程序可以将结果复制到缓冲区(通过 vkCmdCopyQueryPoolResults),或者请求将其放入主机内存(通过 vkGetQueryPoolResults)。

// Provided by VK_VERSION_1_0
typedef VkFlags VkQueryPipelineStatisticFlags;

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

时间戳查询

时间戳为应用程序提供了一种计时命令执行的机制。时间戳是由 VkPhysicalDevice 生成的整数值。与其他查询不同,时间戳不作用于某个范围,因此不使用 vkCmdBeginQueryvkCmdEndQuery。该机制围绕一组命令构建,允许应用程序告知 VkPhysicalDevice 将时间戳值写入 查询池,然后(使用 vkGetQueryPoolResults)在主机上读取时间戳值,或者(使用 vkCmdCopyQueryPoolResults)将时间戳值复制到 VkBuffer 中。然后,应用程序可以计算时间戳之间的差异以确定执行时间。

时间戳值中的有效位数由写入时间戳的队列的 VkQueueFamilyProperties::timestampValidBits 属性确定。任何通过 vkGetPhysicalDeviceQueueFamilyProperties 报告 timestampValidBits 非零值的队列都支持时间戳。如果 timestampComputeAndGraphics 限制为 VK_TRUE,则支持图形或计算操作的每个队列系列都支持时间戳(请参阅 VkQueueFamilyProperties)。

时间戳值递增 1 所需的纳秒数可以从调用 vkGetPhysicalDeviceProperties 之后获得的 VkPhysicalDeviceLimits::timestampPeriod 获取。

要请求时间戳并将值写入内存,请调用

// Provided by VK_VERSION_1_3
void vkCmdWriteTimestamp2(
    VkCommandBuffer                             commandBuffer,
    VkPipelineStageFlags2                       stage,
    VkQueryPool                                 queryPool,
    uint32_t                                    query);

或等效命令

// Provided by VK_KHR_synchronization2
void vkCmdWriteTimestamp2KHR(
    VkCommandBuffer                             commandBuffer,
    VkPipelineStageFlags2                       stage,
    VkQueryPool                                 queryPool,
    uint32_t                                    query);
  • commandBuffer 是将记录命令的命令缓冲区。

  • stage 指定管道的阶段。

  • queryPool 是将管理时间戳的查询池。

  • query 是查询池中将包含时间戳的查询。

vkCmdWriteTimestamp2 被提交到队列时,它定义了对之前提交的命令的执行依赖关系,并将时间戳写入查询池。

第一个 同步范围 包括 提交顺序 中较早发生的所有命令。同步范围仅限于 stage 指定的管道阶段的操作。

第二个 同步范围 仅包括时间戳写入操作。

实现可以在逻辑上晚于 stage 的任何阶段写入时间戳。

如果同一提交中的时间戳写入发生于另一个时间戳写入之后,则其值必须不低于另一个时间戳写入的值,除非其值溢出了查询支持的最大整数位宽。如果启用 VK_KHR_calibrated_timestampsVK_EXT_calibrated_timestamps,则这会扩展到同一逻辑设备上所有提交中的时间戳写入:任何时间戳写入如果发生于另一个时间戳写入之后,则其值必须不低于另一个时间戳写入的值,除非其值溢出了查询支持的最大整数位宽。此命令写入的时间戳必须位于 VK_TIME_DOMAIN_DEVICE_KHR 时间域中。如果发生溢出,时间戳值必须回绕到零。

时间戳之间的比较应在保证不会减少的时间戳之间进行。例如,从较新的时间戳中减去较旧的时间戳以确定一系列命令的执行时间,只有当两个时间戳写入是在同一提交中执行的,或者写入是在同一逻辑设备上执行并且启用了 VK_KHR_calibrated_timestampsVK_EXT_calibrated_timestamps 时,才是一种可靠的测量方式。

如果 vkCmdWriteTimestamp2 在执行启用了多视图的渲染过程实例时调用,则时间戳在查询池中使用 N 个连续的查询索引(从 query 开始),其中 N 是执行该命令的子通道的视图掩码中设置的位数。生成的查询值由以下行为之一的实现定义选择决定

  • 第一个查询是时间戳值,并且(如果视图掩码中设置了多于一位),则将其余查询写入零。如果在同一子通道中写入了两个时间戳,则这些命令之间所有视图的执行时间之和是每个命令写入的第一个查询之间的差值。

  • 所有 N 个查询都是时间戳值。如果在同一子通道中写入了两个时间戳,则这些命令之间所有视图的执行时间之和是每个命令写入的相应查询之间的差值之和。相应查询之间的差值可以是单个视图的执行时间。

在任何一种情况下,应用程序可以对所有 N 个查询之间的差值求和,以确定总执行时间。

有效用法
  • VUID-vkCmdWriteTimestamp2-stage-03929
    如果未启用 geometryShader 功能,则 stage 必须不包含 VK_PIPELINE_STAGE_2_GEOMETRY_SHADER_BIT

  • VUID-vkCmdWriteTimestamp2-stage-03930
    如果未启用 tessellationShader 功能,则 stage 必须不包含 VK_PIPELINE_STAGE_2_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_2_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdWriteTimestamp2-stage-03931
    如果未启用 conditionalRendering 功能,则 stage 必须不包含 VK_PIPELINE_STAGE_2_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdWriteTimestamp2-stage-03932
    如果未启用 fragmentDensityMap 功能,则 stage 必须不包含 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdWriteTimestamp2-stage-03933
    如果未启用 transformFeedback 功能,则 stage 必须不包含 VK_PIPELINE_STAGE_2_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdWriteTimestamp2-stage-03934
    如果未启用meshShader特性,则stage 必须不包含VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT

  • VUID-vkCmdWriteTimestamp2-stage-03935
    如果未启用taskShader特性,则stage 必须不包含VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT

  • VUID-vkCmdWriteTimestamp2-stage-07316
    如果未启用shadingRateImageattachmentFragmentShadingRate特性,则stage 必须不包含VK_PIPELINE_STAGE_2_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdWriteTimestamp2-stage-04957
    如果未启用subpassShading特性,则stage 必须不包含VK_PIPELINE_STAGE_2_SUBPASS_SHADER_BIT_HUAWEI

  • VUID-vkCmdWriteTimestamp2-stage-04995
    如果未启用invocationMask特性,则stage 必须不包含VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI

  • VUID-vkCmdWriteTimestamp2-stage-07946
    如果既未启用VK_NV_ray_tracing扩展,也未启用rayTracingPipeline特性,则stage 必须不包含VK_PIPELINE_STAGE_2_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdWriteTimestamp2-synchronization2-03858
    必须启用synchronization2特性

  • VUID-vkCmdWriteTimestamp2-stage-03859
    stage 必须仅包含单个管线阶段

  • VUID-vkCmdWriteTimestamp2-stage-03860
    stage 必须仅包含用于创建commandBuffer分配的命令池的队列族有效的阶段

  • VUID-vkCmdWriteTimestamp2-queryPool-03861
    queryPool 必须已使用queryTypeVK_QUERY_TYPE_TIMESTAMP创建

  • VUID-vkCmdWriteTimestamp2-timestampValidBits-03863
    命令池的队列族必须支持非零的timestampValidBits

  • VUID-vkCmdWriteTimestamp2-query-04903
    query 必须小于 queryPool 中的查询数

  • VUID-vkCmdWriteTimestamp2-None-03864
    该命令使用的所有查询必须不可用

  • VUID-vkCmdWriteTimestamp2-query-03865
    如果在渲染过程实例中调用vkCmdWriteTimestamp2,则query和当前子过程的视图掩码中设置的位数之和必须小于或等于queryPool中的查询数

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

  • VUID-vkCmdWriteTimestamp2-stage-parameter
    stage 必须VkPipelineStageFlagBits2值的有效组合

  • VUID-vkCmdWriteTimestamp2-queryPool-parameter
    queryPool 必须是一个有效的 VkQueryPool 句柄

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

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

  • VUID-vkCmdWriteTimestamp2-commonparent
    commandBufferqueryPool必须已从相同的 VkDevice 创建、分配或检索

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

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

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

主要
次要

两者

两者

传输
图形
计算
解码
编码

操作

要请求时间戳并将值写入内存,请调用

// Provided by VK_VERSION_1_0
void vkCmdWriteTimestamp(
    VkCommandBuffer                             commandBuffer,
    VkPipelineStageFlagBits                     pipelineStage,
    VkQueryPool                                 queryPool,
    uint32_t                                    query);
  • commandBuffer 是将记录命令的命令缓冲区。

  • pipelineStageVkPipelineStageFlagBits值,指定管线的一个阶段。

  • queryPool 是将管理时间戳的查询池。

  • query 是查询池中将包含时间戳的查询。

vkCmdWriteTimestamp提交到队列时,它定义了对在其之前提交的命令的执行依赖性,并将时间戳写入查询池。

第一个同步范围包括在提交顺序中较早发生的所有命令。同步范围仅限于pipelineStage指定的管线阶段上的操作。

第二个 同步范围 仅包括时间戳写入操作。

实现可以在逻辑上晚于 stage 的任何阶段写入时间戳。

如果同一提交中的时间戳写入发生于另一个时间戳写入之后,则其值必须不低于另一个时间戳写入的值,除非其值溢出了查询支持的最大整数位宽。如果启用 VK_KHR_calibrated_timestampsVK_EXT_calibrated_timestamps,则这会扩展到同一逻辑设备上所有提交中的时间戳写入:任何时间戳写入如果发生于另一个时间戳写入之后,则其值必须不低于另一个时间戳写入的值,除非其值溢出了查询支持的最大整数位宽。此命令写入的时间戳必须位于 VK_TIME_DOMAIN_DEVICE_KHR 时间域中。如果发生溢出,时间戳值必须回绕到零。

时间戳之间的比较应在保证不会减少的时间戳之间进行。例如,从较新的时间戳中减去较旧的时间戳以确定一系列命令的执行时间,只有当两个时间戳写入是在同一提交中执行的,或者写入是在同一逻辑设备上执行并且启用了 VK_KHR_calibrated_timestampsVK_EXT_calibrated_timestamps 时,才是一种可靠的测量方式。

如果vkCmdWriteTimestamp在执行启用了多视图的渲染过程实例时调用,则时间戳使用查询池中N个连续查询索引(从query开始),其中N是执行命令的子过程的视图掩码中设置的位数。结果查询值由以下行为之一的实现相关选择确定

  • 第一个查询是时间戳值,并且(如果视图掩码中设置了多于一位),则将其余查询写入零。如果在同一子通道中写入了两个时间戳,则这些命令之间所有视图的执行时间之和是每个命令写入的第一个查询之间的差值。

  • 所有 N 个查询都是时间戳值。如果在同一子通道中写入了两个时间戳,则这些命令之间所有视图的执行时间之和是每个命令写入的相应查询之间的差值之和。相应查询之间的差值可以是单个视图的执行时间。

在任何一种情况下,应用程序可以对所有 N 个查询之间的差值求和,以确定总执行时间。

有效用法
  • VUID-vkCmdWriteTimestamp-pipelineStage-04074
    pipelineStage 必须是用于创建commandBuffer分配的命令池的队列族的有效阶段

  • VUID-vkCmdWriteTimestamp-pipelineStage-04075
    如果未启用geometryShader特性,则pipelineStage 必须不是VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT

  • VUID-vkCmdWriteTimestamp-pipelineStage-04076
    如果未启用tessellationShader特性,则pipelineStage 必须不是VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BITVK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT

  • VUID-vkCmdWriteTimestamp-pipelineStage-04077
    如果未启用conditionalRendering特性,则pipelineStage 必须不是VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT

  • VUID-vkCmdWriteTimestamp-pipelineStage-04078
    如果未启用fragmentDensityMap特性,则pipelineStage 必须不是VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT

  • VUID-vkCmdWriteTimestamp-pipelineStage-04079
    如果未启用transformFeedback特性,则pipelineStage 必须不是VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT

  • VUID-vkCmdWriteTimestamp-pipelineStage-04080
    如果未启用meshShader特性,则pipelineStage 必须不是VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT

  • VUID-vkCmdWriteTimestamp-pipelineStage-07077
    如果未启用 taskShader 功能,则 pipelineStage 必须 不能是 VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT

  • VUID-vkCmdWriteTimestamp-shadingRateImage-07314
    如果 shadingRateImageattachmentFragmentShadingRate 功能均未启用,则 pipelineStage 必须 不能是 VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR

  • VUID-vkCmdWriteTimestamp-synchronization2-06489
    如果未启用 synchronization2 功能,则 pipelineStage 必须 不能是 VK_PIPELINE_STAGE_NONE

  • VUID-vkCmdWriteTimestamp-rayTracingPipeline-07943
    如果既未启用 VK_NV_ray_tracing 扩展,也未启用 rayTracingPipeline 功能,则 pipelineStage 必须 不能是 VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR

  • VUID-vkCmdWriteTimestamp-queryPool-01416
    queryPool 必须已使用queryTypeVK_QUERY_TYPE_TIMESTAMP创建

  • VUID-vkCmdWriteTimestamp-timestampValidBits-00829
    命令池的队列族必须支持非零的timestampValidBits

  • VUID-vkCmdWriteTimestamp-query-04904
    query 必须小于 queryPool 中的查询数

  • VUID-vkCmdWriteTimestamp-None-00830
    该命令使用的所有查询必须不可用

  • VUID-vkCmdWriteTimestamp-query-00831
    如果在渲染通道实例中调用 vkCmdWriteTimestamp,则 query 的值与当前子通道的视图掩码中设置的位数之和 必须 小于或等于 queryPool 中的查询数量。

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

  • VUID-vkCmdWriteTimestamp-pipelineStage-parameter
    pipelineStage 必须 是一个有效的 VkPipelineStageFlagBits 值。

  • VUID-vkCmdWriteTimestamp-queryPool-parameter
    queryPool 必须是一个有效的 VkQueryPool 句柄

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

  • VUID-vkCmdWriteTimestamp-commandBuffer-cmdpool
    分配 commandBufferVkCommandPool 必须 支持传输、图形、计算、解码、编码或光流操作。

  • VUID-vkCmdWriteTimestamp-commonparent
    commandBufferqueryPool必须已从相同的 VkDevice 创建、分配或检索

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

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

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

主要
次要

两者

两者

传输
图形
计算
解码
编码
光流

操作

性能查询

性能查询 为应用程序提供了一种机制,用于获取有关命令缓冲区、渲染通道和命令执行的性能计数器信息。

每个队列族都会通过调用 vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR 公布可以在该队列族的队列上查询的性能计数器。 实现 可能 会根据平台要求或仅针对开发目的的专用驱动程序限制对性能计数器的访问。

这可能包括不枚举任何性能计数器,或仅枚举减少的集合。 请参阅特定于平台的文档,以获取有关任何此类限制的指导。

性能查询使用现有的 vkCmdBeginQueryvkCmdEndQuery 来控制要获取性能信息的命令缓冲区、渲染通道或命令。

实现 可能 需要多次传递,其中记录的命令缓冲区、渲染通道或命令相同,并且在同一队列上执行以记录性能计数器数据。 这是通过提交相同的批次并提供包含计数器传递索引的 VkPerformanceQuerySubmitInfoKHR 结构来实现的。可以通过调用 vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR 来查询给定性能查询池所需的传递次数。

使用 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT 创建的命令缓冲区 必须 不得重新提交。更改命令缓冲区使用位 可能 会影响性能。为避免这种情况,当需要多次计数器传递时,应用程序 应该 重新记录任何使用 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT 的命令缓冲区。

可以使用命令 vkGetQueryPoolResults 获取来自性能查询池的性能计数器结果。

VkPerformanceCounterResultKHR 联合定义为

// Provided by VK_KHR_performance_query
typedef union VkPerformanceCounterResultKHR {
    int32_t     int32;
    int64_t     int64;
    uint32_t    uint32;
    uint64_t    uint64;
    float       float32;
    double      float64;
} VkPerformanceCounterResultKHR;
  • int32 是一个 32 位有符号整数值。

  • int64 是一个 64 位有符号整数值。

  • uint32 是一个 32 位无符号整数值。

  • uint64 是一个 64 位无符号整数值。

  • float32 是一个 32 位浮点值。

  • float64 是一个 64 位浮点值。

性能查询结果以 VkPerformanceCounterResultKHR 联合数组的形式返回,其中包含与查询中每个计数器关联的数据,这些数据存储的顺序与创建性能查询时在 pCounterIndices 中提供的计数器相同。VkPerformanceCounterKHR::storage 指定如何解析计数器数据。

性能分析锁

要记录并提交包含性能查询池的命令缓冲区,必须 持有性能分析锁。在任何调用 vkBeginCommandBuffer (将使用性能查询池) 之前,必须 获取性能分析锁。当包含性能查询池的任何命令缓冲区处于记录可执行待处理状态时,必须 持有性能分析锁。要获取性能分析锁,请调用

// Provided by VK_KHR_performance_query
VkResult vkAcquireProfilingLockKHR(
    VkDevice                                    device,
    const VkAcquireProfilingLockInfoKHR*        pInfo);
  • device 是要进行性能分析的逻辑设备。

  • pInfo 是指向 VkAcquireProfilingLockInfoKHR 结构的指针,其中包含有关如何获取性能分析的信息。

实现 可能 允许多个参与者同时持有性能分析锁。

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

  • VUID-vkAcquireProfilingLockKHR-pInfo-parameter
    pInfo 必须 是指向有效 VkAcquireProfilingLockInfoKHR 结构的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_OUT_OF_HOST_MEMORY

  • VK_TIMEOUT

VkAcquireProfilingLockInfoKHR 结构定义为

// Provided by VK_KHR_performance_query
typedef struct VkAcquireProfilingLockInfoKHR {
    VkStructureType                   sType;
    const void*                       pNext;
    VkAcquireProfilingLockFlagsKHR    flags;
    uint64_t                          timeout;
} VkAcquireProfilingLockInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • flags 保留供将来使用。

  • 如果性能分析锁不可用,timeout 表示函数等待的时间(以纳秒为单位)。

有效用法(隐式)
  • VUID-VkAcquireProfilingLockInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR

  • VUID-VkAcquireProfilingLockInfoKHR-pNext-pNext
    pNext 必须NULL

  • VUID-VkAcquireProfilingLockInfoKHR-flags-zerobitmask
    flags **必须** 为 0

如果 timeout 为 0,则 vkAcquireProfilingLockKHR 在尝试获取性能分析锁时不会阻塞。如果 timeoutUINT64_MAX,则该函数将不会返回,直到获取性能分析锁。

// Provided by VK_KHR_performance_query
typedef enum VkAcquireProfilingLockFlagBitsKHR {
} VkAcquireProfilingLockFlagBitsKHR;
// Provided by VK_KHR_performance_query
typedef VkFlags VkAcquireProfilingLockFlagsKHR;

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

要释放性能分析锁,请调用

// Provided by VK_KHR_performance_query
void vkReleaseProfilingLockKHR(
    VkDevice                                    device);
  • device 是要停止性能分析的逻辑设备。

有效用法
  • VUID-vkReleaseProfilingLockKHR-device-03235
    必须通过先前成功调用 vkAcquireProfilingLockKHR 来持有 device 的性能分析锁。

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

转换反馈查询

转换反馈查询跟踪被捕获的顶点流尝试写入和实际写入到转换反馈缓冲区的图元数量。此查询在转换反馈处于活动状态时,在绘制命令期间更新。如果绑定的转换反馈缓冲区的大小对于实际绘制的图元数量太小,则实际写入的图元数量将小于尝试写入的图元数量。图元不会写入到超出转换反馈缓冲区绑定范围的位置。通过分别调用 vkCmdBeginQueryvkCmdEndQuery 来开始和结束转换反馈查询,以查询顶点流零。vkCmdBeginQueryIndexedEXTvkCmdEndQueryIndexedEXT 可以 用于开始和结束任何支持的顶点流的转换反馈查询。当转换反馈查询开始时,写入的图元计数和需要的图元计数从零开始。对于每个绘制命令,当顶点属性输出被捕获到转换反馈缓冲区中且转换反馈处于活动状态时,计数会增加。

当转换反馈查询完成时,该查询的结果将被标记为可用。应用程序可以随后将结果复制到缓冲区(通过 vkCmdCopyQueryPoolResults),或者请求将其放入主机内存(通过 vkGetQueryPoolResults)。

生成的图元查询

当顶点流的生成的图元查询处于活动状态时,每当发送到该流的图元到达转换反馈阶段时,无论转换反馈是否处于活动状态,都会增加生成的图元计数。通过分别调用 vkCmdBeginQueryvkCmdEndQuery 来开始和结束生成的图元查询,以查询顶点流零。vkCmdBeginQueryIndexedEXTvkCmdEndQueryIndexedEXT 可以 用于开始和结束任何支持的顶点流的生成的图元查询。当生成的图元查询开始时,生成的图元计数从零开始。

当生成的图元查询完成时,该查询的结果将被标记为可用。应用程序可以随后将结果复制到缓冲区(通过 vkCmdCopyQueryPoolResults),或者请求将其放入主机内存(通过 vkGetQueryPoolResults)。

此查询的结果通常与 VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT 相同,但生成的图元查询是确定性的,即它必须与处理的图元数量相同。VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT 可能因实现而异,例如,出于裁剪的目的,同一个图元可能会被多次处理。

网格着色器查询

当生成的网格图元查询处于活动状态时,每当网格着色器阶段发出的图元到达片段着色器阶段时,网格图元生成计数都会增加。当生成的网格图元查询开始时,网格图元生成计数从零开始。

网格和任务着色器管线统计查询的工作方式与其他着色器阶段的调用查询相同,计算相应着色器阶段运行的次数。当统计查询开始时,调用计数器从零开始。

英特尔性能查询

英特尔性能查询允许应用程序捕获一组命令的性能数据。性能查询的使用方式与其他类型的查询类似。与现有查询的主要区别在于,生成的数据应交给能够生成人类可读结果的库,而不是由应用程序直接读取。

在创建性能查询池之前,使用以下调用初始化设备的性能查询:

// Provided by VK_INTEL_performance_query
VkResult vkInitializePerformanceApiINTEL(
    VkDevice                                    device,
    const VkInitializePerformanceApiInfoINTEL*  pInitializeInfo);
有效用法(隐式)
  • VUID-vkInitializePerformanceApiINTEL-device-parameter
    device 必须是有效的 VkDevice 句柄

  • VUID-vkInitializePerformanceApiINTEL-pInitializeInfo-parameter
    pInitializeInfo 必须 是指向有效 VkInitializePerformanceApiInfoINTEL 结构的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

VkInitializePerformanceApiInfoINTEL 结构定义如下:

// Provided by VK_INTEL_performance_query
typedef struct VkInitializePerformanceApiInfoINTEL {
    VkStructureType    sType;
    const void*        pNext;
    void*              pUserData;
} VkInitializePerformanceApiInfoINTEL;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • pUserData 是应用程序数据的指针。

有效用法(隐式)
  • VUID-VkInitializePerformanceApiInfoINTEL-sType-sType
    sType 必须VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL

  • VUID-VkInitializePerformanceApiInfoINTEL-pNext-pNext
    pNext 必须NULL

一旦性能查询操作完成,使用以下调用取消初始化设备的性能查询:

// Provided by VK_INTEL_performance_query
void vkUninitializePerformanceApiINTEL(
    VkDevice                                    device);
  • device 是用于查询的逻辑设备。

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

可以使用以下调用发现设备的某些性能查询功能:

// Provided by VK_INTEL_performance_query
VkResult vkGetPerformanceParameterINTEL(
    VkDevice                                    device,
    VkPerformanceParameterTypeINTEL             parameter,
    VkPerformanceValueINTEL*                    pValue);
  • device 是要查询的逻辑设备。

  • parameter 是要查询的参数。

  • pValue 是指向 VkPerformanceValueINTEL 结构的指针,该结构中返回参数的类型和值。

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

  • VUID-vkGetPerformanceParameterINTEL-parameter-parameter
    parameter 必须 是有效的 VkPerformanceParameterTypeINTEL

  • VUID-vkGetPerformanceParameterINTEL-pValue-parameter
    pValue 必须 是指向 VkPerformanceValueINTEL 结构的有效指针

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

以下是 vkGetPerformanceParameterINTEL::parameter 的可能值,用于指定性能查询功能:

// Provided by VK_INTEL_performance_query
typedef enum VkPerformanceParameterTypeINTEL {
    VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL = 0,
    VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL = 1,
} VkPerformanceParameterTypeINTEL;
  • VK_PERFORMANCE_PARAMETER_TYPE_HW_COUNTERS_SUPPORTED_INTEL 的结果为布尔值,表示是否可以捕获硬件计数器。

  • VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL 的结果为 32 位整数,表示可以写入 VkPerformanceValueINTEL 值的位数。

VkPerformanceValueINTEL 结构的定义如下:

// Provided by VK_INTEL_performance_query
typedef struct VkPerformanceValueINTEL {
    VkPerformanceValueTypeINTEL    type;
    VkPerformanceValueDataINTEL    data;
} VkPerformanceValueINTEL;

以下是 VkPerformanceValueINTEL::type 的可能值,用于指定 VkPerformanceValueINTEL::data 中返回的数据类型:

  • VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL 指定在 data.value32 中返回无符号 32 位整数数据。

  • VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL 指定在 data.value64 中返回无符号 64 位整数数据。

  • VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL 指定在 data.valueFloat 中返回浮点数据。

  • VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL 指定在 data.valueBool 中返回 VkBool32 数据。

  • VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL 指定在 data.valueString 中返回指向以空字符结尾的 UTF-8 字符串的指针。该指针在传递给 vkGetPerformanceParameterINTELdevice 参数的生命周期内有效。

// Provided by VK_INTEL_performance_query
typedef enum VkPerformanceValueTypeINTEL {
    VK_PERFORMANCE_VALUE_TYPE_UINT32_INTEL = 0,
    VK_PERFORMANCE_VALUE_TYPE_UINT64_INTEL = 1,
    VK_PERFORMANCE_VALUE_TYPE_FLOAT_INTEL = 2,
    VK_PERFORMANCE_VALUE_TYPE_BOOL_INTEL = 3,
    VK_PERFORMANCE_VALUE_TYPE_STRING_INTEL = 4,
} VkPerformanceValueTypeINTEL;

VkPerformanceValueDataINTEL 联合体的定义如下:

// Provided by VK_INTEL_performance_query
typedef union VkPerformanceValueDataINTEL {
    uint32_t       value32;
    uint64_t       value64;
    float          valueFloat;
    VkBool32       valueBool;
    const char*    valueString;
} VkPerformanceValueDataINTEL;
  • data.value32 表示 32 位整数数据。

  • data.value64 表示 64 位整数数据。

  • data.valueFloat 表示浮点数据。

  • data.valueBool 表示 VkBool32 数据。

  • data.valueString 表示指向以空字符结尾的 UTF-8 字符串的指针。

联合体的正确成员由相关的 VkPerformanceValueTypeINTEL 值确定。

VkQueryPoolPerformanceQueryCreateInfoINTEL 结构的定义如下:

// Provided by VK_INTEL_performance_query
typedef struct VkQueryPoolPerformanceQueryCreateInfoINTEL {
    VkStructureType                 sType;
    const void*                     pNext;
    VkQueryPoolSamplingModeINTEL    performanceCountersSampling;
} VkQueryPoolPerformanceQueryCreateInfoINTEL;
// Provided by VK_INTEL_performance_query
typedef VkQueryPoolPerformanceQueryCreateInfoINTEL VkQueryPoolCreateInfoINTEL;

要为 Intel 性能查询创建池,请将 VkQueryPoolCreateInfo::queryType 设置为 VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL,并将 VkQueryPoolPerformanceQueryCreateInfoINTEL 结构添加到 VkQueryPoolCreateInfo 结构的 pNext 链中。

  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • performanceCountersSampling 描述应如何捕获性能查询。

有效用法(隐式)
  • VUID-VkQueryPoolPerformanceQueryCreateInfoINTEL-sType-sType
    sType 必须VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_QUERY_CREATE_INFO_INTEL

  • VUID-VkQueryPoolPerformanceQueryCreateInfoINTEL-performanceCountersSampling-parameter
    performanceCountersSampling 必须 为有效的 VkQueryPoolSamplingModeINTEL

以下是 VkQueryPoolPerformanceQueryCreateInfoINTEL::performanceCountersSampling 的可能值:

// Provided by VK_INTEL_performance_query
typedef enum VkQueryPoolSamplingModeINTEL {
    VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL = 0,
} VkQueryPoolSamplingModeINTEL;
  • VK_QUERY_POOL_SAMPLING_MODE_MANUAL_INTEL 是默认模式,应用程序在此模式下调用 vkCmdBeginQueryvkCmdEndQuery 来记录性能数据。

为了帮助将查询结果与应用程序发出命令的特定点关联起来,可以使用以下调用在命令缓冲区中设置标记:

// Provided by VK_INTEL_performance_query
VkResult vkCmdSetPerformanceMarkerINTEL(
    VkCommandBuffer                             commandBuffer,
    const VkPerformanceMarkerInfoINTEL*         pMarkerInfo);

在查询结束之前设置到命令缓冲区的最后一个标记将成为查询结果的一部分。

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

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

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

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

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

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

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

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

主要
次要

两者

外部

图形
计算
传输

操作
状态

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

VkPerformanceMarkerInfoINTEL 结构的定义如下:

// Provided by VK_INTEL_performance_query
typedef struct VkPerformanceMarkerInfoINTEL {
    VkStructureType    sType;
    const void*        pNext;
    uint64_t           marker;
} VkPerformanceMarkerInfoINTEL;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • marker 是将记录到不透明查询结果中的标记值。

有效用法(隐式)
  • VUID-VkPerformanceMarkerInfoINTEL-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL

  • VUID-VkPerformanceMarkerInfoINTEL-pNext-pNext
    pNext 必须NULL

在监视系统上运行的整个应用程序集中应用程序的行为时,识别潜在大量性能数据中的绘制调用非常有用。为此,应用程序可以生成流标记,用于追溯特定绘制调用以及特定的性能数据项。

// Provided by VK_INTEL_performance_query
VkResult vkCmdSetPerformanceStreamMarkerINTEL(
    VkCommandBuffer                             commandBuffer,
    const VkPerformanceStreamMarkerInfoINTEL*   pMarkerInfo);
有效用法(隐式)
  • VUID-vkCmdSetPerformanceStreamMarkerINTEL-commandBuffer-parameter
    commandBuffer 必须是一个有效的 VkCommandBuffer 句柄

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

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

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

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

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

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

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

主要
次要

两者

外部

图形
计算
传输

操作
状态

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

VkPerformanceStreamMarkerInfoINTEL 结构的定义如下:

// Provided by VK_INTEL_performance_query
typedef struct VkPerformanceStreamMarkerInfoINTEL {
    VkStructureType    sType;
    const void*        pNext;
    uint32_t           marker;
} VkPerformanceStreamMarkerInfoINTEL;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • marker 是将记录到外部应用程序使用的报告中的标记值。

有效用法
  • VUID-VkPerformanceStreamMarkerInfoINTEL-marker-02735
    应用程序写入 marker 的值必须仅使用 vkGetPerformanceParameterINTEL 使用 VK_PERFORMANCE_PARAMETER_TYPE_STREAM_MARKER_VALID_BITS_INTEL 报告的有效位

有效用法(隐式)
  • VUID-VkPerformanceStreamMarkerInfoINTEL-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL

  • VUID-VkPerformanceStreamMarkerInfoINTEL-pNext-pNext
    pNext 必须NULL

某些应用程序可能希望使用不同的设置来测量一组命令的效果。可以使用以下方法覆盖特定设置:

// Provided by VK_INTEL_performance_query
VkResult vkCmdSetPerformanceOverrideINTEL(
    VkCommandBuffer                             commandBuffer,
    const VkPerformanceOverrideInfoINTEL*       pOverrideInfo);
  • commandBuffer 是进行覆盖的命令缓冲区。

  • pOverrideInfo 是指向 VkPerformanceOverrideInfoINTEL 结构的指针,该结构选择要覆盖的参数。

有效用法
  • VUID-vkCmdSetPerformanceOverrideINTEL-pOverrideInfo-02736
    pOverrideInfo 必须 不能与 vkGetPerformanceParameterINTEL 报告不可用的 VkPerformanceOverrideTypeINTEL 一起使用。

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

  • VUID-vkCmdSetPerformanceOverrideINTEL-pOverrideInfo-parameter
    pOverrideInfo 必须 是指向有效的 VkPerformanceOverrideInfoINTEL 结构的有效指针。

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

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

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

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

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

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

主要
次要

两者

外部

图形
计算
传输

状态

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

VkPerformanceOverrideInfoINTEL 结构定义如下:

// Provided by VK_INTEL_performance_query
typedef struct VkPerformanceOverrideInfoINTEL {
    VkStructureType                   sType;
    const void*                       pNext;
    VkPerformanceOverrideTypeINTEL    type;
    VkBool32                          enable;
    uint64_t                          parameter;
} VkPerformanceOverrideInfoINTEL;
有效用法(隐式)
  • VUID-VkPerformanceOverrideInfoINTEL-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL

  • VUID-VkPerformanceOverrideInfoINTEL-pNext-pNext
    pNext 必须NULL

  • VUID-VkPerformanceOverrideInfoINTEL-type-parameter
    type 必须 是有效的 VkPerformanceOverrideTypeINTEL 值。

指定性能覆盖类型的 VkPerformanceOverrideInfoINTEL::type 的可能值有:

// Provided by VK_INTEL_performance_query
typedef enum VkPerformanceOverrideTypeINTEL {
    VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL = 0,
    VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL = 1,
} VkPerformanceOverrideTypeINTEL;
  • VK_PERFORMANCE_OVERRIDE_TYPE_NULL_HARDWARE_INTEL 将所有渲染操作变为无操作。

  • VK_PERFORMANCE_OVERRIDE_TYPE_FLUSH_GPU_CACHES_INTEL 暂停命令流,直到先前发出的所有命令都已完成,并且所有缓存都已刷新和失效。

在将包含性能查询命令的命令缓冲区提交到设备队列之前,应用程序必须获取并设置性能查询配置。一旦所有包含性能查询命令的命令缓冲区都不处于挂起状态,就可以释放该配置。

// Provided by VK_INTEL_performance_query
VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkPerformanceConfigurationINTEL)

要获取设备性能配置,请调用:

// Provided by VK_INTEL_performance_query
VkResult vkAcquirePerformanceConfigurationINTEL(
    VkDevice                                    device,
    const VkPerformanceConfigurationAcquireInfoINTEL* pAcquireInfo,
    VkPerformanceConfigurationINTEL*            pConfiguration);
  • device 是将提交性能查询命令的逻辑设备。

  • pAcquireInfo 是指向 VkPerformanceConfigurationAcquireInfoINTEL 结构的指针,用于指定要获取的性能配置。

  • pConfiguration 是指向 VkPerformanceConfigurationINTEL 句柄的指针,将在其中返回结果配置对象。

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

  • VUID-vkAcquirePerformanceConfigurationINTEL-pAcquireInfo-parameter
    pAcquireInfo 必须 是指向有效的 VkPerformanceConfigurationAcquireInfoINTEL 结构的有效指针。

  • VUID-vkAcquirePerformanceConfigurationINTEL-pConfiguration-parameter
    pConfiguration 必须 是指向 VkPerformanceConfigurationINTEL 句柄的有效指针。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

VkPerformanceConfigurationAcquireInfoINTEL 结构定义如下:

// Provided by VK_INTEL_performance_query
typedef struct VkPerformanceConfigurationAcquireInfoINTEL {
    VkStructureType                        sType;
    const void*                            pNext;
    VkPerformanceConfigurationTypeINTEL    type;
} VkPerformanceConfigurationAcquireInfoINTEL;
有效用法(隐式)
  • VUID-VkPerformanceConfigurationAcquireInfoINTEL-sType-sType
    sType 必须VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL

  • VUID-VkPerformanceConfigurationAcquireInfoINTEL-pNext-pNext
    pNext 必须NULL

  • VUID-VkPerformanceConfigurationAcquireInfoINTEL-type-parameter
    type 必须 是有效的 VkPerformanceConfigurationTypeINTEL 值。

指定性能配置类型的 VkPerformanceConfigurationAcquireInfoINTEL::type 的可能值有:

// Provided by VK_INTEL_performance_query
typedef enum VkPerformanceConfigurationTypeINTEL {
    VK_PERFORMANCE_CONFIGURATION_TYPE_COMMAND_QUEUE_METRICS_DISCOVERY_ACTIVATED_INTEL = 0,
} VkPerformanceConfigurationTypeINTEL;

要设置性能配置,请调用:

// Provided by VK_INTEL_performance_query
VkResult vkQueueSetPerformanceConfigurationINTEL(
    VkQueue                                     queue,
    VkPerformanceConfigurationINTEL             configuration);
  • queue 是将在其上使用配置的队列。

  • configuration 是要使用的配置。

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

  • VUID-vkQueueSetPerformanceConfigurationINTEL-configuration-parameter
    configuration 必须 是有效的 VkPerformanceConfigurationINTEL 句柄。

  • VUID-vkQueueSetPerformanceConfigurationINTEL-commonparent
    configurationqueue必须已从同一 VkDevice 创建、分配或检索。

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

要释放设备性能配置,请调用:

// Provided by VK_INTEL_performance_query
VkResult vkReleasePerformanceConfigurationINTEL(
    VkDevice                                    device,
    VkPerformanceConfigurationINTEL             configuration);
  • device 是与要释放的配置对象关联的设备。

  • configuration 是要释放的配置对象。

有效用法
  • VUID-vkReleasePerformanceConfigurationINTEL-configuration-02737
    在配置设置时提交的所有命令缓冲区都处于挂起状态之前,不得释放 configuration

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

  • VUID-vkReleasePerformanceConfigurationINTEL-configuration-parameter
    如果 configuration 不是 VK_NULL_HANDLE,则 configuration 必须 是有效的 VkPerformanceConfigurationINTEL 句柄。

  • VUID-vkReleasePerformanceConfigurationINTEL-configuration-parent
    如果 configuration 是有效的句柄,则它必须已从 device 创建、分配或检索。

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

返回代码
成功
  • VK_SUCCESS

失败
  • VK_ERROR_TOO_MANY_OBJECTS

  • VK_ERROR_OUT_OF_HOST_MEMORY

仅结果状态查询

结果状态查询只有一个目的:允许应用程序确定一组操作是否已成功完成,如使用 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR 标志检索查询结果时写入的 VkQueryResultStatusKHR 值所指示。

与其他查询类型不同,结果状态查询除了完成状态之外,不跟踪或维护任何其他数据,因此在检索其结果时不会写入任何其他数据。

通过 VkQueueFamilyQueryResultStatusPropertiesKHR::queryResultStatusSupport 指示对结果状态查询的支持,如 vkGetPhysicalDeviceQueueFamilyProperties2 为相关队列族返回的值所示。

视频编码反馈查询

视频编码反馈查询允许应用程序捕获由视频编码操作生成的反馈值。因此,视频编码反馈查询在支持视频编码操作的队列族上可用。各个视频编码反馈值的可用性由 VkVideoEncodeCapabilitiesKHR::supportedEncodeFeedbackFlags 的位指示,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对查询旨在使用的视频配置文件 返回。

启用的一组视频编码反馈值必须在使用 VkQueryPoolVideoEncodeFeedbackCreateInfoKHRencodeFeedbackFlags 成员创建查询池时配置,该结构包含在 VkQueryPoolCreateInfopNext 链中。

VkQueryPoolVideoEncodeFeedbackCreateInfoKHR 结构定义如下:

// Provided by VK_KHR_video_encode_queue
typedef struct VkQueryPoolVideoEncodeFeedbackCreateInfoKHR {
    VkStructureType                  sType;
    const void*                      pNext;
    VkVideoEncodeFeedbackFlagsKHR    encodeFeedbackFlags;
} VkQueryPoolVideoEncodeFeedbackCreateInfoKHR;
  • sType 是一个 VkStructureType 值,用于标识此结构。

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

  • encodeFeedbackFlags 是一个 VkVideoEncodeFeedbackFlagBitsKHR 值的位掩码,用于指定新池的查询捕获的已启用视频编码反馈值的集合。

有效用法(隐式)
  • VUID-VkQueryPoolVideoEncodeFeedbackCreateInfoKHR-sType-sType
    sType 必须VK_STRUCTURE_TYPE_QUERY_POOL_VIDEO_ENCODE_FEEDBACK_CREATE_INFO_KHR

  • VUID-VkQueryPoolVideoEncodeFeedbackCreateInfoKHR-encodeFeedbackFlags-parameter
    encodeFeedbackFlags 必须VkVideoEncodeFeedbackFlagBitsKHR 值的有效组合

  • VUID-VkQueryPoolVideoEncodeFeedbackCreateInfoKHR-encodeFeedbackFlags-requiredbitmask
    encodeFeedbackFlags 不能0

对于视频编码反馈查询池,可以在 VkQueryPoolVideoEncodeFeedbackCreateInfoKHR::encodeFeedbackFlags 中设置的位是:

// Provided by VK_KHR_video_encode_queue
typedef enum VkVideoEncodeFeedbackFlagBitsKHR {
    VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR = 0x00000001,
    VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR = 0x00000002,
    VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR = 0x00000004,
} VkVideoEncodeFeedbackFlagBitsKHR;
  • VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR 指定池管理的查询将捕获视频编码操作写入 VkVideoEncodeInfoKHR::dstBuffer 中指定的比特流数据的字节偏移量,该偏移量相对于 VkVideoEncodeInfoKHR::dstBufferOffset 中指定的偏移量。对于任何 视频编码命令 发出的第一个视频编码操作,此值将始终为零,这意味着比特流数据始终从 VkVideoEncodeInfoKHR::dstBufferOffset 中指定的偏移量开始写入 VkVideoEncodeInfoKHR::dstBuffer 中指定的缓冲区。

  • VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR 指定池管理的查询将捕获视频编码操作写入 VkVideoEncodeInfoKHR::dstBuffer 中指定的比特流缓冲区的字节数。

  • VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_HAS_OVERRIDES_BIT_KHR 指定池管理的查询将捕获一个布尔值,该值指示写入 VkVideoEncodeInfoKHR::dstBuffer 中指定的比特流缓冲区的数据是否包含覆盖的参数

当检索视频编码反馈查询的结果时,与每个启用的视频编码反馈相对应的值会按照上面定义的位的顺序写入,如果指定了 VK_QUERY_RESULT_WITH_AVAILABILITY_BITVK_QUERY_RESULT_WITH_STATUS_BIT_KHR,则后面会跟一个可选的值,表示可用性或结果状态。

如果视频编码反馈查询的结果状态为负数,则所有已启用的视频编码反馈值的结果将是未定义的

在检索视频编码反馈查询的结果时,应用程序应始终指定 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR,并且对于任何未成功完成的视频编码操作,忽略这些未定义的视频编码反馈值。

// Provided by VK_KHR_video_encode_queue
typedef VkFlags VkVideoEncodeFeedbackFlagsKHR;

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