Vulkan® 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 执行模式

2020/4/9 修改了2.2[注意]段中一些语句错误

2020/4/9 增加 2.3对象模型,在翻译完2.3后发现2.2.1队列操作忘翻译了,有时间补上。

2020/4/10 增加 2.4应用程序二进制接口 2.5命令/指令(函数)语法和持续时间。2.2.1队列操作忘翻译了,有时间补上。

2020/4/12 补上2.2.1队列操作,2.3.1对象的生命周期忘记翻译了,有时间补上。

2020/4/12 补上2.3.1对象的生命周期, 补上2.3.2外部对象句柄,增加2.5.1检索结果生命周期

2020/4/13 增加2.6线程行为

2020/4/14 增加 2.7 错误,增加2.7.1有效/合法用法 ,增加2.7.2隐示有效/合法用法 ,增加2.7.2.1对象句柄的有效性 ,增加2.7.2.2 指针的有效性 ,增加2.7.2.3字符串的有效性 ,增加2.7.2.4枚举的有效性 ,增加2.7.2.5标志的有效性 ,增加2.7.2.6 结构体类型的有效性

2020/4/15 增加 2.7.2.7结构链的有效性,增加 2.7.2.8 嵌套结构的有效性,增加 2.7.2.9 扩展有效性,增加 2.7.2.10 Vulkan版本的有效性

2020/4/16 增加 2.7.3 返回码,2.8 数值表达和计算,2.8.1 浮点数计算

2020/4/17 增加 2.8.2 浮点格式转换、增加2.8.3 16位浮点数、增加 2.8.4 无符号11位浮点数、增加 2.8.5 无符号10位浮点数、增加2.8.6 一般要求、增加 2.9定点数转换、增加2.9.1将归一化定点小数转换成浮点数、增加2.9.2浮点数转成归一化定点小数、增加2.10常见对象类型、增加2.10.1 偏移、增加2.10.2 大小、增加2.10.3 区域

╭(●`∀´●)╯╰(●’◡’●)╮ (●’◡’●)ノ ヾ(*´▽‘*)ノ

至此Vulkan官方文档第二章翻译完成,请大家如果发现问题及时留言。

╭(●`∀´●)╯╰(●’◡’●)╮ (●’◡’●)ノ ヾ(*´▽‘*)ノ

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

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

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

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

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

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

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

 

2.2.1 队列操作


Vulkan中的队列为设备的运行引擎提供了个访问接口。在特定的命令(command)推送到队列中去运行前是记录在命令缓存(command buffer)中,命令缓存是通过推送(queue submission)将一打命令缓存推送到队列中进行运行。之后对于命令的运行默认不再受到本地端的控制,想要控制命令的运行和同步,请参考同步章节。

推送试用vkQueue*函数(比如vkQueueSubmit,vkQueue BindSparse),并且附上一系列的旗语(semaphores),用于等待旗语激活并开始运行指令和当该推送任务完成所需要激活的旗语。旗语的等待和激活是队列操作的一部分。

由于Vulkan的设备一般流水性和并行性运算能力很强,所以队列之间一般是并行运行的。

不同的队列之间执行任务没有隐示的约束,它们可以以任何顺序执行,为了控制执行顺序可以显示的使用旗语和栏栅(fence)。

多个命令缓存提交到单个队列遵守提交顺序,和一些其他的隐示循序保证。

在栏栅和旗语被激活后,就被认为之前与之相关的命令已经运行结束,之前处理完的内存对于当前任务可用可见。

命令缓存的执行边界处于一打一级命令缓存提交与一打命一级令缓存提交之间(为什么是一打,因为Vulkan一次性可以提交多个命令缓存),一级命令缓存和二级命令缓存之间也存在边界。边界和边界之间没有引入任何执行循序约定。换句话也就是说,当旗语或者栏栅之间提交一打命令缓存(也有可能包括二级命令缓存)时相当于将这一打命令缓存全部记录到一个一级缓存并提交到单个队列中一样,除非重置每一个边界(命令缓存可重置和重复使用,前提是创建时指定可重置属性)。更多信息请参考同步

单个命令缓存中命令和命令之间存在一些隐示的执行顺序保证,但是只是涵盖了执行的一小部分。可以使用同步原语(旗语,栏栅等)主动添加运行循序约束。同步

记录在命令缓存中的命令一般分为三类:

  1. 动作命令::绘制,派遣,清空,拷贝,查询/时间戳和开始/结束子通路(subpass)命令等。
  2. 状态设置::绑定管线(pipeline),描述符集(descriptor sets),缓存,动态阶段,推送恒量,设置渲染通路/子通路的状态命令等
  3. 同步操作::激活/等待事件(event),管线障(pipeline barrier),渲染通路/子通路的依赖命令等。

同步操作为动作命令之间提供显示的执行和内存依赖操作(同步操作)。第二个动作命令依赖于第一个动作命令,也就是说第二个动作命令是在第一个动作命令执行之后执行。对于内存的操作,第二个动作命令会等待第一个动作命令完成后操作对应的内存。如果不进行同步操作,执行顺序将会是交叠在一起,导致执行混乱,这可能会导致数据访问的无效。

设备与本地(host)之间也需要执行同步操作,当命令缓存提交到队列后控制权马上返回给本地应用。应用必须负责同步本地端和设备端。

 

注::

  1. 旗语::同步原语之一,更多信息请参考同步
  2. 栏栅::同步原语之一,更多信息请参考同步
  3. 事件(event)::同步原语之一,更多信息请参考同步
  4. 管线障(pipeline barrier)::同步原语之一,同步
  5. 命令缓存(command buffer)分为两类:一级命令缓存(primary command buffer)和二级命令缓存(secondary command buffer),一级命令缓存可以包含二级命令缓存,反过来不成立。

 

2.3 对象模型


       在Vulkan中对于设备、队列等都是Vulkan对象。这些对象使用句柄来定义。Vulkan中有两类句柄,可派遣(dispatchable)的和不可派遣(non-dispatchable)的。

可派遣类型是一个不透明类型的指针,该指针可以在某些层(layer)被拦截捕获。每一个可派遣句柄的值在Vulkan运行时都是唯一的,换句换说可派遣句柄没有重复的值。

可派遣类型声明如下:

#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object;.

VK_DEFINE_HANDLE(dispatchable_name)

       不可派遣类型非常简单,就是一个64位的无符号整型数据(如果是64位平台则是和可派遣声明一样,是一个指针)。该整型数据具体代表什么对象需要看具体实现来确定。Vulkan中不同类型的不可派遣类的句柄不保证唯一性(例如Vulkan中的图片对象和缓对象就是两个不可派遣对象,其句柄可能存在重复)。对于反复创建并销毁回收的不可派遣对象,在重新创建时其句柄可能会是之前回收的句柄值,换句换说不可派遣类型的句柄可回收再利用。

不可派遣类型的声明如下:

#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t

VK_DEFINE_NON_DISPATCHABLE_HANDLE(non-dispatchable_name)

      所有的Vulkan对象创建和分配都是在设备上进行,并且一旦该对象在该设备上创建成功,则该对象属于该设备所有物,如果有多个设备不允许跨设备操作该对象。

注::

       1.句柄::一个对象的句柄并不是该对象本身,它代表着该对象,大多数句柄就是一个整数,相当于该对象的ID。使用句柄去控制该句柄所代表的对象是句柄的基本用法。

       2.层(layer)::Vulkan的核心架构中不包括错误检查,异常追踪。这些工作被分离出来放到了各个层(layer)里,每个层功能不同,有查错的,有追踪对象的等等,大体上层(layer)的左右就是错误检查。具体使用哪个层需要自己指定,这样Vulkan就可以丢掉繁重的错误跟踪工作,提高性能。层(layer)一般用于开发阶段,发布时一般会将层注销掉,提高性能。

      3.

#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object

中的##的意思是字符串连接符。将##之前的字符和##之后的字符连接起来。例如

VK_DEFINE_HANDLE(XXX)

等价于

typedef struct XXX##_T* XXX

等价于

typedef struct XXX_T* XXX

 

2.3.1 对象生命周期


Vulkan对象通过调用VkCreate*和vkAllocate*函数进行创建和分配。一旦对象被创建或被分配就被认为不变了,尽管对于某些对象还是可以去修改它的内容。销毁和释放对象通过调用vkDestroy*和vkFree*函数进行。

通过调用vkAllocate*函数为从对象奖池中分配一个对象,当释放该对象时,其会返回对应的对象池中等待以后分配使用。对于调用vkCreate*函数创建对象的频率相对较低,对于分配和释放对象的频率相对较高。对象池用于减少昂贵的对象分配和销毁操作的性能消耗。

Vulkan中对于对象的追踪的工作交给了应用负责,应用负责在对象在被使用时不能被销毁。

在Vulkan函数运行时相应的应用内存的所有权会交付到Vulkan手中,在函数运行结束时会返回给应用,当所有Vulkan函数都运行完成后可以将不再使用的内存释放。

下面列出的对象类型在作为参数传入Vulkan函数时不能释放,并且用这些对象作为参数创建的那些对象不会访问该对象。

  • VkShaderModule
  • VkPipelineCache
  • VkValidationCacheEXT

VkRenderPass对象在作为参数创建完其他对象后,不会再对VkRenderPass对象访问。VkRenderPass在命令缓存(command buffer)中的规则如下所述。

在VkPipelineLayout对象被命令缓存记录命令阶段使用时禁止销毁。

VkDescriptorSetLayout对象是用于创建描述符集(descriptor set)的,在

VkDescriptorSetLayout对象被销毁之后禁止调用vkUpdateDescriptorSets函数。

在设备还在使用某个Vulkan对象时,禁止应用销毁该对象,直到设备完成该对象的操作。

下面列出的Vulkan对象在命令缓存在待定/准备阶段(pending state)时禁止销毁:

  • VkEvent
  • VkQueryPool
  • VkBuffer
  • VkBufferView
  • VkImage
  • VkImageView
  • VkPipeline
  • VkSampler
  • VkSamplerYcbcrConversion
  • VkDescriptorPool
  • VkFramebuffer
  • VkRenderPass
  • VkCommandBuffer
  • VkCommandPool
  • VkDeviceMemory
  • VkDescriptorSet
  • VkIndirectCommandsLayoutNV

当命令缓存在记录和运行阶段使用这些对象时,当发生上述对象的销毁后,命令缓存会进入无效状态。

下列对象在队列使用这些对象运行命令时禁止销毁。

  • VkFence
  • VkSemaphore
  • VkCommandBuffer
  • VkCommandPool

实际上,只要对象不再使用,对于Vulkan对象可以按照任意顺序销毁,即使该对象正在被别的对象使用(例如使用资源(VkImage等)创建视图(VkImageView等),命令缓存中使用某些Vulkan对象(Semaphores等))。除非该对象可以被重置(比如重置命令缓存)。如果可重置对象被重置之后,该对象就可以重置成未使用过的对象,有一个例外,如果当前对象存在父子关系(例如内存和内存池这种通过池分配的对象)时,应用最好不要去销毁父对象,除非销毁父对象时定义好子对象如何销毁(Vulkan中一般,如果存在父子关系,当销毁父对象时会连带这自动将该父对象下面的所有子对象销毁)。

VkCommandPool对象是VkCommandBuffer对象的父对象,VkDescriptorPool对象是VkDescriptorSet对象的父对象。VkDevice是很多对象的父对象。

