Vulkan等待栅栏
当想要了解何时已提交的命令会被执行完时,就需要在提交命令缓冲区的过程中提供栅栏。这样应用程序就可以检查栅栏的状态并等待,直到栅栏的状态变为已发出为止。
具体处理过程
(1)获取已创建逻辑设备的句柄,将该句柄存储在一个VkDevice类型的变量中,将该变量命名为logical_device。
(2)创建一个栅栏列表,在该列表中添加应用程序需要等待的栅栏,将该列表中所有栅栏的句柄存储在一个std::vector<VkFence>
类型的变量中,将该变量命名为fences。
(3)创建一个VkBool32类型的变量,将其命名为wait_for_all。如果应用程序需要等待该列表中的所有栅栏的状态都变为已发出,就将VK_TRUE赋予wait_for_all变量。如果应用程序需要等待该列表中的部分栅栏(至少一个)的状态变为已发出,就将VK_FALSE赋予wait_for_all变量。
(4)创建一个uint64_t类型的变量,将其命名为timeout。将超时时间值(以纳秒为单位)赋予该变量,指明应用程序应该等待的最长时间。
(5)调用vkWaitForFences(logical_device,static_cast<uint32_t>(fences.size()),&fences[0],wait_for_all,timeout)
函数。将第一个参数设置为逻辑设备的句柄;将第二个参数设置为vector容器fences变量中含有元素的数量;将第三个参数设置为指向vector容器fences变量中第一个元素的指针;将第四个参数设置为wait_for_all变量;将第五个参数设置为timeout变量。
(6)检查该函数调用操作的返回值。如果该值等于VK_SUCCESS,就意味着满足条件,即一个或所有栅栏(由wait_for_all变量的值决定)会在指定时限内转换为已发出状态。如果没有满足条件,该函数调用操作的返回值就会等于VK_TIMEOUT。
具体运行情况
vkWaitForFences()函数会在一段时间内阻塞应用程序,直到指定栅栏的状态变为已发出为止。这样就可以使应用程序与提交给设备中队列的作业同步,这也是我们了解已提交的命令何时会被执行完的途径。
在调用vkWaitForFences()函数时,我们可以使用多个栅栏,并非只能使用一个栅栏。我们还可以使应用程序等待直到所有或某个(些)栅栏的状态变为已发出为止。如果在指定时限内,没有满足条件[所有或某个(些)栅栏的状态没有变为已发出],vkWaitForFences()函数就会返回VK_TIMEOUT;否则,vkWaitForFences()函数就会返回VK_SUCCESS。
通过将超时时间值设置为0,使用栅栏的句柄调用vkWaitForFences()函数,还可以检查栅栏的状态。这样,vkWaitForFences()函数就不会阻塞应用程序,而且会立刻返回指明栅栏当前状态的值,即VK_TIMEOUT代表栅栏还未发出(因为应用程序没有真正等待过),VK_SUCCESS代表栅栏已经发出。
通过下列代码可以使应用程序等待。


酷客网相关文章:
评论前必须登录!
注册