查询
查询池
查询使用查询池对象进行管理。每个查询池是特定类型特定数量的查询的集合。
查询池由 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 句柄的指针,该句柄将返回生成的查询池对象。
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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
flags
保留供将来使用。 -
queryType
是一个 VkQueryType 值,用于指定池管理的查询类型。 -
queryCount
是池管理的查询数量。 -
pipelineStatistics
是一个 VkQueryPipelineStatisticFlagBits 的位掩码,指定将在新池的查询中返回哪些计数器,如下面管线统计查询中所述。
如果 queryType
不是 VK_QUERY_TYPE_PIPELINE_STATISTICS
,则忽略 pipelineStatistics
。
// 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
queueFamilyIndex
是创建此性能查询池的队列族索引。 -
counterIndexCount
是pCounterIndices
数组的长度。 -
pCounterIndices
是指向索引数组的指针,该索引指向 vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR::pCounters
以在此性能查询池中启用。
要查询物理设备上查询性能查询池所需的通道数,请调用
// 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
中返回。
要销毁一个查询池,请调用
// Provided by VK_VERSION_1_0
void vkDestroyQueryPool(
VkDevice device,
VkQueryPool queryPool,
const VkAllocationCallbacks* pAllocator);
-
device
是销毁查询池的逻辑设备。 -
queryPool
是要销毁的查询池。 -
pAllocator
控制主机内存分配,如内存分配章节中所述。
应用程序可以通过检查不带 |
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;
-
VK_QUERY_TYPE_OCCLUSION
指定一个遮挡查询。 -
VK_QUERY_TYPE_PIPELINE_STATISTICS
指定一个管线统计查询。 -
VK_QUERY_TYPE_TIMESTAMP
指定一个时间戳查询。 -
VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR
指定一个性能查询。 -
VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT
指定一个变换反馈查询。 -
VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT
指定一个图元生成查询。 -
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR
指定一个用于 vkCmdWriteAccelerationStructuresPropertiesKHR 或 vkWriteAccelerationStructuresPropertiesKHR 的 加速结构大小查询。 -
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR
指定一个序列化加速结构大小查询。 -
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR
指定一个用于 vkCmdWriteAccelerationStructuresPropertiesKHR 或 vkWriteAccelerationStructuresPropertiesKHR 的 加速结构大小查询。 -
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR
指定一个序列化加速结构指针计数查询。 -
VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_NV
指定一个用于 vkCmdWriteAccelerationStructuresPropertiesNV 的 加速结构大小查询。 -
VK_QUERY_TYPE_PERFORMANCE_QUERY_INTEL
指定一个 英特尔性能查询。 -
VK_QUERY_TYPE_RESULT_STATUS_ONLY_KHR
指定一个 结果状态查询。 -
VK_QUERY_TYPE_VIDEO_ENCODE_FEEDBACK_KHR
指定一个 视频编码反馈查询。 -
VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT
指定一个 生成的网格图元查询。
查询操作
查询的操作由命令 vkCmdBeginQuery、vkCmdEndQuery、vkCmdBeginQueryIndexedEXT、vkCmdEndQueryIndexedEXT、vkCmdResetQueryPool、vkCmdCopyQueryPoolResults、vkCmdWriteTimestamp2 和 vkCmdWriteTimestamp 控制。
为了使 VkCommandBuffer
记录查询管理命令,为其创建 VkCommandPool
的队列族必须支持适用于给定查询池的查询类型的相应操作类型(图形、计算)。
查询池中的每个查询都有一个状态,要么是不可用,要么是可用,并且还具有用于存储创建查询池时请求的查询操作的数值结果的状态。通过 vkCmdResetQueryPool 或 vkResetQueryPool 重置查询会将状态设置为不可用,并使数值结果未定义。通过 vkCmdEndQuery、vkCmdEndQueryIndexedEXT、vkCmdWriteTimestamp2 或 vkCmdWriteTimestamp 的操作使查询可用。可用性状态和数值结果可以通过调用 vkGetQueryPoolResults 或 vkCmdCopyQueryPoolResults 来检索。
在查询池创建之后,每个查询都处于未初始化状态,并且在使用之前必须重置。查询在使用之间也必须重置。
如果逻辑设备包含多个物理设备,则每个写入查询的命令必须在单个物理设备上执行,并且任何对 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] 的状态设置为不可用。
此命令定义了引用同一查询的其他查询命令之间的执行依赖关系。
此命令的操作发生在第一个范围之后,并且发生在第二个范围之前。
如果用于创建 queryPool
的 queryType
为 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR
,则此命令会将查询索引 [firstQuery
, firstQuery
+ queryCount
- 1] 的状态设置为不可用,对于 queryPool
的每次pass,如调用 vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR 所指示。
由于 |
要在主机上重置查询池中的一系列查询,请调用
// 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] 的状态设置为不可用。
如果 queryPool
为 VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR
,则此命令会将查询索引 [firstQuery
, firstQuery
+ queryCount
- 1] 的状态设置为对于每个 pass 都是不可用的。
一旦查询被重置并准备好使用,就可以向命令缓冲区发出查询命令。遮挡查询和管线统计查询分别计算事件——绘制的样本和管线阶段的调用——这些事件是由在指定的命令缓冲区内的 vkCmdBeginQuery 命令和 vkCmdEndQuery 命令之间记录的命令产生的,有效地限定了一组绘制和/或调度命令的范围。时间戳查询将时间戳写入查询池。性能查询将性能计数器记录到查询池。
查询必须在同一个命令缓冲区中开始和结束。但是,如果它是主命令缓冲区,并且启用了inheritedQueries
特性,则在查询操作期间可以执行二级命令缓冲区。为了在查询活动期间执行二级命令缓冲区,它必须将VkCommandBufferInheritanceInfo的occlusionQueryEnable
、queryFlags
和/或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 的位掩码,指定可以执行的查询类型的约束。
如果池的 queryType
是 VK_QUERY_TYPE_OCCLUSION
并且 flags
包含 VK_QUERY_CONTROL_PRECISE_BIT
,则实现必须返回与实际传递的样本数匹配的结果。这在遮挡查询中有更详细的描述。
调用 vkCmdBeginQuery
等效于调用 vkCmdBeginQueryIndexedEXT,并将 index
参数设置为零。
开始查询后,该查询在其被调用的命令缓冲区内被认为是活动的,直到该查询结束为止。在执行二级命令缓冲区时,主命令缓冲区中活动的查询被认为对这些二级命令缓冲区是活动的。
此外,如果查询在视频编码范围之内启动,则为查询类型初始化以下命令缓冲区状态:
每个视频编码操作都会将结果存储到与当前活动查询索引对应的查询中,然后递增活动查询索引。如果活动查询索引递增超过了最后一个可激活查询索引,则发布任何进一步的视频编码操作将导致未定义的行为。
实际上,这意味着目前在开始和结束查询对之间必须发出不超过一个视频编码操作。 |
此命令定义了引用同一查询的其他查询命令之间的执行依赖关系。
此命令的操作发生在第一个范围之后,并且发生在第二个范围之前。
要开始索引查询,请调用
// 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_EXT
或VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT
时,索引表示顶点流。
vkCmdBeginQueryIndexedEXT
命令的操作与 vkCmdBeginQuery 命令相同,只是它还接受特定于查询类型的 index
参数。
此命令定义了引用同一查询索引的其他查询命令之间的执行依赖关系。
此命令的操作发生在第一个范围之后,并且发生在第二个范围之前。
在 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
标识的查询,并将其标记为可用。
此命令定义了引用同一查询的其他查询命令之间的执行依赖关系。
第二个 同步范围 仅包含此命令的操作。
调用 vkCmdEndQuery
等效于调用 vkCmdEndQueryIndexedEXT 并将 index
参数设置为零。
要在记录完所需的绘制或分派命令集后结束索引查询,请调用
// Provided by VK_EXT_transform_feedback
void vkCmdEndQueryIndexedEXT(
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t query,
uint32_t index);
-
commandBuffer
是将记录此命令的命令缓冲区。 -
queryPool
是管理查询结果的查询池。 -
query
是查询池中存储结果的查询索引。 -
index
是查询类型特定的索引。
此命令完成 queryPool
中由 query
和 index
标识的查询,并将其标记为可用。
vkCmdEndQueryIndexedEXT
命令的操作与 vkCmdEndQuery 命令相同,只不过它还接受一个查询类型特定的 index
参数。
此命令定义了引用同一查询索引的其他查询命令之间的执行依赖关系。
第二个 同步范围 仅包含此命令的操作。
应用程序可以通过请求将结果写入应用程序提供的内存,或通过请求将其复制到 VkBuffer
中来检索结果。无论哪种情况,内存中的布局都定义如下:
-
第一个查询的结果从命令请求的第一个字节开始写入,每个后续查询的结果从
stride
字节之后开始。 -
遮挡查询、管线统计查询、变换反馈查询、图元生成查询、网格着色器查询、视频编码反馈查询和时间戳查询将结果存储在紧密排列的无符号整数数组中,可以是 32 位或 64 位,具体取决于命令的请求,存储数值结果,并且如果请求了可用性状态,也会存储该状态。
-
性能查询将结果存储在紧密排列的数组中,其类型由相应 VkPerformanceCounterKHR 的
unit
成员确定。 -
如果使用了
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
是要读取的查询数量。 -
dataSize
是pData
指向的缓冲区的大小(以字节为单位)。 -
pData
是指向应用程序分配的缓冲区的指针,结果将写入其中。 -
stride
是pData
中各个查询的结果之间的步幅(以字节为单位)。 -
flags
是 VkQueryResultFlagBits 的位掩码,指定如何以及何时返回结果。
为查询写入的任何结果都根据 依赖于查询类型的布局写入。
如果在 flags
中未设置任何位,并且所有请求的查询都处于可用状态,则结果将写入为 32 位无符号整数值的数组。当并非所有查询都可用时的行为将在 下方描述。
如果设置了 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT
,则 queryPool
中由 firstQuery
和 queryCount
标识的所有查询的结果都会复制到 pData
,并在每个查询的结果之后直接写入一个额外的可用性或状态值,并将其解释为无符号整数。值为零表示结果尚不可用,否则查询已完成,并且结果可用。如果 flags
中设置了 VK_QUERY_RESULT_64_BIT
,则可用性或状态值的大小为 64 位。否则,它为 32 位。
如果设置了 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR
,则由 firstQuery
和 queryCount
标识的 queryPool
中所有查询的结果,以及紧随每个查询结果之后写入的额外状态值(解释为有符号整数),都会被复制到 pData
中。值为零表示结果尚不可用。正值表示查询内的操作已成功完成,并且查询结果有效。负值表示查询内的操作未成功完成。
VkQueryResultStatusKHR 定义了此处返回的值的具体含义,但实现可以自由返回其他值。
如果写入的状态值为负数,表示查询内的操作未成功完成,则此命令写入的所有其他结果都是未定义的,除非为所用查询类型的任何结果另有规定。
如果设置了 |
此命令写入的任何可用查询的结果都是最终的,表示查询的最终结果。如果设置了 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
中由 firstQuery
和 queryCount
指示的任何查询的 vkCmdEndQuery、vkCmdEndQueryIndexedEXT、vkCmdWriteTimestamp2 和 vkCmdWriteTimestamp 的所有实例。第二个同步范围包括此命令的主机操作。
如果未设置 VK_QUERY_RESULT_WAIT_BIT
,如果存在处于不可用状态的查询,则 vkGetQueryPoolResults
可能返回 VK_NOT_READY
。
应用程序必须注意确保使用 例如,如果之前使用过查询,并且命令缓冲区记录了该查询的命令 当 使用 |
应用程序可以使用双缓冲查询池,每个帧一个池,并在读取查询的帧末尾重置查询。 |
以下位可以在 vkGetQueryPoolResults::flags
和 vkCmdCopyQueryPoolResults::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
是查询的数量。firstQuery
和queryCount
一起定义一个查询范围。 -
dstBuffer
是一个 VkBuffer 对象,它将接收复制命令的结果。 -
dstOffset
是dstBuffer
中的偏移量。 -
stride
是dstBuffer
中各个查询结果之间的字节步幅。dstBuffer
的后备内存所需大小的确定方式与上述 vkGetQueryPoolResults 的描述相同。 -
flags
是 VkQueryResultFlagBits 的位掩码,指定如何以及何时返回结果。
为查询写入的任何结果都根据 依赖于查询类型的布局写入。
对于 queryPool
中由 firstQuery
和 queryCount
标识的任何可用查询的结果,都会复制到 dstBuffer
中。
如果设置了 VK_QUERY_RESULT_WITH_AVAILABILITY_BIT
,则 queryPool
中由 firstQuery
和 queryCount
标识的所有查询的结果,以及每个查询结果后直接写入的额外的可用性值,都会被复制到 dstBuffer
中,并将该值解释为无符号整数。值为零表示结果尚不可用,否则表示查询已完成且结果可用。
如果设置了 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR
,则 queryPool
中由 firstQuery
和 queryCount
标识的所有查询的结果,以及每个查询结果后直接写入的额外的状态值,都会被复制到 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
,则vkCmdEndQueryIndexedEXT、vkCmdWriteTimestamp2、vkCmdEndQuery和vkCmdWriteTimestamp将不包括在此范围内。
此命令的操作发生在第一个范围之后,并且发生在第二个范围之前。
vkCmdCopyQueryPoolResults
被视为传输操作,其对缓冲区内存的写入必须在使用结果之前使用VK_PIPELINE_STAGE_TRANSFER_BIT
和VK_ACCESS_TRANSFER_WRITE_BIT
进行同步。
诸如清除、MSAA 解析、附件加载/存储操作和 blit 之类的渲染操作可能会影响查询的结果。此行为取决于具体实现,并且可能因实现中使用的路径而异。例如,某些实现有几种类型的清除,其中一些可能包括顶点,而另一些则不包括。
遮挡查询
遮挡查询跟踪一组绘制命令中通过每个片段测试的样本数量。因此,遮挡查询仅在支持图形操作的队列族上可用。然后,应用程序可以使用这些结果来为未来的渲染决策提供信息。遮挡查询分别通过调用vkCmdBeginQuery
和vkCmdEndQuery
开始和结束。当遮挡查询开始时,通过样本的计数始终从零开始。对于每个绘制命令,计数会按照样本计数中所述的方式递增。如果flags
不包含VK_QUERY_CONTROL_PRECISE_BIT
,则如果通过的样本计数不为零,则实现可能为查询生成任何非零结果值。
在某些实现中,不设置 设置 |
当遮挡查询完成时,该查询的结果会被标记为可用。应用程序可以选择将结果复制到缓冲区(通过 vkCmdCopyQueryPoolResults
),或者请求将其放入主机内存(通过 vkGetQueryPoolResults
)。
如果遮挡几何体不是首先绘制的,那么采样可能会通过深度测试,但仍然在最终图像中不可见。 |
管线统计查询
管线统计查询允许应用程序采样一组指定的 VkPipeline
计数器。Vulkan 为一组绘制或分派命令累积这些计数器,当管线统计查询处于活动状态时。因此,管线统计查询在支持图形或计算操作的队列族上可用。管线统计查询的可用性由 VkPhysicalDeviceFeatures
对象的 pipelineStatisticsQuery
成员指示(有关在 VkDevice
上检测和请求此查询类型,请参阅 vkGetPhysicalDeviceFeatures
和 vkCreateDevice
)。
通过分别调用 vkCmdBeginQuery
和 vkCmdEndQuery
来开始和结束管线统计查询。当管线统计查询开始时,所有统计计数器都会设置为零。当查询处于活动状态时,管线类型确定可用的统计信息集,但这些必须在创建查询池时配置。如果在不支持相应操作的命令缓冲区上发出统计计数器,或者计数器对应于在查询处于活动状态时使用的任何管线中都缺失的着色阶段,则在查询可用后该计数器的值是未定义的。必须启用至少一个与记录命令缓冲区上支持的操作相关的统计计数器。
以下是在 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 指令OpEndPrimitive
或OpEndStreamPrimitive
重启图元拓扑对几何着色器输出图元计数没有影响。 -
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
生成的整数值。与其他查询不同,时间戳不作用于某个范围,因此不使用 vkCmdBeginQuery 或 vkCmdEndQuery。该机制围绕一组命令构建,允许应用程序告知 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
被提交到队列时,它定义了对之前提交的命令的执行依赖关系,并将时间戳写入查询池。
第二个 同步范围 仅包括时间戳写入操作。
实现可以在逻辑上晚于 |
如果同一提交中的时间戳写入发生于另一个时间戳写入之后,则其值必须不低于另一个时间戳写入的值,除非其值溢出了查询支持的最大整数位宽。如果启用 VK_KHR_calibrated_timestamps
或 VK_EXT_calibrated_timestamps
,则这会扩展到同一逻辑设备上所有提交中的时间戳写入:任何时间戳写入如果发生于另一个时间戳写入之后,则其值必须不低于另一个时间戳写入的值,除非其值溢出了查询支持的最大整数位宽。此命令写入的时间戳必须位于 VK_TIME_DOMAIN_DEVICE_KHR
时间域中。如果发生溢出,时间戳值必须回绕到零。
时间戳之间的比较应在保证不会减少的时间戳之间进行。例如,从较新的时间戳中减去较旧的时间戳以确定一系列命令的执行时间,只有当两个时间戳写入是在同一提交中执行的,或者写入是在同一逻辑设备上执行并且启用了 |
如果 vkCmdWriteTimestamp2
在执行启用了多视图的渲染过程实例时调用,则时间戳在查询池中使用 N 个连续的查询索引(从 query
开始),其中 N 是执行该命令的子通道的视图掩码中设置的位数。生成的查询值由以下行为之一的实现定义选择决定
-
第一个查询是时间戳值,并且(如果视图掩码中设置了多于一位),则将其余查询写入零。如果在同一子通道中写入了两个时间戳,则这些命令之间所有视图的执行时间之和是每个命令写入的第一个查询之间的差值。
-
所有 N 个查询都是时间戳值。如果在同一子通道中写入了两个时间戳,则这些命令之间所有视图的执行时间之和是每个命令写入的相应查询之间的差值之和。相应查询之间的差值可以是单个视图的执行时间。
在任何一种情况下,应用程序可以对所有 N 个查询之间的差值求和,以确定总执行时间。
要请求时间戳并将值写入内存,请调用
// Provided by VK_VERSION_1_0
void vkCmdWriteTimestamp(
VkCommandBuffer commandBuffer,
VkPipelineStageFlagBits pipelineStage,
VkQueryPool queryPool,
uint32_t query);
-
commandBuffer
是将记录命令的命令缓冲区。 -
pipelineStage
是VkPipelineStageFlagBits值,指定管线的一个阶段。 -
queryPool
是将管理时间戳的查询池。 -
query
是查询池中将包含时间戳的查询。
当vkCmdWriteTimestamp
提交到队列时,它定义了对在其之前提交的命令的执行依赖性,并将时间戳写入查询池。
第二个 同步范围 仅包括时间戳写入操作。
实现可以在逻辑上晚于 |
如果同一提交中的时间戳写入发生于另一个时间戳写入之后,则其值必须不低于另一个时间戳写入的值,除非其值溢出了查询支持的最大整数位宽。如果启用 VK_KHR_calibrated_timestamps
或 VK_EXT_calibrated_timestamps
,则这会扩展到同一逻辑设备上所有提交中的时间戳写入:任何时间戳写入如果发生于另一个时间戳写入之后,则其值必须不低于另一个时间戳写入的值,除非其值溢出了查询支持的最大整数位宽。此命令写入的时间戳必须位于 VK_TIME_DOMAIN_DEVICE_KHR
时间域中。如果发生溢出,时间戳值必须回绕到零。
时间戳之间的比较应在保证不会减少的时间戳之间进行。例如,从较新的时间戳中减去较旧的时间戳以确定一系列命令的执行时间,只有当两个时间戳写入是在同一提交中执行的,或者写入是在同一逻辑设备上执行并且启用了 |
如果vkCmdWriteTimestamp
在执行启用了多视图的渲染过程实例时调用,则时间戳使用查询池中N个连续查询索引(从query
开始),其中N是执行命令的子过程的视图掩码中设置的位数。结果查询值由以下行为之一的实现相关选择确定
-
第一个查询是时间戳值,并且(如果视图掩码中设置了多于一位),则将其余查询写入零。如果在同一子通道中写入了两个时间戳,则这些命令之间所有视图的执行时间之和是每个命令写入的第一个查询之间的差值。
-
所有 N 个查询都是时间戳值。如果在同一子通道中写入了两个时间戳,则这些命令之间所有视图的执行时间之和是每个命令写入的相应查询之间的差值之和。相应查询之间的差值可以是单个视图的执行时间。
在任何一种情况下,应用程序可以对所有 N 个查询之间的差值求和,以确定总执行时间。
性能查询
性能查询 为应用程序提供了一种机制,用于获取有关命令缓冲区、渲染通道和命令执行的性能计数器信息。
每个队列族都会通过调用 vkEnumeratePhysicalDeviceQueueFamilyPerformanceQueryCountersKHR 公布可以在该队列族的队列上查询的性能计数器。 实现 可能 会根据平台要求或仅针对开发目的的专用驱动程序限制对性能计数器的访问。
这可能包括不枚举任何性能计数器,或仅枚举减少的集合。 请参阅特定于平台的文档,以获取有关任何此类限制的指导。 |
性能查询使用现有的 vkCmdBeginQuery 和 vkCmdEndQuery 来控制要获取性能信息的命令缓冲区、渲染通道或命令。
实现 可能 需要多次传递,其中记录的命令缓冲区、渲染通道或命令相同,并且在同一队列上执行以记录性能计数器数据。 这是通过提交相同的批次并提供包含计数器传递索引的 VkPerformanceQuerySubmitInfoKHR 结构来实现的。可以通过调用 vkGetPhysicalDeviceQueueFamilyPerformanceQueryPassesKHR 来查询给定性能查询池所需的传递次数。
使用 |
可以使用命令 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
结构的指针,其中包含有关如何获取性能分析的信息。
实现 可能 允许多个参与者同时持有性能分析锁。
VkAcquireProfilingLockInfoKHR
结构定义为
// Provided by VK_KHR_performance_query
typedef struct VkAcquireProfilingLockInfoKHR {
VkStructureType sType;
const void* pNext;
VkAcquireProfilingLockFlagsKHR flags;
uint64_t timeout;
} VkAcquireProfilingLockInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
flags
保留供将来使用。 -
如果性能分析锁不可用,
timeout
表示函数等待的时间(以纳秒为单位)。
如果 timeout
为 0,则 vkAcquireProfilingLockKHR
在尝试获取性能分析锁时不会阻塞。如果 timeout
为 UINT64_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
是要停止性能分析的逻辑设备。
转换反馈查询
转换反馈查询跟踪被捕获的顶点流尝试写入和实际写入到转换反馈缓冲区的图元数量。此查询在转换反馈处于活动状态时,在绘制命令期间更新。如果绑定的转换反馈缓冲区的大小对于实际绘制的图元数量太小,则实际写入的图元数量将小于尝试写入的图元数量。图元不会写入到超出转换反馈缓冲区绑定范围的位置。通过分别调用 vkCmdBeginQuery
和 vkCmdEndQuery
来开始和结束转换反馈查询,以查询顶点流零。vkCmdBeginQueryIndexedEXT
和 vkCmdEndQueryIndexedEXT
可以 用于开始和结束任何支持的顶点流的转换反馈查询。当转换反馈查询开始时,写入的图元计数和需要的图元计数从零开始。对于每个绘制命令,当顶点属性输出被捕获到转换反馈缓冲区中且转换反馈处于活动状态时,计数会增加。
当转换反馈查询完成时,该查询的结果将被标记为可用。应用程序可以随后将结果复制到缓冲区(通过 vkCmdCopyQueryPoolResults
),或者请求将其放入主机内存(通过 vkGetQueryPoolResults
)。
生成的图元查询
当顶点流的生成的图元查询处于活动状态时,每当发送到该流的图元到达转换反馈阶段时,无论转换反馈是否处于活动状态,都会增加生成的图元计数。通过分别调用 vkCmdBeginQuery
和 vkCmdEndQuery
来开始和结束生成的图元查询,以查询顶点流零。vkCmdBeginQueryIndexedEXT
和 vkCmdEndQueryIndexedEXT
可以 用于开始和结束任何支持的顶点流的生成的图元查询。当生成的图元查询开始时,生成的图元计数从零开始。
当生成的图元查询完成时,该查询的结果将被标记为可用。应用程序可以随后将结果复制到缓冲区(通过 vkCmdCopyQueryPoolResults
),或者请求将其放入主机内存(通过 vkGetQueryPoolResults
)。
此查询的结果通常与 |
网格着色器查询
当生成的网格图元查询处于活动状态时,每当网格着色器阶段发出的图元到达片段着色器阶段时,网格图元生成计数都会增加。当生成的网格图元查询开始时,网格图元生成计数从零开始。
网格和任务着色器管线统计查询的工作方式与其他着色器阶段的调用查询相同,计算相应着色器阶段运行的次数。当统计查询开始时,调用计数器从零开始。
英特尔性能查询
英特尔性能查询允许应用程序捕获一组命令的性能数据。性能查询的使用方式与其他类型的查询类似。与现有查询的主要区别在于,生成的数据应交给能够生成人类可读结果的库,而不是由应用程序直接读取。
在创建性能查询池之前,使用以下调用初始化设备的性能查询:
// Provided by VK_INTEL_performance_query
VkResult vkInitializePerformanceApiINTEL(
VkDevice device,
const VkInitializePerformanceApiInfoINTEL* pInitializeInfo);
-
device
是用于查询的逻辑设备。 -
pInitializeInfo
是指向 VkInitializePerformanceApiInfoINTEL 结构的指针,该结构指定了初始化参数。
VkInitializePerformanceApiInfoINTEL
结构定义如下:
// Provided by VK_INTEL_performance_query
typedef struct VkInitializePerformanceApiInfoINTEL {
VkStructureType sType;
const void* pNext;
void* pUserData;
} VkInitializePerformanceApiInfoINTEL;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
pUserData
是应用程序数据的指针。
一旦性能查询操作完成,使用以下调用取消初始化设备的性能查询:
// Provided by VK_INTEL_performance_query
void vkUninitializePerformanceApiINTEL(
VkDevice device);
-
device
是用于查询的逻辑设备。
可以使用以下调用发现设备的某些性能查询功能:
// Provided by VK_INTEL_performance_query
VkResult vkGetPerformanceParameterINTEL(
VkDevice device,
VkPerformanceParameterTypeINTEL parameter,
VkPerformanceValueINTEL* pValue);
-
device
是要查询的逻辑设备。 -
parameter
是要查询的参数。 -
pValue
是指向 VkPerformanceValueINTEL 结构的指针,该结构中返回参数的类型和值。
以下是 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;
-
type
是一个 VkPerformanceValueTypeINTEL 值,用于指定返回数据的类型。 -
data
是一个 VkPerformanceValueDataINTEL 联合体,用于指定返回数据的值。
以下是 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 字符串的指针。该指针在传递给 vkGetPerformanceParameterINTEL 的device
参数的生命周期内有效。
// 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 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
performanceCountersSampling
描述应如何捕获性能查询。
以下是 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
是默认模式,应用程序在此模式下调用 vkCmdBeginQuery 和 vkCmdEndQuery 来记录性能数据。
为了帮助将查询结果与应用程序发出命令的特定点关联起来,可以使用以下调用在命令缓冲区中设置标记:
// Provided by VK_INTEL_performance_query
VkResult vkCmdSetPerformanceMarkerINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceMarkerInfoINTEL* pMarkerInfo);
在查询结束之前设置到命令缓冲区的最后一个标记将成为查询结果的一部分。
VkPerformanceMarkerInfoINTEL
结构的定义如下:
// Provided by VK_INTEL_performance_query
typedef struct VkPerformanceMarkerInfoINTEL {
VkStructureType sType;
const void* pNext;
uint64_t marker;
} VkPerformanceMarkerInfoINTEL;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
marker
是将记录到不透明查询结果中的标记值。
在监视系统上运行的整个应用程序集中应用程序的行为时,识别潜在大量性能数据中的绘制调用非常有用。为此,应用程序可以生成流标记,用于追溯特定绘制调用以及特定的性能数据项。
// Provided by VK_INTEL_performance_query
VkResult vkCmdSetPerformanceStreamMarkerINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceStreamMarkerInfoINTEL* pMarkerInfo);
-
commandBuffer
是一个 VkCommandBuffer,将向其中添加流标记。 -
pMarkerInfo
是指向 VkPerformanceStreamMarkerInfoINTEL 结构的指针,该结构描述要插入的标记。
VkPerformanceStreamMarkerInfoINTEL
结构的定义如下:
// Provided by VK_INTEL_performance_query
typedef struct VkPerformanceStreamMarkerInfoINTEL {
VkStructureType sType;
const void* pNext;
uint32_t marker;
} VkPerformanceStreamMarkerInfoINTEL;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
marker
是将记录到外部应用程序使用的报告中的标记值。
某些应用程序可能希望使用不同的设置来测量一组命令的效果。可以使用以下方法覆盖特定设置:
// Provided by VK_INTEL_performance_query
VkResult vkCmdSetPerformanceOverrideINTEL(
VkCommandBuffer commandBuffer,
const VkPerformanceOverrideInfoINTEL* pOverrideInfo);
-
commandBuffer
是进行覆盖的命令缓冲区。 -
pOverrideInfo
是指向 VkPerformanceOverrideInfoINTEL 结构的指针,该结构选择要覆盖的参数。
VkPerformanceOverrideInfoINTEL
结构定义如下:
// Provided by VK_INTEL_performance_query
typedef struct VkPerformanceOverrideInfoINTEL {
VkStructureType sType;
const void* pNext;
VkPerformanceOverrideTypeINTEL type;
VkBool32 enable;
uint64_t parameter;
} VkPerformanceOverrideInfoINTEL;
-
type
是要设置的特定的 VkPerformanceOverrideTypeINTEL。 -
enable
定义是否启用覆盖。 -
parameter
是覆盖的潜在必需参数。
指定性能覆盖类型的 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
句柄的指针,将在其中返回结果配置对象。
VkPerformanceConfigurationAcquireInfoINTEL
结构定义如下:
// Provided by VK_INTEL_performance_query
typedef struct VkPerformanceConfigurationAcquireInfoINTEL {
VkStructureType sType;
const void* pNext;
VkPerformanceConfigurationTypeINTEL type;
} VkPerformanceConfigurationAcquireInfoINTEL;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
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
是要使用的配置。
要释放设备性能配置,请调用:
// Provided by VK_INTEL_performance_query
VkResult vkReleasePerformanceConfigurationINTEL(
VkDevice device,
VkPerformanceConfigurationINTEL configuration);
-
device
是与要释放的配置对象关联的设备。 -
configuration
是要释放的配置对象。
仅结果状态查询
结果状态查询只有一个目的:允许应用程序确定一组操作是否已成功完成,如使用 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR
标志检索查询结果时写入的 VkQueryResultStatusKHR 值所指示。
与其他查询类型不同,结果状态查询除了完成状态之外,不跟踪或维护任何其他数据,因此在检索其结果时不会写入任何其他数据。
通过 VkQueueFamilyQueryResultStatusPropertiesKHR::queryResultStatusSupport
指示对结果状态查询的支持,如 vkGetPhysicalDeviceQueueFamilyProperties2 为相关队列族返回的值所示。
视频编码反馈查询
视频编码反馈查询允许应用程序捕获由视频编码操作生成的反馈值。因此,视频编码反馈查询在支持视频编码操作的队列族上可用。各个视频编码反馈值的可用性由 VkVideoEncodeCapabilitiesKHR::supportedEncodeFeedbackFlags
的位指示,该值由 vkGetPhysicalDeviceVideoCapabilitiesKHR 针对查询旨在使用的视频配置文件 返回。
启用的一组视频编码反馈值必须在使用 VkQueryPoolVideoEncodeFeedbackCreateInfoKHR 的 encodeFeedbackFlags
成员创建查询池时配置,该结构包含在 VkQueryPoolCreateInfo 的 pNext
链中。
VkQueryPoolVideoEncodeFeedbackCreateInfoKHR
结构定义如下:
// Provided by VK_KHR_video_encode_queue
typedef struct VkQueryPoolVideoEncodeFeedbackCreateInfoKHR {
VkStructureType sType;
const void* pNext;
VkVideoEncodeFeedbackFlagsKHR encodeFeedbackFlags;
} VkQueryPoolVideoEncodeFeedbackCreateInfoKHR;
-
sType
是一个 VkStructureType 值,用于标识此结构。 -
pNext
是NULL
或指向扩展此结构的结构的指针。 -
encodeFeedbackFlags
是一个 VkVideoEncodeFeedbackFlagBitsKHR 值的位掩码,用于指定新池的查询捕获的已启用视频编码反馈值的集合。
对于视频编码反馈查询池,可以在 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_BIT
或 VK_QUERY_RESULT_WITH_STATUS_BIT_KHR
,则后面会跟一个可选的值,表示可用性或结果状态。
如果视频编码反馈查询的结果状态为负数,则所有已启用的视频编码反馈值的结果将是未定义的。
在检索视频编码反馈查询的结果时,应用程序应始终指定 |
// Provided by VK_KHR_video_encode_queue
typedef VkFlags VkVideoEncodeFeedbackFlagsKHR;
VkVideoEncodeFeedbackFlagsKHR
是一个位掩码类型,用于设置零个或多个 VkVideoEncodeFeedbackFlagBitsKHR 的掩码。