下列对象对于销毁有限制条件。

  • VkQueue对象不能显示的销毁,当VkDevice被显示的销毁时该对象连带着销毁。
  • 销毁一个池对象将会隐示连带着销毁从该池中分配的所有子对象。例如销毁VkCommandPool对象将会销毁所有从该对象中分配的VkCommandBuffer对象。
  • VkDevice对象,在该对象上的所有VkQueue对象都处于空闲状态,并且用该对象创建的所有子对象都销毁时才可以销毁该VkDevice对象。子对象包括:
  1. VkFence
  2. VkSemaphore
  3. VkEvent
  4. VkQueryPool
  5. VkBuffer
  6. VkBufferView
  7. VkImage
  8. VkImageView
  9. VkShaderModule
  10. VkPipelineCache
  11. VkPipeline
  12. VkPipelineLayout
  13. VkSampler
  14. VkSamplerYcbcrConversion
  15. VkDescriptorSetLayout
  16. VkDescriptorPool
  17. VkFramebuffer
  18. VkRenderPass
  19. VkCommandPool
  20. VkCommandBuffer
  21. VkDeviceMemory
  22. VkValidationCacheEXT
  • VkPhysicalDevice对象不能显示销毁,当VkInstance对象销毁时VkPhysicalDeivce对象自动隐示销毁。
  • VkInstance对象在所有VkDevice销毁后才可以销毁。
  • 作为管线库(pipeline library)所创建的VkPipeline对象,该作为管线库所创建的VkPipeline对象可以绑定多个VkPipeline对象,当所有绑定的VkPipeline对象销毁时,该作为管线库的VkPipeline对象方可销毁。(管线库好像是个扩展功能,具体不知道是个啥,待以后查资料或好心人指点)
  • 当创建图形着色器组(graphics shader groups)时所指定的VkPipeline对象,该VkPipeline对象和管线库VkPipeline对象类似,当所有图形着色器组创建时所指定的VkPipeline对象销毁后,该VkPipeline对象方可销毁。(图形着色器组好像是个NVIDIA扩展功能,具体不知道是个啥,待以后查资料或好心人指点)

 

注::

1描述符集(descriptor set)和描述符集布局(descriptor set layout)::描述符(descriptor)用于定义着色器(shader)与外部数据的交互接口,多的描述符组成了一个描述符集(descriptor set),描述符集布局(descriptor set layout)定义了描述符集接口的布局。(此处的交互接口说白了就是着色器中定义的变量)。

 

2.3.2外部对象句柄


Vulkan中对于对象的创建和分配都限制在VkDevice对象范围上进行的,跨设备,也就是跨VkDevice对象,访问跨VkDevice下面的子对象是不被允许的。像这样是别的VkDevice对象下的对象的话,叫做该设备对象的外部对象,简称外部对象。想要将外部对象变成本设备的内部对象的话,必须从源作用域中导出一个外部句柄,然后将其导入目标作用域。

 

注::

1.外部句柄和其对应的相关的资源可能多种多样,但是基本上都是可以通过进程(process)和API边界共享。(该处的进程和API边界不知道什么意思,代好心人指点)

 

2.4应用程序二进制接口(Application Binary Interface/ABI)


       当前系统上支持哪个版本(Windows、Mac、Linux等)的Vulkan是看当前的平台和具体实现。在很多平台上本规范中是通过使用C接口共享库(shared library/动态库)来描述。本规范对其做出了一些规范性要求。

       动态库的实现必须使用对应平台标准的C编译器编译的默认应用程序二进制接口(ABI),或者提供自定义API头文件使得应用使用自定义程序二进制接口。程序二进制接口指的是C中数据的结构大小,内存对齐,布局和函数的调用约定、C函数和动态库中符号的对应约定等。在Vulkan中对于这些约定的定义位于vk_platform.h的头文件中。

       Vulkan的动态库名称以”vk”开头,之后跟上数字或者大写字符作为标识。开发人员不得对Vulkan中已经定义的宏等数据做出重定义(就是不要动我定义好的东西)。

       动态库为实现支持的最高版本命令和窗口整合(window system integration)集提供符号集,并且也提供扩展的符号集。

(说白了,Vulkan对于各种名称等都给你定义好了,拿来用即可)。

 

2.5 命令/指令(函数)语法和持续时间


       该规范规定Vulkan使用C99标准,如果是C++或者JavaScript会有更加严格的参数传递和面向对象标准。

       Vulkan使用标准的C格式定义变量(例如stdint.h),除了下文所说的和某些指定的地方。

       VkBool32代表布尔值True和False,C中没有内部定义的布尔值:

typedef uint32_t Vkbool32;

       VK_TRUE代表着布尔值True(值为1),VK_FALSE代表布尔值False(值为0),Vulkan返回的VkBool32的值无非是VK_TRUE或者VK_FALSE。在需要传入VkBool32类型的参数时禁止传入除VK_TRUE和VK_FALSE的其他值。

       VkDeviceSize代表设备内存大小和偏移量。

    typedef uint64_t VkDeviceSize;

       VkDeviceAddresss代表物理缓存(buffer)地址值。

 typedef uint64_t VkDeviceAddress;

        Vulkan创建对象使用vkCreate*函数并且需要提供Vk*CreateInfo结构体用于创建对象。销毁对象使用vkDestroy*函数销毁。在vkCreate*函数的最后一个参数一般是一个名叫pAllocator的参数,该参数为指向自定义的分配器指针,该参数可以为空指针(nullptr),如果为空指针则使用Vulkan内置的分配器分配,具体请参考[链接]内存分配[链接]章节。

      如果创建的Vulkan是从Vulkan的对象池(pool)中分配创建的话,则调用vkAllocate*函数并且提供Vk*AllocateInfo结构体用于从该对象池中分配对象。

      Vulkan中的命令(Command)记录在命令缓存中(Command Buffer),并且命令函数命名为vkCmd*(比如绘制命令,拷贝命令等)。每一个命令一般都会有使用限制,并不是可以随便调用的。对于一级命令缓存(primary command buffer)和二级命令缓存(secondary command buffer),渲染通路(render pass)的内部和外部,一个或多个支持的队列类型,在Vulkan中都会有一些调用限制,并不是可以对其随意操作的。

       指令/命令(函数)的调用持续时间为开始调用到返回这段时间。

       注::

       命令缓存(command buffer)分为两类:一级命令缓存(primary command buffer)和二级命令缓存(secondary command buffer)。

 

2.5.1检索结果的生命周期


Vulkan中获取/检索信息通过调用vkGet*和vkEnumerate*函数获取。除非某些函数有另外说明,否则获取的信息将是恒定不变的。也就是当传入相同的参数调用同一个信息检索函数多次返回的结果是一样的。

 

2.6 线程行为


       Vulkan的设计初衷就是通过主机端的多线程特性为应用提供优良的弹性性能。Vulkan中的所有函数都支持多线程同时调用,但是某些需要传入这些函数的参数需要外部同步(互斥)。也就是说,这就需要同一时刻对于同一个参数的访问保证只能有一个线程对其访问。

       更确切的说,Vulkan函数仅仅使用简单的存储去更新Vulkan对象的状态。一个外部同步声明变量在程序运行时该变量的内容可能会更新成任意值。如果两个函数操作同一个变量,如果最后操作该变量的函数进行外部同步,则该函数需要保证没有别的函数同时调用该变量,如果有必要的话,这两个同时调用的函数需要提供合适的内存障(memeory barrier)。

 

       注::

       原本内存障是基于ARM处理器架构的(多见于移动端,嵌入端),该处理器相对于我们常见的x86/x64处理器要更加低耗。幸运的是,在很多高级别的同步机制中(例如Linux中的

pthread库),内存障是这些高级互斥机制的一部分,Vulkan对象通过内存障来达到高级互斥的相同目的(目的:互斥竞争资源)。

      

       相似的应用需要保证Vulkan函数在调用时,避免潜在的内存数据和对象所有权的混乱(2.3.1所述)。应用可能在任意时刻通过调用Vulkan函数获取的应用内存所有权进行读取,并且可能会向该非常量合格内存(non-const qualified memory)中写入。当参数引用的是非常量内存时本规范并不会标记其为外部同步。(这段不知道说的啥,待好心人指点)

       如果应用使用延迟本地操作(deferred host operation)调用Vulkan函数,并且延迟操作成功的话,在延迟操作结束之前,对象的参数和应用内存可能会在任意时刻被访问。

 

       注::

  1. 延迟本地操作::非核心标准,为扩展标准。Vulkan的某些函数调用工作对于CPU来说非常昂贵。这些工作会装载到后台多线程上,并且多CPU同时(并行)运行。延迟操作允许应用和驱动将这些昂贵的工作使用应用端线程池进行调用。

 

Vulkan中很多对象是不可变的,也就是说一旦该对象创建完成就不能更改。这些不变的对象永远不需要进行外部同步,除非该对象在别的线程上被使用时,该对象不能被销毁。在一些特殊的情况下易边的对象参数Vulkan在内部会进行内部同步,而不需要进行外部同步。函数调用所使用的参数如果没有标识需要外部同步则说明该参数要么不需要同步,要么是内部同步参数(Vulkan API文档中对于每一个函数中需要外部同步的每一个参数都作出了标记,标记在名为”Host Synchronization”说明框中,例如vkAcquireNextImageKHR函数)。

