创建Vulkan实例

创建Vulkan实例,Vulkan实例是用来构建应用程序的最重要的对象之一,它保存了所有应用程序的状态信息。它的类型为VkInstance,并且是由VulkanInstance类内部进行管理的,这个类是用户定义和编写的(VulkanInstance.h/cpp)。这个类负责Vulkan实例对象的创建和销毁工作。下面是头文件中的代码实现过程:

创建Vulkan实例

创建Vulkan实例

Vulkan实例的创建需要通过VkApplicationInfo结构体对象传入一系列参数,参见以下代码中的appInfo。这个结构体对象提供了应用程序相关的关键信息,例如名称、版本、引擎等。此外,它还负责将应用程序中用到的Vulkan API的版本告诉驱动层。如果这个版本和底层驱动并不兼容的话,应用程序会直接报告错误(如果启用了验证层的话)。

创建Vulkan实例
创建VkInstance对象时需要用到API函数vkCreateInstance()。这个函数用到了一个结构体VkInstanceCreateInfo,即instInfo。结构体对象中包含了成员appInfo(VkApplicationInfo)来设置应用程序相关的属性。此外,VkInstanceCreateInfo对象还可以用来启用实例相关的层和对应的扩展。

Vulkan实例创建函数的语法

创建Vulkan实例
函数vkCreateInstance的参数说明如表所示:
创建Vulkan实例

下面给出结构体VKInstanceCreateInfo的语法和成员对象:
创建Vulkan实例

VKInstanceCreateInfo的参数说明如表所示:
创建Vulkan实例

VKInstanceCreateInfo将VkApplicationInfo作为自己的一个成员变量使用。我们可以看一下这个结构体的主要内容:

创建Vulkan实例

这个结构体的参数说明如表所示:
创建Vulkan实例

apiVersion中设置的修订版本号在创建实例对象时是自动忽略的。参数apiVersion中只有主版本号和副版本号是必须和本机驱动端严格匹配的。
如果应用程序即将退出,那么我们需要销毁Vulkan实例对象,此时会用到用户自定义的函数destroyInstance():

创建Vulkan实例
在这个函数中调用了API函数vkDestroyInstance(),其输入参数包括准备销毁的Vulkan实例句柄。下面给出了这个API函数的语法和具体描述:

创建Vulkan实例
vkDestroyInstance函数的参数说明如表所示:
创建Vulkan实例

启用层和扩展

在Vulkan中启用层是很简单的。应用程序必须提前查询当前Vulkan驱动中可用层的信息。这一过程可以很方便地通过查询和输出基于实例的层信息来完成,如Vulkan 扩展简介中所介绍的那样。

下面给出启用层和扩展的具体实现流程:
1)向VulkanLayerAndExtension类添加两个向量列表。第一个列表包含了所有需要启用的层的名称。第二个列表包括了应用程序中所用到的扩展:
创建Vulkan实例

2)在应用程序的main.cpp中启用一个层(VK_LAYER_LUNARG_api_dump)以及两个扩展(VK_KHR_SURFACE_EXTENSION_NAME和VK_KHR_WIN32_SURFACE_EXTENSION_NAME)。

3)函数createInstance()参数中包含了层和扩展的列表。如果没有需要设置的列表,那么直接向参数变量ppEnabledLayerNames和ppEnabledExtensionNames传入NULL即可:

创建Vulkan实例

LunarG Vulkan SDK中支持多种类型的调试和验证层。在这个例子中,我们会启用VK_LAYER_LUNARG_api_dump。这个层负责将Vulkan API的调用信息(包括参数和值)打印出来。基于实例的层可以在运行时直接注入。

测试启用后的层和扩展

按照下面的步骤完成测试输出:

1)创建VulkanApplication类,实现构造函数和用于创建实例对象的成员函数(createVulkanInstance)。注意这个类遵循单态的设计模式。更多相关的信息可以直接参看代码文件VulkanApplication.h/.cpp
创建Vulkan实例
2)在主程序main.cpp中设置实例端的层和扩展,启用实例层VK_LAYER_LUNARG_api_dump。此外还有扩展VK_KHR_SURFACE_EXTENSION_NAME和VK_KHR_WIN32_SURFACE_EXTENSION_NAME。这个层可以打印所有的API调用,以及参数和返回值:

创建Vulkan实例
3)编译工程,打开控制台,进入当前可执行程序文件梭子的目录。输入[可执行文件名].exe>[重定向输出文件名],比如如图所示的3_0_DeviceHandshake.exe>apiDump.txt
创建Vulkan实例

4)输出的结果如下所示:

创建Vulkan实例

创建Vulkan实例

我们也可以直接显式地启用层,方法是直接设置Windows环境变量VK_INSTANCE_LAYERS=VK_LAYER_LUNARG_api_dump。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!