: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
);