另外与命令(command)相关的某些对象(例如命令池(command pools)和描述符池(descriptor pools))可能会受到命令的影响,也必须要外部同步。

       如下记录了需要外部同步的函数参数(太多了懒得翻译修改了,自己翻译吧,也不难):

  • The instance parameter in vkDestroyInstance
  • The device parameter in vkDestroyDevice
  • The queue parameter in vkQueueSubmit
  • The fence parameter in vkQueueSubmit
  • The queue parameter in vkQueueWaitIdle
  • The memory parameter in vkFreeMemory
  • The memory parameter in vkMapMemory
  • The memory parameter in vkUnmapMemory
  • The buffer parameter in vkBindBufferMemory
  • The image parameter in vkBindImageMemory
  • The queue parameter in vkQueueBindSparse
  • The fence parameter in vkQueueBindSparse
  • The fence parameter in vkDestroyFence
  • The semaphore parameter in vkDestroySemaphore
  • The event parameter in vkDestroyEvent
  • The event parameter in vkSetEvent
  • The event parameter in vkResetEvent
  • The queryPool parameter in vkDestroyQueryPool
  • The buffer parameter in vkDestroyBuffer
  • The bufferView parameter in vkDestroyBufferView
  • The image parameter in vkDestroyImage
  • The imageView parameter in vkDestroyImageView
  • The shaderModule parameter in vkDestroyShaderModule
  • The pipelineCache parameter in vkDestroyPipelineCache
  • The dstCache parameter in vkMergePipelineCaches
  • The pipeline parameter in vkDestroyPipeline
  • The pipelineLayout parameter in vkDestroyPipelineLayout
  • The sampler parameter in vkDestroySampler
  • The descriptorSetLayout parameter in vkDestroyDescriptorSetLayout
  • The descriptorPool parameter in vkDestroyDescriptorPool
  • The descriptorPool parameter in vkResetDescriptorPool
  • The descriptorPool member of the pAllocateInfo parameter in vkAllocateDescriptorSets
  • The descriptorPool parameter in vkFreeDescriptorSets
  • The framebuffer parameter in vkDestroyFramebuffer
  • The renderPass parameter in vkDestroyRenderPass
  • The commandPool parameter in vkDestroyCommandPool
  • The commandPool parameter in vkResetCommandPool
  • The commandPool member of the pAllocateInfo parameter in vkAllocateCommandBuffers
  • The commandPool parameter in vkFreeCommandBuffers
  • The commandBuffer parameter in vkBeginCommandBuffer
  • The commandBuffer parameter in vkEndCommandBuffer
  • The commandBuffer parameter in vkResetCommandBuffer
  • The commandBuffer parameter in vkCmdBindPipeline
  • The commandBuffer parameter in vkCmdSetViewport
  • The commandBuffer parameter in vkCmdSetScissor
  • The commandBuffer parameter in vkCmdSetLineWidth
  • The commandBuffer parameter in vkCmdSetDepthBias
  • The commandBuffer parameter in vkCmdSetBlendConstants
  • The commandBuffer parameter in vkCmdSetDepthBounds
  • The commandBuffer parameter in vkCmdSetStencilCompareMask
  • The commandBuffer parameter in vkCmdSetStencilWriteMask
  • The commandBuffer parameter in vkCmdSetStencilReference
  • The commandBuffer parameter in vkCmdBindDescriptorSet
  • The commandBuffer parameter in vkCmdBindIndexBuffer
  • The commandBuffer parameter in vkCmdBindVertexBuffers
  • The commandBuffer parameter in vkCmdDraw
  • The commandBuffer parameter in vkCmdDrawIndexed
  • The commandBuffer parameter in vkCmdDrawIndirect
  • The commandBuffer parameter in vkCmdDrawIndexedIndirect
  • The commandBuffer parameter in vkCmdDispatch
  • The commandBuffer parameter in vkCmdDispatchIndirect
  • The commandBuffer parameter in vkCmdCopyBuffer
  • The commandBuffer parameter in vkCmdCopyImage
  • The commandBuffer parameter in vkCmdBlitImage
  • The commandBuffer parameter in vkCmdCopyBufferToImage
  • The commandBuffer parameter in vkCmdCopyImageToBuffer
  • The commandBuffer parameter in vkCmdUpdateBuffer
  • The commandBuffer parameter in vkCmdFillBuffer
  • The commandBuffer parameter in vkCmdClearColorImage
  • The commandBuffer parameter in vkCmdClearDepthStencilImage
  • The commandBuffer parameter in vkCmdClearAttachments
  • The commandBuffer parameter in vkCmdResolveImage
  • The commandBuffer parameter in vkCmdSetEvent
  • The commandBuffer parameter in vkCmdResetEvent
  • The commandBuffer parameter in vkCmdWaitEvents
  • The commandBuffer parameter in vkCmdPipelineBarrier
  • The commandBuffer parameter in vkCmdBeginQuery
  • The commandBuffer parameter in vkCmdEndQuery
  • The commandBuffer parameter in vkCmdResetQueryPool
  • The commandBuffer parameter in vkCmdWriteTimestamp
  • The commandBuffer parameter in vkCmdCopyQueryPoolResults
  • The commandBuffer parameter in vkCmdPushConstants
  • The commandBuffer parameter in vkCmdBeginRenderPass
  • The commandBuffer parameter in vkCmdNextSubpass
  • The commandBuffer parameter in vkCmdEndRenderPass
  • The commandBuffer parameter in vkCmdExecuteCommands
  • The commandBuffer parameter in vkCmdSetDeviceMask
  • The commandBuffer parameter in vkCmdDispatchBase
  • The commandPool parameter in vkTrimCommandPool
  • The ycbcrConversion parameter in vkDestroySamplerYcbcrConversion
  • The descriptorUpdateTemplate parameter in vkDestroyDescriptorUpdateTemplate
  • The descriptorSet parameter in vkUpdateDescriptorSetWithTemplate
  • The commandBuffer parameter in vkCmdDrawIndirectCount
  • The commandBuffer parameter in vkCmdDrawIndexedIndirectCount
  • The commandBuffer parameter in vkCmdBeginRenderPass2
  • The commandBuffer parameter in vkCmdNextSubpass2
  • The commandBuffer parameter in vkCmdEndRenderPass2
  • The surface parameter in vkDestroySurfaceKHR
  • The surface member of the pCreateInfo parameter in vkCreateSwapchainKHR
  • The oldSwapchain member of the pCreateInfo parameter in vkCreateSwapchainKHR
  • The swapchain parameter in vkDestroySwapchainKHR
  • The swapchain parameter in vkAcquireNextImageKHR
  • The semaphore parameter in vkAcquireNextImageKHR
  • The fence parameter in vkAcquireNextImageKHR
  • The queue parameter in vkQueuePresentKH
  • The surface parameter in vkGetDeviceGroupSurfacePresentModesKHR
  • The surface parameter in vkGetPhysicalDevicePresentRectanglesKHR
  • The display parameter in vkCreateDisplayModeKHR
  • The mode parameter in vkGetDisplayPlaneCapabilitiesKHR
  • The commandBuffer parameter in vkCmdSetDeviceMaskKHR
  • The commandBuffer parameter in vkCmdDispatchBaseKHR
  • The commandPool parameter in vkTrimCommandPoolKHR
  • The commandBuffer parameter in vkCmdPushDescriptorSetKHR
  • The commandBuffer parameter in vkCmdPushDescriptorSetWithTemplateKHR
  • The descriptorUpdateTemplate parameter in vkDestroyDescriptorUpdateTemplateKHR
  • The descriptorSet parameter in vkUpdateDescriptorSetWithTemplateKHR
  • The commandBuffer parameter in vkCmdBeginRenderPass2KHR
  • The commandBuffer parameter in vkCmdNextSubpass2KHR
  • The commandBuffer parameter in vkCmdEndRenderPass2KHR
  • The swapchain parameter in vkGetSwapchainStatusKHR
  • The ycbcrConversion parameter in vkDestroySamplerYcbcrConversionKHR
  • The commandBuffer parameter in vkCmdDrawIndirectCountKHR
  • The commandBuffer parameter in vkCmdDrawIndexedIndirectCountKHR
  • The callback parameter in vkDestroyDebugReportCallbackEXT
  • The object member of the pTagInfo parameter in vkDebugMarkerSetObjectTagEXT
  • The object member of the pNameInfo parameter in vkDebugMarkerSetObjectNameEXT
  • The commandBuffer parameter in vkCmdBindTransformFeedbackBuffersEXT
  • The commandBuffer parameter in vkCmdBeginTransformFeedbackEXT
  • The commandBuffer parameter in vkCmdEndTransformFeedbackEXT
  • The commandBuffer parameter in vkCmdBeginQueryIndexedEXT
  • The commandBuffer parameter in vkCmdEndQueryIndexedEXT
  • The commandBuffer parameter in vkCmdDrawIndirectByteCountEXT
  • The commandBuffer parameter in vkCmdDrawIndirectCountAMD
  • The commandBuffer parameter in vkCmdDrawIndexedIndirectCountAMD
  • The commandBuffer parameter in vkCmdBeginConditionalRenderingEXT
  • The commandBuffer parameter in vkCmdEndConditionalRenderingEXT
  • The commandBuffer parameter in vkCmdSetViewportWScalingNV
  • The swapchain parameter in vkGetRefreshCycleDurationGOOGLE
  • The swapchain parameter in vkGetPastPresentationTimingGOOGLE
  • The commandBuffer parameter in vkCmdSetDiscardRectangleEXT
  • The objectHandle member of the pNameInfo parameter in vkSetDebugUtilsObjectNameEXT
  • The objectHandle member of the pTagInfo parameter in vkSetDebugUtilsObjectTagEXT
  • The messenger parameter in vkDestroyDebugUtilsMessengerEXT
  • The commandBuffer parameter in vkCmdSetSampleLocationsEXT
  • The validationCache parameter in vkDestroyValidationCacheEXT
  • The dstCache parameter in vkMergeValidationCachesEXT
  • The commandBuffer parameter in vkCmdBindShadingRateImageNV
  • The commandBuffer parameter in vkCmdSetViewportShadingRatePaletteNV
  • The commandBuffer parameter in vkCmdSetCoarseSampleOrderNV
  • The commandBuffer parameter in vkCmdWriteBufferMarkerAMD
  • The commandBuffer parameter in vkCmdDrawMeshTasksNV
  • The commandBuffer parameter in vkCmdDrawMeshTasksIndirectNV
  • The commandBuffer parameter in vkCmdDrawMeshTasksIndirectCountNV
  • The commandBuffer parameter in vkCmdSetExclusiveScissorNV
  • The commandBuffer parameter in vkCmdSetLineStippleEXT
  • The commandBuffer parameter in vkCmdPreprocessGeneratedCommandsNV
  • The commandBuffer parameter in vkCmdExecuteGeneratedCommandsNV
  • The commandBuffer parameter in vkCmdBindPipelineShaderGroupNV

 

当创建VkPipelineCache对象时如果指定

VK_PIPELINE_CACHE_CREATE_EXTERNALLY_SYNCHRONIZED_BIT_EXT标志位时,上表需要加一项:vkCreate*Pipelines中的pipelineCache参数需要外部同步。

       Vulkan中有一小部分实例函数可以接收应用分配的链表,链表中包括要外部同步的参数。在这种情况下调用必须保证在某一时刻只有一个线程读取该列表上的元素。说白了就是该函数参数中有多个相同的对象。对于这种参数列举如下:

  • vkQueueBindSparse下的pBindInfo下的pBufferBinds下的buffer
  • vkQueueBindSparse下的pBindInfo下的pImageOpaqueBinds下的image
  • vkQueueBindSparse下的pBindInfo下的pImageBinds下的image
  • vkResetFences下的pFence下的每一个VkFence对象。
  • vkFreeDescriptorSet下的pDescriptorSets下的每一个VkDescriptorSet对象。
  • vkUpdateDescriptorSets下的pDescriptorWrites下的desSet元素
  • vkUpdateDescriptorSets下的pDescriptorCopies下的desSet元素
  • vkFreeCommandBuffers下的pCommadnBUffers下的元素
  • vkQueuePresentKH下的pPresentInfo下的pWaitSemaphores
  • vkQueuePresentKH下的pPresentInfo下的pSwapchains
  • vkCreateSharedSwapchainsKHR下的pCreateInfos下的surface 。
  • vkCreateSharedSwapchainsKHR下的pCreateInfos下的oldSwapchain。

 

