跳到主要内容

:material-chevron-right-circle: vkCmdBeginQuery

函数原型

void vkCmdBeginQuery(
VkCommandBuffer commandBuffer,
VkQueryPool queryPool,
uint32_t query,
VkQueryControlFlags flags);

描述

开始查询操作。

参数

  • commandBuffer : 录制指令的命令缓冲区。
  • queryPool : 管理查询结果的查询池。
  • query : 在查询池中的索引。
  • flags : VkQueryControlFlagBits的掩码,指定查询的约束。

补充

VkQueryControlFlagBits 枚举定义:

typedef enum VkQueryControlFlagBits {
VK_QUERY_CONTROL_PRECISE_BIT = 0x00000001,
} VkQueryControlFlagBits;
  • VK_QUERY_CONTROL_PRECISE_BIT : 指定occlusion query(遮挡查询)结果的精度
    • 启用时(PRECISE_BIT):查询结果保证精确,但可能会降低性能。

    • 禁用时(默认):查询结果可能是近似值,但性能更高。

    适用场景:当需要准确的像素通过数(例如精确的遮挡剔除、性能分析)时启用。

返回值

代码示例

VkQueryPoolCreateInfo queryPoolInfo = {};
queryPoolInfo.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
queryPoolInfo.queryType = VK_QUERY_TYPE_OCCLUSION; // 遮挡查询类型
queryPoolInfo.queryCount = 1;

// 启用 PRECISE_BIT
queryPoolInfo.flags = VK_QUERY_CONTROL_PRECISE_BIT;

VkQueryPool queryPool;
vkCreateQueryPool(device, &queryPoolInfo, nullptr, &queryPool);

vkCmdBeginQuery(
commandBuffer,
queryPool,
0, // 查询索引
VK_QUERY_CONTROL_PRECISE_BIT // 启用精确查询
);

// 绘制需要测试的几何体
vkCmdDrawIndexed(commandBuffer, ...);

vkCmdEndQuery(commandBuffer, queryPool, 0);

// 获取查询结果
uint64_t result;
vkGetQueryPoolResults(
device,
queryPool,
0, 1, sizeof(uint64_t),
&result, sizeof(uint64_t),
VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT
);