传输队列

缓冲复制指令需要提交给支持传输操作的队列执行,我们可以查询队列族是否支持VK_QUEUE_TRANSFER_BIT特性,确定是否可以使用缓冲复制指令。对于支持VK_QUEUE_GRAPHICS_BIT或VK_QUEUE_COMPUTE_BIT特性的队列族,VK_QUEUE_TRANSFER_BIT特性一定被支持,所以我们不需要显式地检测队列族是否支持VK_QUEUE_TRANSFER_BIT特性。

如果读者喜欢挑战,可以尝试使用其它支持传输操作的队列族。这需要读者按照下面对程序进行一定地修改:

  • 修改QueueFamilyIndices和findQueueFamilies显式地查找具有VK_QUEUE_TRANSFER_BIT特性,但不具有VK_QUEUE_GRAPHICS_BIT特性的队列族。

  • 修改createLogicalDevice函数,申请一个传输队列。

  • 创建另外一个指令池对象用于分配用于传输队列的指令缓冲对象。

  • 修改sharingMode为VK_SHARING_MODE_CONCURRENT。指定使用图形和传输两个队列族。

  • 提交传输指令(比如vkCmdCopyBuffer)给传输队列而不是之前的图形队列。

看起来需要修改的地方还比较多,但复杂的修改也更容易让我们对资源在队列族之间的共享有更深刻的理解。