另外有一些隐示参数也需要外部同步,例如所有的命令缓存(commandBuffer)参数需要外部同步连带着创建这些实例的命令池(commandPool)也需要外部同步。相关信息列举如下(太多了,懒得翻译了,自己看看吧):

  • All VkQueue objects created from device in vkDeviceWaitIdle
  • Any VkDescriptorSet objects allocated from descriptorPool in vkResetDescriptorPool
  • The VkCommandPool that commandBuffer was allocated from in vkBeginCommandBuffer
  • The VkCommandPool that commandBuffer was allocated from in vkEndCommandBuffer
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBindPipeline
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetViewport
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetScissor
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetLineWidth
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetDepthBias
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetBlendConstants
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetDepthBounds
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetStencilCompareMask
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetStencilWriteMask
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetStencilReference
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBindDescriptorSets
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBindIndexBuffer
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBindVertexBuffers
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDraw
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawIndexed
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawIndirect
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawIndexedIndirect
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDispatch
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDispatchIndirect
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdCopyBuffer
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdCopyImage
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBlitImage
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdCopyBufferToImage
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdCopyImageToBuffe
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdUpdateBuffer
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdFillBuffer
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdClearColorImage
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdClearDepthStencilImage
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdClearAttachments
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdResolveImage
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetEven
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdResetEvent
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdWaitEvents
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdPipelineBarrier
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBeginQuery
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdEndQuery
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdResetQueryPool
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdWriteTimestamp
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdCopyQueryPoolResults
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdPushConstants
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBeginRenderPass
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdNextSubpass
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdEndRenderPass
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdExecuteCommands
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetDeviceMask
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDispatchBase
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawIndirectCount
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawIndexedIndirectCount
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBeginRenderPass2
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdNextSubpass2
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdEndRenderPass2
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetDeviceMaskKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDispatchBaseKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdPushDescriptorSetKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdPushDescriptorSetWithTemplateKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBeginRenderPass2KHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdNextSubpass2KH
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdEndRenderPass2KHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawIndirectCountKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawIndexedIndirectCountKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDebugMarkerBeginEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDebugMarkerEndEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDebugMarkerInsertEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBindTransformFeedbackBuffersEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBeginTransformFeedbackEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdEndTransformFeedbackEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBeginQueryIndexedEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdEndQueryIndexedEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawIndirectByteCountEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawIndirectCountAMD
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawIndexedIndirectCountAMD
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBeginConditionalRenderingEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdEndConditionalRenderingEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetViewportWScalingNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetDiscardRectangleEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBeginDebugUtilsLabelEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdEndDebugUtilsLabelEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdInsertDebugUtilsLabelEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetSampleLocationsEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBindShadingRateImageNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetViewportShadingRatePaletteNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetCoarseSampleOrderNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBuildAccelerationStructureNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdCopyAccelerationStructureNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdTraceRaysNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdWriteAccelerationStructuresPropertiesKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdWriteAccelerationStructuresPropertiesNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdWriteBufferMarkerAMD
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawMeshTasksNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawMeshTasksIndirectNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdDrawMeshTasksIndirectCountNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetExclusiveScissorNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetCheckpointNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetPerformanceMarkerINTEL
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetPerformanceStreamMarkerINTEL
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetPerformanceOverrideINTEL
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdSetLineStippleEXT
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdPreprocessGeneratedCommandsNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdExecuteGeneratedCommandsNV
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBindPipelineShaderGroupNV
  • The VkCommandPool that commandBuffer was allocated from, invkCmdBuildAccelerationStructureKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdBuildAccelerationStructureIndirectKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdCopyAccelerationStructureKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdCopyAccelerationStructureToMemoryKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdCopyMemoryToAccelerationStructureKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdTraceRaysKHR
  • The VkCommandPool that commandBuffer was allocated from, in vkCmdTraceRaysIndirectKHR

 

2.7错误


Vulkan是分层(layer)的API,最底层为Vulkan核心层,也就是本Vulkan规范所描述的层。应用不仅可以使用核心层还可以使用额外处于核心层之上的层,比如,调试层(debugging layer,用于调试),验证层(validation layer,用于验证数据的有效性等),和用于其他目的的层。

Vulkan的一个核心原则就是效率,为了达到高效率,Vulkan会将验证数值的合理性和错误检查这些工能在核心层做到最小化,目的就是为了提高Vulkan的效率。对于大部分错误检查和验证等功能都放入了上层的各个层中。

除非该文档有特殊说明,最低层的核心层默认所有的API都调用正确,为了达到效率的最大化。在核心层中如果调用不正确那将导致未定义的行为,严重的会是的程序异常终止。使用Vulkan开发应用,必须准守操作系统规则,保证不正确的Vulkan调用不会影响系统的完整性,比如在Vulkan中不能违反操作系统对于进程间的数据通信的规则。除非有特殊说明否则Vulkan不需要提供额外的安全保证和完整性保证,这些工作操作系统会负责。

 

       注::

       如果操作系统保证所有新分配的内存的初始值都为0的话,Vulkan也需要和操作系统一致。

       相似的,如果操作系统对于释放后的内存对于别的调用(写操作等)不可见的话,Vulkan也需要保证与操作系统行为一致。

 

       如果Vulkan设备上有保护内存(protected memory,只有Vulkan设备可访问的内存,本地端不能访问),对于保护内存的不正确的使用和进行了保护内存允许的之外的操作,保护内存提供了额外的保证用于保护自己。更多请参阅链接】内存分配【链接】(目前内存分配章节还未翻译)。

       验证API是否使用正确Vulkan是交给验证层来负责。在开发阶段需要将需要的验证层开启,帮助排查错误。当对程序发布时保证没有问题后正常需要将所有的验证层卸载。

 

2.7.1 有效/合法用法


       注:: 

此处的有效用法指的是函数参数调用时的有效值,在Vulkan API文档中大部分函数都会有一个”Valid Uasge”模块用于讲解函数参数的有效值,该模块一般会有两个,一个是正常的有效值,一个是隐示的有效值。如下为vkCreateInstance函数的有效值模块截图)。

 

 

       有效使用为应用能够良好运行提供了一些必要条件,这些条件取决于Vulkan当前的状态和参数或对象的限制条件。

       一些条件是需要在运行时或者支持某些特性下满足的,这会去验证条件是否满足Vulkan所能支持的最低条件,比如某些数值的有效性(比如数组索引值不能为负数、句柄是否有效等)。

       在规范明确良好的代码中运行时不会进行有效用法验证。

      在应用运行期间,有效方法验证是知道调用的函数和函数使用的参数的完整信息的,这就使得验证层和短绒(linter,不知道是个啥)直接通过对应的指针获取他们当前的状态

       注::

于函数参数本身可能并没有一个明显的有效值的规定,在不同函数中该参数的有效值不尽相同,这时有效性说明就会附在相应的函数说明中。

 

       有效用法说明会写在一个名为”Valid Usage”的框中,附在每一个函数或结构体下面。

 

2.7.2 隐示有效/合法用法


       除非有特殊说明,验证一般会验证函数中所有的命令和参数的有效条件。如果某些条件是隐示的这会将这一隐示部分写到名为”Valid Usage(Implicit)”框中,隐示有效条件详细描述如下.

 

2.7.2.1对象句柄的有效性


       除非特殊说明,任何函数调用如果使用了对象句柄作为参数,该句柄必须是一个有效句柄。一个有效句柄需满足:

  1. 该句柄在被使用前,需要成功调用想要API,成功创建和分配。
  2. 在该句柄被调用前,禁止销毁。
  3. 使用该句柄创建的对象也必须有效

VK_NULL_HANDLE和NULL是Vulkan预留的值,用于初始化可派遣和不可派遣的对象句柄。Vulkan中任何成功创建句柄的返回值绝不会返回VK_NULL_HANDLE和NULL。如果将VK_NULL_HANDLE和NULL值的句柄传入vkDestroy*或vkFree*函数的话,运行时Vulkan会默默的忽略这两个值。

 

2.7.2.2 指针的有效性


       Vulkan中的任何指针参数都必须是有效的(有时nullptr也算)。

       如果一个指针指向的内容不为空、数据类型相同并且满足主机端处理器支持的对齐(内存对齐),则说明该指针有效。

 

2.7.2.3字符串的有效性


       Vulkan中任何以char*定义的参数,其有效值必须是以“\0”结尾的有序值。如果有特殊规定可以为nullptr(NULL)。

 

2.7.2.4枚举的有效性


       Vulkan中任何枚举参数,枚举类型必须相同。一个枚举参数需满足:

  • 枚举类型一致
  • 枚举值不能为以_BEGIN_RANGE,_END_RANGE,_RANGE_SIZE或_MAX_ENUM为后缀的枚举值。

注::

以_BEGIN_RANGE,_END_RANGE,_RANGE_SIZE或_MAX_ENUM为后缀的枚举值,实际上这些枚举值并不是Vulkan API的一部分,应用程序中不应该使用这些值,这些值原本的用途是用于Vulkan内部使用,在将来这些后缀枚举会被遗弃,目前暴露是为了支持老版本。

 

当调用查询或者从Vulkan输出到应用的枚举值不会存在保留的枚举值。保留的枚举值是还未被任何扩展定义的枚举值。

2.7.2.5标志的有效性


       标志(flags)是位掩码(bitmask)的集合。使用VkFlags声明

 typedef uint32_t VkFlags;

       标志用于传递给函数用于配置一些紧凑型选项。但是VkFlags并不直接用于Vulkan API,取而代之的是使用VkFlags的很多别名标志Vk*Flags,并且该标志每一位所代表的的意义定义在Vk*FlagBits中(标志位集,一般是个枚举)。这样做的目的是可以区分不同功能和种类的标志。

       任何Vk*Flags类型参数必须是对应的标志位集中的值,一个有效的标志要么是0要么是对应标志位集中某些值的逻辑或。一个有效的标志位满足如下:

  • 标志位中的值必须囊括在对应标志位集中。比如一个标志的值是VkColorComponentFlags类型的,那么标志的值必须位于VkColorComponentFlagBits中
  • 在一些情况下,某些标志位的组合是互斥的。

      

有时调用查询或者从Vulkan输出到应用的标志在对应的Vk*FlagBits中找不到相关的定义,应用不能依赖这些未定义的位。

注::

本人亲身体会过一个例子,当查询内存类型时,返回来一组标志,其中有一个标志值为0,但是到对应的Vk*FlagBits中找不到该位的定义,后来查阅文档得知0代表本地内存。

       一个标志中只低31位有意义(从0到第30位)。

注::

       只有低31位有意义是由于C编译器对于0x80000000的枚举值未明确定义引起的。在某些情况下当增加该值后数值反倒会减小,这将会破坏ABI规则(2.4应用程序二进制接口)

 

2.7.2.6 结构体类型的有效性


       Vulkan中的所有结构体都会有一个sType属性,该属性必须和VkStructureType枚举对应上。Vulkan API支持的类型有

