创建信号量
译者注:示例代码点击此处
在我们提交命令并利用设备的处理能力之前,需要知道如何同步操作。信号量是用于同步的原语之一。它们准许我们协调提交到队列的操作。不仅在一个队列中,而且在一个逻辑设备中的不同队列之间。
当向队列提交命令时使用信号量。所以在我们提交命令缓冲区之前使用它们则需要创建它们。
怎么做...
1.获取已创建逻辑设备的句柄。将句柄储存在名为logical_device的VkDevice类型变量中。
2.创建名为semaphore_create_info的VkSemaphoreCreateInfo类型的变量中。使用以下值初始化其成员:
·sType为VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO
·pNext为nullptr
·flags为0
3.创建名为semaphore的VkSemaphore类型变量。在此变量中,将存储存创建的信号亮的句柄。
4.调用vkCreateSemaphore( logical_device, &semaphore_create_info, nullptr, &semaphore )。第一个参数为逻辑设备句柄,第二个参数为指向semaphore_create_info的指针,第三个参数为nullptr,第四个参数指向semaphore变量。
5.通过检查返回值是否等于VK_SUCCESS,确保信号量创建成功。
这个怎么运作...
信号量作为同步原语只有两种不同状态:信号或无信号。在命令缓冲区提交期间使用信号量。当我们将它们提供给发信号的信号量列表时,只要在给定批次内提交的所有工作完成,它们就会将其状态更改为发送信号。以类似的方式,当我们向队列提交命令时,可以指定提交的命令应该等到指定列表中的所有信号量都发出信号。这样可以协调提交到队列的工作并推迟依赖于其他命令结果的命令处理。
提示:当信号量被发出信号并且所有等待它们的命令都被恢复时,信号量会自动重置(它们将状态改为无信号)并且可以重复使用。
当我们从交换链获取图像时,也使用信号量。在这种情况下,当提交引用所获取图像的命令时同样也必须使用信号量。这些命令应该等到呈现引擎不再使用交换链图像,这由信号量信号操作指示。如下图所示:
信号量是使用vkCreateSemaphore()函数调用来创建的,创建过程中所需的参数是通过VkSemaphoreCreateInfo类型的变量提供的,如下所示:
VkSemaphoreCreateInfo semaphore_create_info = {
VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO,
nullptr,
0
};
要创建信号量,我们需要准备一个类似于这样的代码:
VkResult result = vkCreateSemaphore( logical_device, &semaphore_create_info, nullptr, &semaphore );
if( VK_SUCCESS != result ) {
std::cout << "Could not create a semaphore." << std::endl;
return false;
}
return true;
信号量只能用于同步提交到队列的工作,因为它们在内部协调图形硬件。应用程序无法访问信号量的状态。如果应用程序应与命令同步,则需要使用围栏(fences)。