Vulkan samples:vkQueueSubmit总是跟着vkWaitForFences

Vulkan samples: vkQueueSubmit always followed by vkWaitForFences?

本文关键字:vkWaitForFences samples vkQueueSubmit Vulkan      更新时间:2023-10-16

在 Vulkan 附带的 API 样本中,似乎在调用 vkQueueSubmit 之后总是有一个对vkWaitForFences的调用,无论是直接还是通过execute_queue_command_buffer(在 util_init.hpp 中)。对vkWaitForFences的调用将阻止 CPU 执行,直到 GPU 完成上一个vkQueueSubmit中的所有工作。这实际上不允许同时构建多个帧,这(理论上)极大地限制了性能。

这些调用是否需要,如果是,是否有另一种方法可以在构建新帧之前不要求 GPU 处于空闲状态?

我们在飞行中实现多个帧的方法是为每个交换链帧缓冲区设置一个围栏。然后仍然使用vkWaitForFences但等待((n+1)%num_fences)围栏。

这里有示例代码 https://imgtec.com/tools/powervr-early-access-program/

uint32_t current_buffer = num_swaps_ % swapchain_fences.size();
vkQueueSubmit(graphics_queue, 1, &submit_info, swapchain_fences[current_buffer]);
// Wait for a queuesubmit to finish so we can continue rendering if we are n-2 frames behind
if(num_swaps_ > swapchain_fences.size() - 1)
{
    uint32_t fence_to_wait_for = (num_swaps_ + 1) % swapchain_fences.size();
    vkWaitForFences(device, 1, &swapchain_fences[fence_to_wait_for], true, UINT64_MAX);
    vkResetFences(device, 1, &swapchain_fences[current_buffer]);
}