typedef enum VkStructureType {
    VK_STRUCTURE_TYPE_APPLICATION_INFO = 0,
    VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO = 1,
    VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO = 2,
    VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO = 3,
    VK_STRUCTURE_TYPE_SUBMIT_INFO = 4,
    VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO = 5,
    VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE = 6,
    VK_STRUCTURE_TYPE_BIND_SPARSE_INFO = 7,
    VK_STRUCTURE_TYPE_FENCE_CREATE_INFO = 8,
    VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO = 9,
    VK_STRUCTURE_TYPE_EVENT_CREATE_INFO = 10,
    VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO = 11,
    VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO = 12,
    VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO = 13,
    VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO = 14,
    VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO = 15,
    VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO = 16,
    VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO = 17,
    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO = 18,
    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO = 19,
    VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO = 20,
    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO = 21,
    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO = 22,
    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO = 23,
    VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO = 24,
    VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO = 25,
    VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO = 26,
    VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO = 27,
    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO = 28,
    VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO = 29,
    VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO = 30,
    VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO = 31,
    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO = 32,
    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO = 33,
    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO = 34,
    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET = 35,
    VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET = 36,
    VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO = 37,
    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO = 38,
    VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO = 39,
    VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO = 40,
    VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO = 41,
    VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO = 42,
    VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO = 43,
    VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER = 44,
    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER = 45,
    VK_STRUCTURE_TYPE_MEMORY_BARRIER = 46,
    VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO = 47,
    VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO = 48,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES = 1000094000,
    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO = 1000157000,
    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO = 1000157001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES = 1000083000,
    VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS = 1000127000,
    VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO = 1000127001,
    VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO = 1000060000,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO = 1000060003,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO = 1000060004,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO = 1000060005,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO = 1000060006,
    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO = 1000060013,
    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO = 1000060014,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES = 1000070000,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO = 1000070001,
    VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2 = 1000146000,
    VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2 = 1000146001,
    VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2 = 1000146002,
    VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2 = 1000146003,
    VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2 = 1000146004,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 = 1000059000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 = 1000059001,
    VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2 = 1000059002,
    VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2 = 1000059003,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2 = 1000059004,
    VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2 = 1000059005,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2 = 1000059006,
    VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2 = 1000059007,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2 = 1000059008,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES = 1000117000,
    VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO = 1000117001,
    VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO = 1000117002,
    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO = 1000117003,
    VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO = 1000053000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES = 1000053001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES = 1000053002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES = 1000120000,
    VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO = 1000145000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES = 1000145001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_PROPERTIES = 1000145002,
    VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2 = 1000145003,
    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO = 1000156000,
    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO = 1000156001,
    VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO = 1000156002,
    VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO = 1000156003,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES = 1000156004,
    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES = 1000156005,
    VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO = 1000085000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO = 1000071000,
    VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES = 1000071001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO = 1000071002,
    VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES = 1000071003,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES = 1000071004,
    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO = 1000072000,
    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO = 1000072001,
    VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO = 1000072002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO = 1000112000,
    VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES = 1000112001,
    VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO = 1000113000,
    VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO = 1000077000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO = 1000076000,
    VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES = 1000076001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES = 1000168000,
    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT = 1000168001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES = 1000063000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES = 49,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES = 50,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES = 51,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES = 52,
    VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO = 1000147000,
    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2 = 1000109000,
    VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2 = 1000109001,
    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2 = 1000109002,
    VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2 = 1000109003,
    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2 = 1000109004,
    VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO = 1000109005,
    VK_STRUCTURE_TYPE_SUBPASS_END_INFO = 1000109006,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES = 1000177000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES = 1000196000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES = 1000180000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES = 1000082000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES = 1000197000,
    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO = 1000161000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES = 1000161001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES = 1000161002,
    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO = 1000161003,
    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT = 1000161004,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES = 1000199000,
    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE = 1000199001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES = 1000221000,
    VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO = 1000246000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES = 1000130000,
    VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO = 1000130001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES = 1000211000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES = 1000108000,
    VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO = 1000108001,
    VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO = 1000108002,
    VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO = 1000108003,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES = 1000253000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES = 1000175000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES = 1000241000,
    VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT = 1000241001,
    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT = 1000241002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES = 1000261000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES = 1000207000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES = 1000207001,
    VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO = 1000207002,
    VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO = 1000207003,
    VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO = 1000207004,
    VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO = 1000207005,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES = 1000257000,
    VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO = 1000244001,
    VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO = 1000257002,
    VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO = 1000257003,
    VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO = 1000257004,
    VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR = 1000001000,
    VK_STRUCTURE_TYPE_PRESENT_INFO_KHR = 1000001001,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_CAPABILITIES_KHR = 1000060007,
    VK_STRUCTURE_TYPE_IMAGE_SWAPCHAIN_CREATE_INFO_KHR = 1000060008,
    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_SWAPCHAIN_INFO_KHR = 1000060009,
    VK_STRUCTURE_TYPE_ACQUIRE_NEXT_IMAGE_INFO_KHR = 1000060010,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_PRESENT_INFO_KHR = 1000060011,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_SWAPCHAIN_CREATE_INFO_KHR = 1000060012,
    VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR = 1000002000,
    VK_STRUCTURE_TYPE_DISPLAY_SURFACE_CREATE_INFO_KHR = 1000002001,
    VK_STRUCTURE_TYPE_DISPLAY_PRESENT_INFO_KHR = 1000003000,
    VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR = 1000004000,
    VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR = 1000005000,
    VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR = 1000006000,
    VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR = 1000008000,
    VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR = 1000009000,
    VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT = 1000011000,
    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_RASTERIZATION_ORDER_AMD = 1000018000,
    VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT = 1000022000,
    VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001,
    VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002,
    VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000,
    VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001,
    VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT = 1000028000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_PROPERTIES_EXT = 1000028001,
    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT = 1000028002,
    VK_STRUCTURE_TYPE_IMAGE_VIEW_HANDLE_INFO_NVX = 1000030000,
    VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000,
    VK_STRUCTURE_TYPE_STREAM_DESCRIPTOR_SURFACE_CREATE_INFO_GGP = 1000049000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CORNER_SAMPLED_IMAGE_FEATURES_NV = 1000050000,
    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_NV = 1000056000,
    VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_NV = 1000056001,
    VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057000,
    VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_NV = 1000057001,
    VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_NV = 1000058000,
    VK_STRUCTURE_TYPE_VALIDATION_FLAGS_EXT = 1000061000,
    VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXTURE_COMPRESSION_ASTC_HDR_FEATURES_EXT = 1000066000,
    VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001,
    VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000,
    VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001,
    VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002,
    VK_STRUCTURE_TYPE_MEMORY_GET_WIN32_HANDLE_INFO_KHR = 1000073003,
    VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR = 1000074000,
    VK_STRUCTURE_TYPE_MEMORY_FD_PROPERTIES_KHR = 1000074001,
    VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR = 1000074002,
    VK_STRUCTURE_TYPE_WIN32_KEYED_MUTEX_ACQUIRE_RELEASE_INFO_KHR = 1000075000,
    VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078000,
    VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_WIN32_HANDLE_INFO_KHR = 1000078001,
    VK_STRUCTURE_TYPE_D3D12_FENCE_SUBMIT_INFO_KHR = 1000078002,
    VK_STRUCTURE_TYPE_SEMAPHORE_GET_WIN32_HANDLE_INFO_KHR = 1000078003,
    VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR = 1000079000,
    VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR = 1000079001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR = 1000080000,
    VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_CONDITIONAL_RENDERING_INFO_EXT = 1000081000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONDITIONAL_RENDERING_FEATURES_EXT = 1000081001,
    VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT = 1000081002,
    VK_STRUCTURE_TYPE_PRESENT_REGIONS_KHR = 1000084000,
    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV = 1000087000,
    VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT = 1000090000,
    VK_STRUCTURE_TYPE_DISPLAY_POWER_INFO_EXT = 1000091000,
    VK_STRUCTURE_TYPE_DEVICE_EVENT_INFO_EXT = 1000091001,
    VK_STRUCTURE_TYPE_DISPLAY_EVENT_INFO_EXT = 1000091002,
    VK_STRUCTURE_TYPE_SWAPCHAIN_COUNTER_CREATE_INFO_EXT = 1000091003,
    VK_STRUCTURE_TYPE_PRESENT_TIMES_INFO_GOOGLE = 1000092000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PER_VIEW_ATTRIBUTES_PROPERTIES_NVX = 1000097000,
    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SWIZZLE_STATE_CREATE_INFO_NV = 1000098000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DISCARD_RECTANGLE_PROPERTIES_EXT = 1000099000,
    VK_STRUCTURE_TYPE_PIPELINE_DISCARD_RECTANGLE_STATE_CREATE_INFO_EXT = 1000099001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CONSERVATIVE_RASTERIZATION_PROPERTIES_EXT = 1000101000,
    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_CONSERVATIVE_STATE_CREATE_INFO_EXT = 1000101001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_ENABLE_FEATURES_EXT = 1000102000,
    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_DEPTH_CLIP_STATE_CREATE_INFO_EXT = 1000102001,
    VK_STRUCTURE_TYPE_HDR_METADATA_EXT = 1000105000,
    VK_STRUCTURE_TYPE_SHARED_PRESENT_SURFACE_CAPABILITIES_KHR = 1000111000,
    VK_STRUCTURE_TYPE_IMPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114000,
    VK_STRUCTURE_TYPE_EXPORT_FENCE_WIN32_HANDLE_INFO_KHR = 1000114001,
    VK_STRUCTURE_TYPE_FENCE_GET_WIN32_HANDLE_INFO_KHR = 1000114002,
    VK_STRUCTURE_TYPE_IMPORT_FENCE_FD_INFO_KHR = 1000115000,
    VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR = 1000115001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_FEATURES_KHR = 1000116000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PERFORMANCE_QUERY_PROPERTIES_KHR = 1000116001,
    VK_STRUCTURE_TYPE_QUERY_POOL_PERFORMANCE_CREATE_INFO_KHR = 1000116002,
    VK_STRUCTURE_TYPE_PERFORMANCE_QUERY_SUBMIT_INFO_KHR = 1000116003,
    VK_STRUCTURE_TYPE_ACQUIRE_PROFILING_LOCK_INFO_KHR = 1000116004,
    VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_KHR = 1000116005,
    VK_STRUCTURE_TYPE_PERFORMANCE_COUNTER_DESCRIPTION_KHR = 1000116006,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR = 1000119000,
    VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR = 1000119001,
    VK_STRUCTURE_TYPE_SURFACE_FORMAT_2_KHR = 1000119002,
    VK_STRUCTURE_TYPE_DISPLAY_PROPERTIES_2_KHR = 1000121000,
    VK_STRUCTURE_TYPE_DISPLAY_PLANE_PROPERTIES_2_KHR = 1000121001,
    VK_STRUCTURE_TYPE_DISPLAY_MODE_PROPERTIES_2_KHR = 1000121002,
    VK_STRUCTURE_TYPE_DISPLAY_PLANE_INFO_2_KHR = 1000121003,
    VK_STRUCTURE_TYPE_DISPLAY_PLANE_CAPABILITIES_2_KHR = 1000121004,
    VK_STRUCTURE_TYPE_IOS_SURFACE_CREATE_INFO_MVK = 1000122000,
    VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK = 1000123000,
    VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT = 1000128000,
    VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_TAG_INFO_EXT = 1000128001,
    VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT = 1000128002,
    VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT = 1000128003,
    VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT = 1000128004,
    VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID = 1000129000,
    VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID = 1000129001,
    VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID = 1000129002,
    VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129003,
    VK_STRUCTURE_TYPE_MEMORY_GET_ANDROID_HARDWARE_BUFFER_INFO_ANDROID = 1000129004,
    VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID = 1000129005,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES_EXT = 1000138000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_PROPERTIES_EXT = 1000138001,
    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK_EXT = 1000138002,
    VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO_EXT = 1000138003,
    VK_STRUCTURE_TYPE_SAMPLE_LOCATIONS_INFO_EXT = 1000143000,
    VK_STRUCTURE_TYPE_RENDER_PASS_SAMPLE_LOCATIONS_BEGIN_INFO_EXT = 1000143001,
    VK_STRUCTURE_TYPE_PIPELINE_SAMPLE_LOCATIONS_STATE_CREATE_INFO_EXT = 1000143002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLE_LOCATIONS_PROPERTIES_EXT = 1000143003,
    VK_STRUCTURE_TYPE_MULTISAMPLE_PROPERTIES_EXT = 1000143004,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_FEATURES_EXT = 1000148000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BLEND_OPERATION_ADVANCED_PROPERTIES_EXT = 1000148001,
    VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_ADVANCED_STATE_CREATE_INFO_EXT = 1000148002,
    VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_TO_COLOR_STATE_CREATE_INFO_NV = 1000149000,
    VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_KHR = 1000165006,
    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR = 1000165007,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR = 1000150000,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_GEOMETRY_TYPE_INFO_KHR = 1000150001,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_DEVICE_ADDRESS_INFO_KHR = 1000150002,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_AABBS_DATA_KHR = 1000150003,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_INSTANCES_DATA_KHR = 1000150004,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR = 1000150005,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR = 1000150006,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_KHR = 1000150007,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_KHR = 1000150008,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_VERSION_KHR = 1000150009,
    VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_INFO_KHR = 1000150010,
    VK_STRUCTURE_TYPE_COPY_ACCELERATION_STRUCTURE_TO_MEMORY_INFO_KHR = 1000150011,
    VK_STRUCTURE_TYPE_COPY_MEMORY_TO_ACCELERATION_STRUCTURE_INFO_KHR = 1000150012,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_FEATURES_KHR = 1000150013,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_KHR = 1000150014,
    VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_KHR = 1000150015,
    VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_KHR = 1000150016,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR = 1000150017,
    VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_INTERFACE_CREATE_INFO_KHR = 1000150018,
    VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_MODULATION_STATE_CREATE_INFO_NV = 1000152000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_FEATURES_NV = 1000154000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SM_BUILTINS_PROPERTIES_NV = 1000154001,
    VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT = 1000158000,
    VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_DRM_FORMAT_MODIFIER_INFO_EXT = 1000158002,
    VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT = 1000158003,
    VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT = 1000158004,
    VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT = 1000158005,
    VK_STRUCTURE_TYPE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160000,
    VK_STRUCTURE_TYPE_SHADER_MODULE_VALIDATION_CACHE_CREATE_INFO_EXT = 1000160001,
    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_SHADING_RATE_IMAGE_STATE_CREATE_INFO_NV = 1000164000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_FEATURES_NV = 1000164001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADING_RATE_IMAGE_PROPERTIES_NV = 1000164002,
    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_COARSE_SAMPLE_ORDER_STATE_CREATE_INFO_NV = 1000164005,
    VK_STRUCTURE_TYPE_RAY_TRACING_PIPELINE_CREATE_INFO_NV = 1000165000,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_NV = 1000165001,
    VK_STRUCTURE_TYPE_GEOMETRY_NV = 1000165003,
    VK_STRUCTURE_TYPE_GEOMETRY_TRIANGLES_NV = 1000165004,
    VK_STRUCTURE_TYPE_GEOMETRY_AABB_NV = 1000165005,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MEMORY_REQUIREMENTS_INFO_NV = 1000165008,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PROPERTIES_NV = 1000165009,
    VK_STRUCTURE_TYPE_RAY_TRACING_SHADER_GROUP_CREATE_INFO_NV = 1000165011,
    VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_INFO_NV = 1000165012,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_REPRESENTATIVE_FRAGMENT_TEST_FEATURES_NV = 1000166000,
    VK_STRUCTURE_TYPE_PIPELINE_REPRESENTATIVE_FRAGMENT_TEST_STATE_CREATE_INFO_NV = 1000166001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_IMAGE_FORMAT_INFO_EXT = 1000170000,
    VK_STRUCTURE_TYPE_FILTER_CUBIC_IMAGE_VIEW_IMAGE_FORMAT_PROPERTIES_EXT = 1000170001,
    VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_EXT = 1000174000,
    VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT = 1000178000,
    VK_STRUCTURE_TYPE_MEMORY_HOST_POINTER_PROPERTIES_EXT = 1000178001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT = 1000178002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CLOCK_FEATURES_KHR = 1000181000,
    VK_STRUCTURE_TYPE_PIPELINE_COMPILER_CONTROL_CREATE_INFO_AMD = 1000183000,
    VK_STRUCTURE_TYPE_CALIBRATED_TIMESTAMP_INFO_EXT = 1000184000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_AMD = 1000185000,
    VK_STRUCTURE_TYPE_DEVICE_MEMORY_OVERALLOCATION_CREATE_INFO_AMD = 1000189000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_PROPERTIES_EXT = 1000190000,
    VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_DIVISOR_STATE_CREATE_INFO_EXT = 1000190001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_ATTRIBUTE_DIVISOR_FEATURES_EXT = 1000190002,
    VK_STRUCTURE_TYPE_PRESENT_FRAME_TOKEN_GGP = 1000191000,
    VK_STRUCTURE_TYPE_PIPELINE_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000192000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV = 1000201000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV = 1000202000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV = 1000202001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV = 1000203000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV = 1000204000,
    VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV = 1000205000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = 1000205002,
    VK_STRUCTURE_TYPE_CHECKPOINT_DATA_NV = 1000206000,
    VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_NV = 1000206001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_INTEGER_FUNCTIONS_2_FEATURES_INTEL = 1000209000,
    VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO_INTEL = 1000210000,
    VK_STRUCTURE_TYPE_INITIALIZE_PERFORMANCE_API_INFO_INTEL = 1000210001,
    VK_STRUCTURE_TYPE_PERFORMANCE_MARKER_INFO_INTEL = 1000210002,
    VK_STRUCTURE_TYPE_PERFORMANCE_STREAM_MARKER_INFO_INTEL = 1000210003,
    VK_STRUCTURE_TYPE_PERFORMANCE_OVERRIDE_INFO_INTEL = 1000210004,
    VK_STRUCTURE_TYPE_PERFORMANCE_CONFIGURATION_ACQUIRE_INFO_INTEL = 1000210005,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT = 1000212000,
    VK_STRUCTURE_TYPE_DISPLAY_NATIVE_HDR_SURFACE_CAPABILITIES_AMD = 1000213000,
    VK_STRUCTURE_TYPE_SWAPCHAIN_DISPLAY_NATIVE_HDR_CREATE_INFO_AMD = 1000213001,
    VK_STRUCTURE_TYPE_IMAGEPIPE_SURFACE_CREATE_INFO_FUCHSIA = 1000214000,
    VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT = 1000217000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_FEATURES_EXT = 1000218000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_PROPERTIES_EXT = 1000218001,
    VK_STRUCTURE_TYPE_RENDER_PASS_FRAGMENT_DENSITY_MAP_CREATE_INFO_EXT = 1000218002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_PROPERTIES_EXT = 1000225000,
    VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO_EXT = 1000225001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_SIZE_CONTROL_FEATURES_EXT = 1000225002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_CORE_PROPERTIES_2_AMD = 1000227000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD = 1000229000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT = 1000237000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PRIORITY_FEATURES_EXT = 1000238000,
    VK_STRUCTURE_TYPE_MEMORY_PRIORITY_ALLOCATE_INFO_EXT = 1000238001,
    VK_STRUCTURE_TYPE_SURFACE_PROTECTED_CAPABILITIES_KHR = 1000239000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEDICATED_ALLOCATION_IMAGE_ALIASING_FEATURES_NV = 1000240000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT = 1000244000,
    VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_CREATE_INFO_EXT = 1000244002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TOOL_PROPERTIES_EXT = 1000245000,
    VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT = 1000247000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_FEATURES_NV = 1000249000,
    VK_STRUCTURE_TYPE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COOPERATIVE_MATRIX_PROPERTIES_NV = 1000249002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COVERAGE_REDUCTION_MODE_FEATURES_NV = 1000250000,
    VK_STRUCTURE_TYPE_PIPELINE_COVERAGE_REDUCTION_STATE_CREATE_INFO_NV = 1000250001,
    VK_STRUCTURE_TYPE_FRAMEBUFFER_MIXED_SAMPLES_COMBINATION_NV = 1000250002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_INTERLOCK_FEATURES_EXT = 1000251000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_IMAGE_ARRAYS_FEATURES_EXT = 1000252000,
    VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_INFO_EXT = 1000255000,
    VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT = 1000255002,
    VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT = 1000255001,
    VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT = 1000256000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_FEATURES_EXT = 1000259000,
    VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_LINE_STATE_CREATE_INFO_EXT = 1000259001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINE_RASTERIZATION_PROPERTIES_EXT = 1000259002,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INDEX_TYPE_UINT8_FEATURES_EXT = 1000265000,
    VK_STRUCTURE_TYPE_DEFERRED_OPERATION_INFO_KHR = 1000268000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_EXECUTABLE_PROPERTIES_FEATURES_KHR = 1000269000,
    VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR = 1000269001,
    VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_PROPERTIES_KHR = 1000269002,
    VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INFO_KHR = 1000269003,
    VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_STATISTIC_KHR = 1000269004,
    VK_STRUCTURE_TYPE_PIPELINE_EXECUTABLE_INTERNAL_REPRESENTATION_KHR = 1000269005,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES_EXT = 1000276000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_PROPERTIES_NV = 1000277000,
    VK_STRUCTURE_TYPE_GRAPHICS_SHADER_GROUP_CREATE_INFO_NV = 1000277001,
    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_SHADER_GROUPS_CREATE_INFO_NV = 1000277002,
    VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_TOKEN_NV = 1000277003,
    VK_STRUCTURE_TYPE_INDIRECT_COMMANDS_LAYOUT_CREATE_INFO_NV = 1000277004,
    VK_STRUCTURE_TYPE_GENERATED_COMMANDS_INFO_NV = 1000277005,
    VK_STRUCTURE_TYPE_GENERATED_COMMANDS_MEMORY_REQUIREMENTS_INFO_NV = 1000277006,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEVICE_GENERATED_COMMANDS_FEATURES_NV = 1000277007,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_FEATURES_EXT = 1000281000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TEXEL_BUFFER_ALIGNMENT_PROPERTIES_EXT = 1000281001,
    VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_RENDER_PASS_TRANSFORM_INFO_QCOM = 1000282000,
    VK_STRUCTURE_TYPE_RENDER_PASS_TRANSFORM_BEGIN_INFO_QCOM = 1000282001,
    VK_STRUCTURE_TYPE_PIPELINE_LIBRARY_CREATE_INFO_KHR = 1000290000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_CREATION_CACHE_CONTROL_FEATURES_EXT = 1000297000,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV = 1000300000,
    VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV = 1000300001,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES,
    VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
    VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_MULTIVIEW_CREATE_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTIVIEW_PROPERTIES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2,
    VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2,
    VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_FORMAT_INFO_2,
    VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_QUEUE_FAMILY_PROPERTIES_2,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2,
    VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2_KHR = VK_STRUCTURE_TYPE_SPARSE_IMAGE_FORMAT_PROPERTIES_2,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SPARSE_IMAGE_FORMAT_INFO_2,
    VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_RENDER_PASS_BEGIN_INFO,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_COMMAND_BUFFER_BEGIN_INFO,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_SUBMIT_INFO,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_BIND_SPARSE_INFO,
    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO_KHR = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_DEVICE_GROUP_INFO,
    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_DEVICE_GROUP_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GROUP_PROPERTIES,
    VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_GROUP_DEVICE_CREATE_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO,
    VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO,
    VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES,
    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO,
    VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO,
    VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_SEMAPHORE_INFO,
    VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES,
    VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT16_INT8_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_FLOAT16_INT8_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES,
    VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_CREATE_INFO,
    VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES2_EXT = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_EXT,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGELESS_FRAMEBUFFER_FEATURES,
    VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO,
    VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO_KHR = VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO,
    VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO,
    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_2,
    VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_2,
    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_2,
    VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2_KHR = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2,
    VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO_2,
    VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO_KHR = VK_STRUCTURE_TYPE_SUBPASS_BEGIN_INFO,
    VK_STRUCTURE_TYPE_SUBPASS_END_INFO_KHR = VK_STRUCTURE_TYPE_SUBPASS_END_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_FENCE_INFO,
    VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_EXTERNAL_FENCE_PROPERTIES,
    VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_EXPORT_FENCE_CREATE_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_POINT_CLIPPING_PROPERTIES,
    VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO,
    VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO,
    VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES,
    VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS,
    VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_FILTER_MINMAX_PROPERTIES,
    VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_SAMPLER_REDUCTION_MODE_CREATE_INFO,
    VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2,
    VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2,
    VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2_KHR = VK_STRUCTURE_TYPE_IMAGE_SPARSE_MEMORY_REQUIREMENTS_INFO_2,
    VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2,
    VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2_KHR = VK_STRUCTURE_TYPE_SPARSE_IMAGE_MEMORY_REQUIREMENTS_2,
    VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_FORMAT_LIST_CREATE_INFO,
    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_INFO,
    VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_PLANE_MEMORY_INFO,
    VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO_KHR = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES,
    VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES_KHR = VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_IMAGE_FORMAT_PROPERTIES,
    VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO,
    VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR = VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO,
    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES,
    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO,
    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXT = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT,
    VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_NV = VK_STRUCTURE_TYPE_BIND_ACCELERATION_STRUCTURE_MEMORY_INFO_KHR,
    VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_NV = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_3_PROPERTIES,
    VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT_KHR = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_SUPPORT,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_8BIT_STORAGE_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_ATOMIC_INT64_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES,
    VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES,
    VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO,
    VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO_KHR = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO,
    VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_WAIT_INFO,
    VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_SIGNAL_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_MEMORY_MODEL_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES,
    VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_REFERENCE_STENCIL_LAYOUT,
    VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT_KHR = VK_STRUCTURE_TYPE_ATTACHMENT_DESCRIPTION_STENCIL_LAYOUT,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_ADDRESS_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_EXT,
    VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_EXT = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
    VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_IMAGE_STENCIL_USAGE_CREATE_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_UNIFORM_BUFFER_STANDARD_LAYOUT_FEATURES,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES,
    VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO,
    VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO,
    VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR = VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO,
    VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR = VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO,
    VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_HOST_QUERY_RESET_FEATURES,
    VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF
} VkStructureType;

       一般VkStructureType中的枚举名是有规律的一般是VK_STRUCTURE_TYPE_后面跟着一连串与该枚举值对应的结构体名称,名称中的单词以”_”符号隔开,如果有必要之后会跟上”_EXT”等代表附加属性的信息。

       例如VkImageCreateInfo 中的sType参数需要赋值为VkStructureType中的VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO。

       VkStructureType中的VK_STRUCTURE_TYPE_LOADER_INSTANCE_CREATE_INFO和 VK_STRUCTURE_TYPE_LOADER_DEVICE_CREATE_INFO 是给内部装载使用的,是预留出来的,本规范中不需要使用这两个类型枚举值。

 

