加载Vulkan函数的准备工作

加载Vulkan函数的准备工作
当我们想要在自己编写的应用程序中使用Vulkan时,需要调用在Vulkan说明文档中有详细说明的函数。因此,为Vulkan Loader库添加依赖关系,第一种方式是使用vulkan.h头文件中定义的函数原型,以静态方式将Vulkan Loader库和我们开发的软件项目关联起来;第二种方式是禁用vulkan.h头文件中定义的函数原型,在我们编写的应用程序的源代码中,以动态方式加载函数的指针。

第一种方式更简单一点,但会使用直接在Vulkan Loader库中定义的函数。当需要在具体设备上执行操作时,Vulkan Loader库需要根据我们以参数形式提供的设备句柄,重新定向调用函数语句,才能调用适当的程序。这种重新定向操作会花一些时间,因此会影响性能。

第二种方式需要在应用程序的源代码中多做一些工作,但能够避免第一种方式中的重新定向操作,并且会提升一些性能。在使用这种方式时,如果我们不需要使用全部的Vulkan函数,则可以选择仅加载一部分Vulkan函数。

本书介绍第二种方式,因为这会在控制应用程序方面为开发者提供更多权力。要通过动态方式加载Vulkan Loader库中的函数,可以将Vulkan函数的名称封装在一组简单的宏中,并将函数的声明、定义和加载语句分别存储在多个文件中。

具体处理过程
(1)在软件开发项目中定义VK_NO_PROTOTYPES预处理指令:如果用户使用Microsoft Visual Studio或Qt Creator之类的开发环境,可以在项目属性(project properties)对话框中执行该操作,也可以在编写的应用程序的源代码中,在导入vulkan.h文件的语句前面,使用预处理指令#define VK_NO_PROTOTYPES执行该操作。

(2)新建一个文件,将其命名为ListOfVulkanFunctions.inl。
(3)在ListOfVulkanFunctions.inl文件中添加下列内容。

加载Vulkan函数的准备工作

加载Vulkan函数的准备工作

(4)新建一个头文件,将之命名为VulkanFunctions.h。
(5)将下面的内容插入到VulkanFunctions.h头文件中。

加载Vulkan函数的准备工作
(6)新建一个源代码文件,将其命名为VulkanFunctions.cpp。
(7)将下面的内容添加到VulkanFunctions.cpp文件中。

加载Vulkan函数的准备工作

加载Vulkan函数的准备工作

具体运行情况
前面介绍的这几个文件虽然不易被理解,但是,VulkanFunctions.h和VulkanFunctions.cpp文件的确可用于声明和定义,以及存储Vulkan函数指针的变量。这些声明和定义是通过便捷的宏定义和导入ListOfVulkanFunctions.inl文件的语句完成的。将来我们可以更新ListOfVulkanFunctions.inl文件,在该文件中以各种调用等级的形式列出Vulkan函数的名称。这样我们就不需要在不同的位置多次重复书写这些函数的名称,从而能避免打字错误。只需要在ListOfVulkanFunctions.inl文件中键入必要的Vulkan函数的名称一次,就可以在需要时随时导入该文件。

对于指针被存储在变量中的Vulkan函数,怎样才能知道其类型呢?这非常简单,函数的名称直接提示了该函数原型的类型。如果函数的名称为<name>,那么该函数的类型就是PFN_<name>。例如,一个用于创建图像的函数名为vkCreateImage(),该函数的类型为PFN_vkCreateImage。这也是前面几个文件中定义的宏仅将函数的名称作为唯一参数的原因,通过函数的名称可以轻松得到函数的类型。

用于存储Vulkan函数地址变量的声明和定义,应该放置在命名空间、类或结构中。这是因为如果将这些声明和定义设置为全局级,那么可能会在某些操作系统中引发问题。牢记使用命名空间并提高代码的可移植性,会得到更好的成果。

TIP 应该将用于存储Vulkan函数指针变量的声明和定义,放置在命名空间、类或结构中。

完成这些准备工作后,就可以加载Vulkan函数。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战