执行模型

vulkan公开一个或者多个device,每个device又会公开一个或多个queue,queue之间异步工作。 device的queue集合以family划分,每个family都支持一种或者多种功能。

Note

一个queue只能属于一个family,但是不同的family之间的功能是可以重叠的,也就是说一种功能的任务是可以发送给不同的family执行的。

一个family下的queue被认为是互相兼容的,为family分配的工作可以被这个family下的任意queue执行。 vulkan规范定义了queue可能支持以下的功能:

  • graphics
  • compute
  • video decode
  • video encode
  • protected memory management
  • sparse memory management
  • transfer

Device Memory

device的内存是通过应用程序管理的。每个device可以公开一个或者多个堆来表示不同的内存区域。这些内存堆要么是deivce-local的,要么是host-local的,不过都是对于device可见的,几种内存区域如下:

  • deivce-local:device本地上的内存
  • device-local,host visible:同样是device-local内存,但是对于host来说可见
  • host-local,host visible:host本地的内存。对host和device都可见

Queue操作

queue为device的执行引擎提供了接口。执行引擎的命令在执行时间之前记录到了命令缓冲区当中,然后再提交给queue去执行。命令缓冲区一旦提交到队列之后,执行就不再需要应用程序的干预了。

将Work提交到Queue使用的是queue submission命令,形如vkQueueSubmitvkQueueBindSparse,提交完成之后获得一个信号量的列表,可以用它在Work开始之前进行等待,以及获取执行完成的signal。Work本身,以及signal,信号量都是queue操作,queue操作一旦被queue submission命令提交就会将控制权返回给应用程序,简而言之,就是非阻塞的。

不同queue上操作,以及queue和host之间的操作是没有隐式的顺序约束的,可以按任何顺序执行。显式的顺序约束要通过信号量和fench来表示。

对单个队列的命令缓冲区提交是由提交顺序以及隐式的排序规则的,其他类型就没有了。

在fench和信号量收到信令之前,可以保证前面提交的queue操作都已经执行完毕了,并且这些queue操作的内存也已经可用了。等待一个fench和信号量收到信令就是保证在这之前的queue操作的变更对于后续的命令都是可见的。