2.7.2.7结构体链的有效性


       Vulkan中所有的结构体都会有一个void* pNext参数,该参数要么是空要么是由扩展(extension)定义的有效结构体指针。如果传入pNext的是一系列结构体的话,那么pNext就称为一个pNext链。如果Vulkan支持该扩展,并且必须使用pNext时,必须激活相应的扩展。

       在pNext链中每一个结构体类型(包括该结构体的重命名/别名)不能出现多次。

       如果sType中指定的值Vulkan不支持的话,那么Vulkan中任何组件(加载,激活的层和驱动)都不会处理pNext链(读取sType和pNext的操作除外)。

       Vulkan的核心框架并没有包括扩展部分,但是扩展部分囊括在了扩展分层规范中,或在扩展独立供应商提供的文档中。

       为了方便实现,并且有时层(layers)需要遍历该pNext链,Vulkan API提供了两个基础结构体VkBaseInStructure和VkBaseOutStructure用于帮助我们进行遍历操作,这两个结构体保证了一些类型安全,并且给Vulkan API函数提供常用的输入和输出。这两个结构体声明如下:      

 typedef struct VkBaseInStructure {
    VkStructureType                    sType;
    const struct VkBaseInStructure*    pNext;
} VkBaseInStructure;
  • sType::当前正在遍历的结构体类型
  • pNext::如果为空说明遍历到了结尾,如果不为空说明后面还有

