Vulkan Cookbook 第三章 9 等待围栏

等待围栏

译者注:示例代码点击此处

当我们想知道何时完成提交命令的处理时,需要使用一个围栏并在命令缓冲区提交期间提供它。然后,应用程序可以检查围栏的状态并等待它发出信号。

怎么做...

1.获取创建的逻辑设备并使用其句柄初始化名为logical_device的VkDevice类型变量。
2.创建应用程序等待的围栏列表。将所有围栏的句柄储存在名为fences的std::vector类型变量中。
3.创建名为wait_for_all的VkBool32类型变量。如果应用程序应等到所有指定的围栏都发出信号,则使用值VK_TRUE对其进行初始化。如果应用程序应等到任何围栏变为信号(至少其中一个),则使用VK_FALSE值初始化变量。
4.创建一个名为timeout的uint64_t类型的变量。使用一个值初始化变量,该值指示应用程序应该等待多长时间(以纳秒位单位)。
5.调用vkWaitForFences( logical_device, static_cast(fences.size()), &fences[0], wait_for_all, timeout )。提供逻辑设备句柄,围栏向量的数量,指向fences变量第一个元素的指针,wait_for_all和超时变量。
6.检查呼叫的返回值。如果它等于VK_SUCCESS,则表示条件满足-一个或所有围栏(取决于wait_for_all变量的值)在指定时间内发出信号。如果不满足条件,将返回VK_TIMEOUT。

这个怎么运作...

vkWaitForFences()函数会在指定的时间段内组织应用程序,或者直到提交的围栏发出信号。这样我们就可以将应用程序与提交到设备队列的工作同步。这也是我们知道何时完成提交命令的处理方式。

在调用期间,我们可以提供多个围栏,而不仅仅是一个围栏,可以等到所有围栏都发出信号,或者只是其中任何一个。如果在指定的时间段内未满足条件,则该函数返回VK_TIMEOUT值。否则它返回VK_SUCCESS。

我们还可以通过简单为函数提供其句柄并指定超时值0来检查围栏的状态。这样vkWaitForFences()函数将不会阻塞并立即返回提供的围栏的当前状态值-如果围栏未发出信号(虽然没有执行真正的等待),则为VK_TIMEOUT值;如果围栏已经发出信号,则为VK_SUCCESS值。

导致应用程序等待的代码可能如下所示:

if( fences.size() > 0 ) {
  VkResult result = vkWaitForFences( logical_device, static_cast(fences.size()), fences.data(), wait_for_all, timeout );
  if( VK_SUCCESS != result ) {
    std::cout << "Waiting on fence failed." << std::endl;
    return false;
  }
  return true;
}
return false;

 

你可能感兴趣的:(Vulkan,Cookbook)