[VKSpec翻译]第二章 基础

2. 基础

本章将会介绍关于Vulkan的一些基础概念,比如架构、执行模型、API命名、队列、管线配置、数字的标识、状态和状态查询、以及不同种类的对象和着色器。本章中只是系统的介绍,但是它是我们理解后文中对命令和行为更具地的描述的基础。

2.1. 主机和设备环境

Vulkan规范假定并要求主机环境属性需满足:

  • 主机必须支持 8, 16, 32 和 64 位的有、无符号的二进制补码证书,并且在其大小的粒度(字节)下可寻址。
  • 主机必须支持 32 和 64 位的浮点型, 其精度和范围要求在
    Floating Point Computation 节中介绍。
  • 上述类型在主机上的表示以及字节顺序必须与所有物理设备所支持的一样。
注意
由于Vulkan中的很多的类型和结构都可能需要同时支持主机和物理设备的操作和访问,因此为了编写可移植的和可执行的应用程序,其实现应当能够在两者中都较为高效地访问数据。

2.2. 执行模型

本节将概括的介绍Vulkan的执行模型。

我们可以使用Vulkan创建一个或多个设备(devices),每一个设备又可以用来创建一个或多个队列(queues),这些队列可能相互异步执行。设备所支持的不同队列被划分到多个家族(families)当中。而每个家族可能支持一个或多个功能,同时也可能包含多个具有相似特征的队列。在相同的家族中的队列相互是兼容(compatible)的,提交给某个家族队列的工作可以被在这个家族中的任何队列所调用。在本规范中,我们定义一个队列可能支持这四种功能:渲染,计算,转移和稀疏内存管理①。

(译者注:①中的四种功能原文中为graphics, compute, transfer 和 sparse memory management,译者并没有对Vulkan有深入的了解所以只能直译,如果有误还请多多指教)

注意
一个单独的设备可能会反馈多个相似的队列家族,同时也可能会反馈这些家族的多个成员。我们需要注意,尽管相似家族可能具有相似的功能,但他们却并不是相互直接兼容的。

设备的内存是由应用程序明确的管理的,每个设备可能使用一个或者多个堆来表示不同的内存区域。内存堆存在于设备本地和主机本地二者之一,但是总是对设备可见的,我们可以通过内存堆的类型来获得与其相关的更多细节。在实现中可能有以下几种例子:

  • 设备本地(device local)是与设备物理连接的内存。
  • 设备本地,主机可见(device local, host visible)是对主机可见的设备本地内存。
  • 主机本地,主机可见(host local, host visible)是存在于主机上,并且对设备和主机都可见的内存。

在其他架构中,可能只能使用一个堆来实现一切。

Vulkan应用通过向命令缓冲区提交命令来控制设备,这些缓冲区记录了通过Vulkan库调用发布的命令。命令缓冲区的内部是特定的底层实现,对应用程序并不透明。当其创建完成,它就可以提交到队列中一次或多次去执行,多个命令缓冲区可以在多个线程中并行构建。

提交到不同队列的命令缓冲区可能相互并行执行,甚至可以不按照顺序执行。提交到相同队列的命令缓冲区按照submission order来执行,更多介绍详synchronization chapter。在设备中执行的命令缓冲区对主机来说是同步的,一旦向队列提交完命令缓冲区,控制权就可能会立即返回给应用程序。设备和主机之间的同步,以及不同队列之间的同步需要由应用程序来管理。