VkBaseInStructure可以用于遍历只读结构体指针链。

typedef struct VkBaseOutStructure {
    VkStructureType               sType;
    struct VkBaseOutStructure*    pNext;
} VkBaseOutStructure;
  • sType::当前正在遍历的结构体类型
  • pNext::如果为空说明遍历到了结尾,如果不为空说明后面还有

VkBaseOutStructure可以用于遍历从Vulkan中返回给应用的指针链。

 

 

2.7.2.8嵌套结构的有效性


上述规则同样也适用于Vulkan函数的输入,函数的直接参数,或者间接引用的其他结构体。

       该规范中对于每一个Vulkan函数都会有自己分别的有效性说明。

 

 

2.7.2.9 扩展的有效性


       Vulkan中的扩展分为两种类型: Vulkan实例类型(instance)扩展、设备类型(device)扩展。

       为了通过Vulkan实例类型扩展来添加Vulkan实例级别的扩展行为和函数,在创建Vulkan实例时,需要使用VkInstanceCreateInfo结构体,该结构体中可以指定需要激活的扩展。如果Vulkan实例支持该级别的扩展的话则可以将该扩展加入等待激活。 如果不支持则禁止加入其中。可以通过调用vkEnumerateInstanceExtensionProperties函数来获取Vulkan实例级别支持的扩展。

       为了通过Vulkan实例类型扩展来添加物理设备级别的扩展行为和函数,在创建Vulkan实例时,需要使用VkInstanceCreateInfo结构体,该结构体中可以指定需要激活的扩展。如果Vulkan实例支持该级别的扩展的话则可以将该扩展加入等待激活。 如果不支持则禁止加入其中。可以通过调用vkEnumerateInstanceExtensionProperties函数来获取Vulkan实例级别支持的扩展。

       通过设备类型扩展来添加物理设备级别的扩展行为和函数,其必须满足扩展物理设备核心功能章节的描述(在第三章中,大致说的是当前物理设备版本如果大于等于Vulkan版本的话,扩展的物理设备功能是可以激活,可以使用vkGetPhysicalDeviceProperties函数来获取当前物理设备支持的Vulkan版本)。

       通过备类型扩展来添加设备级别的行为和函数,添加的扩展必须是对应设备支持的扩展。可以通过调用vkEnumerateDeviceExtensionProperties来获取对应设备支持的扩展,并且将需要激活的扩展(设备支持的)在创建设备时加入到VkDeviceCreateInfo结构体中。

 

       注::

       官方文档写的有点复杂,我在这里捋一下。Vulkan中的扩展分为两类:实例类和设备类。实例类的扩展指的是不管使用的是什么设备都支持的扩展(可以理解成VUlkan官方维护扩展),设备类指的是特定设备支持的扩展。(比如窗口系统集扩展(WSI)是所有设备都支持的扩展,而光线追踪扩展只有在NVIDIA显卡上支持,毕竟光线追踪扩展是NVIDIA本家研发的)。

       在Vulkan中有三个与扩展有关的关键对象(句柄):VkInstance、VkPhysicalDevice和VkDevice。VkInstance代表Vulkan的实例句柄,是必须创建的句柄,在创建时可以指定需要激活的扩展。VkPhysicalDevice代表的物理设备,调用

vkEnumerateDeviceExtensionProperties来获取设备支持的扩展时查询的对象是

VkPhysicalDevice句柄,也就是说查询扩展时查的是物理设备支持的扩展,Vulkan文档叫设备扩展。之后会创建设备句柄也就是VkDevice句柄,它代表的是逻辑设备,Vulkan大部分时间是在和VkDevice打交道,VkDevice在创建时需要指定在哪个VkPhysicalDevice设备上创建,并且指定需要激活的扩展(支持的)。

 

 

2.7.2.10 Vulkan版本的有效性


       在创建Vulkan实例时需要指定使用的Vulkan版本,可以通过调用vkEnumerateInstanceVersion函数来查询当前驱动支持的Vulkan版本。并且在VkApplicationInfo::apiVersion中指定需要激活的Vulkan版本。

       如果想通过新版本的Vulkan使用物理设备或设备上的新功能的话,需要调用vkGetPhysicalDeviceProperties在查询当前使用的Vulkan版本该设备是否支持。设备支持的Vulkan版本位于VkPhysicalDeviceProperties::apiVersion中。

 

2.7.3 返回码

       核心的Vulkan并没有考虑非法使用的情况,核心默认为使用完全正确作为前提。但是在某些情况下Vulkan不得不返回一个结果码。有两种情况:

  • 当Vulkan执行成功时返回成功完成码。所有的成功码都为正数。
  • 当Vulkan执行失败是返回失败码。所有的失败码都为负数。

Vulkan中所有的返回码都是VkResult枚举值,声明如下:

typedef enum VkResult {
    VK_SUCCESS = 0,
    VK_NOT_READY = 1,
    VK_TIMEOUT = 2,
    VK_EVENT_SET = 3,
    VK_EVENT_RESET = 4,
    VK_INCOMPLETE = 5,
    VK_ERROR_OUT_OF_HOST_MEMORY = -1,
    VK_ERROR_OUT_OF_DEVICE_MEMORY = -2,
    VK_ERROR_INITIALIZATION_FAILED = -3,
    VK_ERROR_DEVICE_LOST = -4,
    VK_ERROR_MEMORY_MAP_FAILED = -5,
    VK_ERROR_LAYER_NOT_PRESENT = -6,
    VK_ERROR_EXTENSION_NOT_PRESENT = -7,
    VK_ERROR_FEATURE_NOT_PRESENT = -8,
    VK_ERROR_INCOMPATIBLE_DRIVER = -9,
    VK_ERROR_TOO_MANY_OBJECTS = -10,
    VK_ERROR_FORMAT_NOT_SUPPORTED = -11,
    VK_ERROR_FRAGMENTED_POOL = -12,
    VK_ERROR_UNKNOWN = -13,
    VK_ERROR_OUT_OF_POOL_MEMORY = -1000069000,
    VK_ERROR_INVALID_EXTERNAL_HANDLE = -1000072003,
    VK_ERROR_FRAGMENTATION = -1000161000,
    VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS = -1000257000,
    VK_ERROR_SURFACE_LOST_KHR = -1000000000,
    VK_ERROR_NATIVE_WINDOW_IN_USE_KHR = -1000000001,
    VK_SUBOPTIMAL_KHR = 1000001003,
    VK_ERROR_OUT_OF_DATE_KHR = -1000001004,
    VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001,
    VK_ERROR_VALIDATION_FAILED_EXT = -1000011001,
    VK_ERROR_INVALID_SHADER_NV = -1000012000,
    VK_ERROR_INCOMPATIBLE_VERSION_KHR = -1000150000,
    VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000,
    VK_ERROR_NOT_PERMITTED_EXT = -1000174001,
    VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000,
    VK_THREAD_IDLE_KHR = 1000268000,
    VK_THREAD_DONE_KHR = 1000268001,
    VK_OPERATION_DEFERRED_KHR = 1000268002,
    VK_OPERATION_NOT_DEFERRED_KHR = 1000268003,
    VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT = 1000297000,
    VK_ERROR_OUT_OF_POOL_MEMORY_KHR = VK_ERROR_OUT_OF_POOL_MEMORY,
    VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = VK_ERROR_INVALID_EXTERNAL_HANDLE,
    VK_ERROR_FRAGMENTATION_EXT = VK_ERROR_FRAGMENTATION,
    VK_ERROR_INVALID_DEVICE_ADDRESS_EXT = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,
    VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR = VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS,
    VK_RESULT_MAX_ENUM = 0x7FFFFFFF
} VkResult;

 

  • VK_SUCCESS::函数成功执行
  • VK_NOT_READY::栏栅(Fence)或者一个查询还未结束
  • VK_TIMEOUT::在指定的时间内等待操作还未完成。
  • VK_EVENT_SET::一个事件(event)被激活
  • VK_EVENT_RESET::一个事件(event)被熄灭
  • VK_INCOMPLETE::对于结果返回的数组过于小
  • VK_ERROR_OUT_OF_HOST_MEMORY::本地内存分配失败
  • VK_ERROR_OUT_OF_DEVICE_MEMORY::设备内存分配失败
  • VK_ERROR_INITIALIZATION_FAILED::对象初始化失败
  • VK_ERROR_DEVICE_LOST::逻辑或物理设备丢失
  • VK_ERROR_MEMORY_MAP_FAILED::内存映射失败
  • VK_ERROR_LAYER_NOT_PRESENT::请求激活的层(layer)不存在或是不支
  • VK_ERROR_EXTENSION_NOT_PRESENT::请求激活的扩展不支持
  • VK_ERROR_FEATURE_NOT_PRESENT::请求激活的特性不支持
  • VK_ERROR_INCOMPATIBLE_DRIVER::请求激活的Vulkan版本,当前驱动不支持。
  • VK_ERROR_TOO_MANY_OBJECTS::已经创建了太多该类型的对象
  • VK_ERROR_FORMAT_NOT_SUPPORTED::请求使用的格式当前设备不支持
  • VK_ERROR_FRAGMENTED_POOL::由于池内存碎片导致池分配失败。只有在没有分配本地或设备内存的情况下去容纳新的分配才会返回该错误。在确定池分配失败是由于碎片引起的话,该错误比VK_ERROR_OUT_OF_POOL_MEMORY错误优先级大。
  • VK_ERROR_UNKNOWN::发生了未知错误。有可能是函数参数的非法或者是实现逻辑错误等。
  • VK_ERROR_OUT_OF_POOL_MEMORY::内存池分配失败。当没有分配本地或设备内存就去囊括新的分配会返回该错误。如果是因为碎片问题失败,则会返回VK_ERROR_FRAGMENTED_POOL错误。
  • VK_ERROR_INVALID_EXTERNAL_HANDLE::一个外部句柄已失效。
  • VK_ERROR_FRAGMENTATION::由于碎片问题,描述符池分配失败。
  • VK_ERROR_SURFACE_LOST_KHR::表面对象不再可用
  • VK_ERROR_NATIVE_WINDOW_IN_USE_KHR::请求使用的窗口已经被Vulkan或其他API使用,防止多次被使用。
  • VK_SUBOPTIMAL_KHR::一个交换链(swapchain)与之对应的表面(surface)不再准确匹配,但是仍可以用该表面显示渲染结果。
  • VK_ERROR_OUT_OF_DATE_KHR::交换链已经不再兼容对应的表面(surface),并且显示操作失败。应用必须获取新的与交换链匹配的表面属性,之后重建交换链用于继续显示结果到目标表面上。
  • VK_ERROR_INCOMPATIBLE_DISPLAY_KHR::用于显示的图片和交换链支持的图片布局不兼容
  • VK_ERROR_INVALID_SHADER_NV::一个或多个着色器编译或链接失败。更多细节可通过激活VK_EXT_debug_report(如果支持的话)查看。
  • VK_THREAD_IDLE_KHR::一个延迟操作并没有完成,但是当前线程上还有工作要跑,处于闲置状态。
  • VK_THREAD_DONE_KHR::一个延迟操作并没有完成,但是没有剩余的工作可以分配给多余的线程。
  • VK_OPERATION_DEFERRED_KHR::请求延迟操作,但是至少有一些工作已经延迟
  • VK_OPERATION_NOT_DEFERRED_KHR::请求延迟操作并且没有延迟操作
  • VK_ERROR_PIPELINE_COMPILE_REQUIRED_EXT::创建管线失败,因为某些或是全部必要数据没有进行预编译。
  • VK_ERROR_INVALID_DEVICE_ADDRESS_EXT::因为请求的地址无效,一个缓存(buffer)创建失败。
  • VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS:: 因为请求的地址无效,缓存或者内存分配失败。一个着色器组句柄(shader group handle)分配失败,由于着色器组句柄失效。
  • VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT::当在使用VK_FULL_SCREEN_EXCLUSIVE_APPLICATION_CONTROLLED_EXT创建的交换链上进行操作时,如果发生全屏访问权限剥夺,不再受到应有控制会返回该错误。  

 

