Vulkan使两个命令缓冲区同步

Vulkan使两个命令缓冲区同步
前面介绍了将命令记录到命令缓冲区中,并将命令缓冲区提交给队列的方式,还介绍了创建信号的方式。本节介绍通过信号使两个命令缓冲区同步的方法,而且会详细介绍在一个命令缓冲区被处理完之前,延期处理另一个命令缓冲区的技巧。

准备工作

本节会继续使用“将命令缓冲区提交给队列”小节介绍过的自定义结构WaitSemaphore Info,下面是该数据类型的定义。

Vulkan使两个命令缓冲区同步

具体处理过程

(1)获取用于提交第一批命令缓冲区队列的句柄,将该句柄存储在一个VkQueue类型的变量中,将该变量命名为first_queue。
(2)创建当第一批命令缓冲区被执行完后切换为已发出状态的信号,将该信号存储在一个std::vector<WaitSemaphoreInfo>类型的变量中,将该变量命名为synchronizing_semaphores。创建一个管线阶段列表,第二批命令缓冲区应在这些管线阶段中等待信号,并将这些管线阶段存储在vector容器synchronizing_semaphores变量中。
(3)创建第一批命令缓冲区,并将它们提交给由first_queue变量代表的队列。将vector容器synchronizing_semaphores变量中的信号包含到将要发出信号的列表中。
(4)获取用于提交第二批命令缓冲区队列的句柄,将该句柄存储在一个VkQueue类型的变量中,将该变量命名为second_queue。
(5)创建第二批命令缓冲区并将它们提交给由second_queue变量代表的队列。将vector容器synchronizing_semaphores变量中的信号和管线阶段,包含到需要等待的信号和管线阶段列表中。

具体运行情况

本例会提交两批命令缓冲区。当第一批命令缓冲区被硬件处理完后,会把将要发出信号的列表中的所有信号都发出,我们只需要获取信号的句柄,因为在发出信号的过程中不需要使用管线阶段。

Vulkan使两个命令缓冲区同步
获取相同的信号,并在提交第二批命令缓冲区时使用这些信号,但这次我们既使用信号也使用管线阶段。第二批命令缓冲区会在指定的管线阶段等待信号,这意味着已提交命令缓冲区中的某些部分可能已经开始被处理,但是当它们到达指定的管线处理阶段时,处理过程会被暂停(如下图所示)。


Vulkan使两个命令缓冲区同步
本例展示了使提交给同一逻辑设备中不同队列的多个命令缓冲区中的作业同步的技巧。第二批命令缓冲区会被延期处理,直到第一批命令缓冲区中的所有命令都被处理完为止。

Vulkan使两个命令缓冲区同步

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战