Vulkan® 1.2.131 - A Specification::Chapter 2::Fundamentals(基本概念)

原文链接:https://vulkan.lunarg.com/doc/view/1.2.131.2/windows/chunked_spec/chap2.html#fundamentals

更新记录:

2020/4/8:: 2基本概念 2.1 本地和设备环境 2.2 执行模式

 

2基本概念

这一章介绍Vulkan的架构、执行模式(execution model)、API、队列(queue)、管线(pipeline)、数值表示,状态和状态查询和不同类型的对象和着色器(shader)的基本概念。

 

2.1本地(host)和设备(device)环境

说明::

Vulkan中的本地(host)一般是指:原生支持Vulkan的设备(特别是显卡)以外的设备(例如一台主机)。

Vulkan中的设备(device)一般是指: 原生支持Vulkan的设备(特别是显卡)

 

Vulkan要求如下环境:

  1. 本地运行时(runtime)必须支持8,16,32和64位有符号和无符号二进制补码整数,可按照字节寻址。
  2. 本地运行时必须支持32和64位浮点类型
  3. 本地上的类型的表示(representation)和字节序(endianness)与设备上的必须匹配。

注意::

在Vulkan中很多不同的数据和结构类型在本地端和设备端都可以访问。应用需要在两端有效地访问数据以达到高效率可移植的应用。

 

2.2执行模式(execution model)

该小节介绍Vulkan系统的执行模式轮廓。

一开始Vulkan会暴露给用户一个或者多个设备(具体看电脑硬件配置),每一个设备内部会存在一个或多个异步工作的队列暴露给用户。Vulkan会将这些队列分组/簇(families)。每一个组内部会由一个或多个队列组成,队列是用来处理命令(command)的,如果某些队列被分到了同一个组中的话,说明这些队列被认为互相兼容,具有相似的特征。并且特定组中的队列可以运行特定的命令(command),并不是任意的命令任意的队列都可以处理的。Vulkan中将队列组按功能大致分成了四类:图形类(graphics)、计算类(compute)、转移类(transfer)、稀疏内存管理类( management)。

  1. 图形类主要是进行图形绘制类型的工作
  2. 转移类主要是进行数据复制,清空,等类型的工作。
  3. 稀疏内存管理类::这个不是很清楚。待查阅资料或待好心人指点。

 

注意::

       虽然有四种类型的队列组,但是请注意,并不是说图形类的就只进行图形类操作,其也可以进行计算类和转移类的操作。具体要看具体设备配置,Vulkan中的队列组中的队列会支持一个或多个类型的功能。还要注意的一点就是Vulkan中不同的队列组之间不能直接互相兼容,就算类型功能存在交集。如下图。

 

 

Vulkan® 1.2.131 - A Specification::Chapter 2::Fundamentals(基本概念)

       Vulkan中对于设备的内存(显存和内存)是交由应用负责管理的,这就需要开发人员小心的管理内存(显存和内存)。每一个设备会暴露一个或者多个堆(heap),代表着不同区域的内存区域。堆无非两类:设备域(device local)内存,本地域(host local)内存。(本人认为应该细分为四类:设备域内存、本地域内存、本地可访问(host visible)内存、设备可访问(device visible)内存)

  1. 设备域内存堆::指的是只有设备能访问的设备内存堆
  2. 本地域内存堆::指的是只有本地能访问的本地内存堆
  3. 本地可访问::本地可访问是相对于设备域内存堆。指的是该设备内存堆在本地端可访问
  4. 设备可访问::设备可访问是相对于本地域内存堆。指的是该本地内存堆在设备端可访问。

官方文档将内存分成如下:

  1. 设备域内存堆::指的是只有设备能访问的设备内存。
  2. 设备域内存堆,本地域可访问::指的是该设备内存堆,在本地端可访问。
  3. 本地域内存堆,本地域可访问::指的是本地域的的内存堆,本地端和设备端都可以访问的内存。

在某些架构中,可能仅仅只有一个堆,该堆是本地端和设备端共享(常见于嵌入式系统,比如手机)。

       Vulkan控制设备通过将命令缓存(command Buffer)推送到特定队列中进行运行。命令缓存内部记录着命令(比如绘制命令)。命令缓存和命令对于开发人员是不透明的,需要手动创建命令缓存并且手动塞入命令之后手动推送到队列。一旦构建了一个完整的命令缓存就可以向队列推送多次。多个命令缓存可以在多线程中同时建并工作。

       命令缓存推送到不同的队列可能会异步的执行各个命令缓存中的命令,这可能会导致执行命令顺序的混乱。命令缓存推送到同一个队列需要遵守推送顺序,具体可参考同步章节。队列执行命令相对于本地是异步执行。一旦命令缓存推送到了队列中,控制权会立刻返回(不会等待命令缓存中的命令都执行完之后返回)。应用需要负责本地端和设备端的同步。

 

 

未完待续::接下来是队列操作