如果在运行时函数返回错误码,除非有特殊规定,该函数的输出内容是未定义的(比如创建Vulkan实例,如果创建实例函数返回为失败,则实例句柄值为未定义值)。如果返回的结构体中有sType和pNext参数的话,这两个参数不会改变,但是pNext下的内容是未定义的。

       内存不足错误不会销毁当前存在的对象。成功创建的对象还是可以继续使用的。

 

       注::

       如果返回VK_ERROR_UNKNOWN错误,开发人员应该查看最新的验证层的log信息。如果没有任何信息,那可能是Vulkan自身内部的问题,请去Vulkan开发者取得联系。

       性能关键的函数一般没有返回码。如果在运行时这些函数发生了错误,Vulkan将会延迟返回该错误,直到调用一个可以返回错误码的函数,并使用该函数返回错误码。例如对于记录在命名缓存(command buffer)中的Vulkan命令(vkCmd*),在运行时如果发生错误,该错误将会在调用vkEndCommadnBuffer时将错误码返回。

 

 

2.8数值表达和计算


       Vulkan一般使用浮点计算,并且必须满足Vulkan规定的浮点数范围和精度。

       2.8.1小节的要求只满足除了主色器计算的标准,比如纹理规范和采样,和预片元操作。范围和精度在着色器中的计算是不同的具体可参考Precision and Operation of SPIR-V Instructions章节

       某些情况下,对于布局和精度在Vulkan中被顶点的格式或纹素数据隐示的限制着。

 

2.8.1浮点数计算


       大多数浮点计算都位于SPIR-V着色器中。具体可参考Precision and Operation of SPIR-V Instructions章节

       浮点数计算并不是着色器的专利,在着色器以外也有浮点计算,比如视口(viewport)和深度范围(deoth range)计算。Vulkan并不规定浮点数的值或者如何操作细节,但是规定了数值和精度的最低保证做出了规定。

       Vulkan要求浮点数的浮点部位有足够的bit位用于存储,并且能够表示足够大的数,使得能够精确到1/(10^5)。浮点数能够表达的最大值最起码能到2^32。

       x×0=0×x=0×任意非无限大值=0×任意值(NaN除外)=0

       1×x=x×1=1

       x+0=0+x=x

       0^0=1

       偶尔会有进一步的规定要求,但是大多数单精度浮点数都满足要求。

       对于正无穷大(Inf)和负无求大(-Inf)代表无穷大。NaN代表这不是个数(not a number)比如0/0时。实现可能会对无穷大和NaN提供支持。

 

2.8.2 浮点格式转换


       当数转换成一个定义的浮点数时,转换后的值可能会有限制,限制(四色五入)成另一个数。规范没有规定具体的限制模式。如果一个数大于浮点数的最大值,该数转换成浮点格式时,会被转换成离其最近的浮点格式或者无穷大。对于无符号格式的数据任何小于0的数都会转成0,正无穷还是正无穷大,负无穷大还是负无穷大,如果负无穷大转换成无符号则会变成0,NaN还是NaN。

 

2.8.3 16位浮点数


       16位浮点数,具体请参考 Khronos Data Format Specification

 

2.8.4 无符号11位浮点数


·      11位浮点数,具体请参考 Khronos Data Format Specification

 

2.8.5 无符号10位浮点数


无符号10位浮点数,具体请参考 Khronos Data Format Specification

 

2.8.6 一般要求


       任何合法的浮点数都可以作为Vulkan函数的输入。对于那些不是浮点数的输入Vulkan没有规定,但是最起码这些数值不能使得Vulkan宕机或者以外终止。比如给Vulkan提供负号0或者非正规化数字必定会产生NaN或者无穷大的结果。

       某些计算需要进行除法计算,在除以0的情况下结果是未定义的但是不会导致Vulkan宕机或意外终止。

 

2.9定点数的转换


       当使用顶点属性和像素颜色和深度组件时一般使用整数表达(这句可能想说类似用[0,255]的一个数表示一个颜色的一个通道的这种数据表达)。这些整数一般会被当做归一化整数数据使用(一般的归一化的意思是将一个数映射到[0,1]范围内)。并且将归一化整数转换成浮点数或是将浮点数转成归一化整数。并且转换成的浮点数一般叫做归一化定点数(因为将其映射到了[0,1]范围内)。

       在接下来的小节中,b代表定点整数的二进制长度,由数据类型决定。

       有符号定点整数使用b位二进制补码表示,无符号使用无符号二进制整数表示。

 

2.9.1将归一化定点小数转换成浮点数

       注:

       原Vulkan官方文档这一小节好像写错了。我在原文的基础上修改了一下。

       定点数分为两种:定点整数和定点小数。

  1. 定点整数::就是我们常说的整数。小数点固定,固定在数的最小位后面(例如0.0、23.0、-120.0等XXX.0)。这样可以用来代表一个整数(相当于忽略小数点和小数点后面的所有0)。如果表示一个定点整数的位数为n的话,有1位代表符号位(该数是正还是负)的话,那么可以表示的整数范围为[-2^(n-1),2^(n-1)](n-1的意思是从n位中去掉符号位)。如果是无符号的话整数范围为[-2^n,2^n]。假如说用8位代表一个整数,则有符号整数范围为[-127,127],无符号整数范围为[0,255]。
  2. 定点小数::就是我们常说纯小数,小数点固定,固定在数的最高位前面(例如0.0、0.323、0.476等0.XXX)。这样就可以代表一个纯小数(相当于忽略小数点前面所有的0),如果表示一个定点小数的位数为n的话,有1位代表符号位(该数是正还是负)的话,那么可以表示的范围为[-(1-2^(-(n-1))),(1-2^(-(n-1)))]。(n-1的意思是从n位中去掉符号位)。如果是无符号的话可表示范围为[0,2^-n]。(当时在学《计算机组成原理》时,好像小数有个补码什么的,记不太清楚了,有兴趣的小伙伴可以自己查阅资料。)。无论顶点小数使用什么方式表示,有符号定点小数一般表示为[-1,1]的小数,无符号的一般表示[0,1]的小数。

 

      无符号定点小数代表[0,1]的小数。将无符号定点整数c转换成归一化浮点数f为:

                                                                                 \huge f=\frac{c}{2^{b}-1}

       其中分母为c可以表示的最大值,减去1表示从0开始数,这样f的取值范围为[0,1]。

       有符号定点小数代表[-1,1]的小数,将有符号定点整数c转换成归一化浮点数f为:

                                                              \huge f=max(\frac{c}{2^{b-1}-1},-1)

例如b=8时,有符号整数可以表示[-127,127]之间的数,并且f=c/127就将f映射到了[-1,1],注意0还是会在这个区间的。

 

 

2.9.2浮点数转换成归一化定点小数


       2.9.1的逆运算,略。

 

2.10 Vulkan常见对象类型


       在Vulkan中有些有些对象会被经常使用,包括偏移(offset)、大小(extents)、区域

(rectangles)。

 

2.10.1 偏移


       偏移(offset)用于描述图片或者帧缓存中的像素位置,用二维的(x,y)定义或者三维的(x,y,z)定义。

       对于二维偏移结构体定义如下:

typedef struct VkOffset2D {
    int32_t    x;
    int32_t    y;
} VkOffset2D;

       对于三维偏移结构体定义如下:

typedef struct VkOffset3D {
    int32_t    x;
    int32_t    y;
    int32_t    z;
} VkOffset3D;

 

2.10.2 大小


       大小(extents)用于描述图片或者帧缓存的一个矩形大小。二维的使用宽和高定义,三维的使用宽、高和深度定义。

       二维大小定义如下:      

typedef struct VkExtent2D {
    uint32_t    width;
    uint32_t    height;
} VkExtent2D;

三维大小定义如下:

typedef struct VkExtent3D {
    uint32_t    width;
    uint32_t    height;
    uint32_t    depth;
} VkExtent3D;

 

2.10.3 区域


       区域(rectangles)用于描述图片或者帧缓存的像素区域,一个区域包括一个偏移(offset)定义和一个大小(extent)定义

       二维的区域定义如下:

typedef struct VkRect2D {
    VkOffset2D    offset;
    VkExtent2D    extent;
} VkRect2D;

(๑>ڡ<)☆ 本章完 ヾ(*´▽‘*)ノ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值