Vulkan加载全局级函数

加载全局级函数
我们已经获得了vkGetInstanceProcAddr()函数,使用该函数可以通过独立于操作系统的方式加载其他Vulkan函数。

Vulkan函数分为3个等级:全局级、实例级和设备级。设备级函数用于执行标准操作,如绘图、创建着色器模块、创建图像和复制数据;实例级函数用于创建逻辑设备。要加载设备和实例级函数,需要创建实例;全局级函数用于创建示例,所以应最先加载全局级函数。

具体处理过程
(1)在应用程序的源代码中创建一个PFN_vkEnumerateInstanceExtensionProperties类型的变量,将其命名为vkEnumerateInstanceExtensionProperties。
(2)创建一个PFN_vkEnumerateInstanceLayerProperties类型的变量,将其命名为vkEnumerateInstanceLayerProperties。
(3)创建一个PFN_vkCreateInstance类型的变量,将其命名为vkCreateInstance。
(4)调用vkGetInstanceProcAddr(nullptr,"vkEnumerateInstanceExtensionProperties")函数,将该操作的结果转换为PFN_vkEnumerateInstanceExtensionProperties类型,并将之存储在vkEnumerateInstanceExtensionProperties变量中。
(5)调用vkGetInstanceProcAddr(nullptr,"vkEnumerateInstanceLayerProperties")函数,将该操作的结果转换为PFN_vkEnumerateInstanceLayerProperties类型,并将之存储在vkEnumerateInstanceLayerProperties变量中。
(6)调用vkGetInstanceProcAddr(nullptr,"vkCreateInstance")函数,将该操作的结果转换为PFN_vkCreateInstance类型,并将之存储在vkCreateInstance变量中。
(7)通过查明上述所有变量的值都不是nullptr,确认这些操作都已经成功完成。

具体运行情况
Vulkan中仅有3个全局级函数:vkEnumerateInstanceExtensionProperties()、vkEnumerate InstanceLayerProperties()和vkCreateInstance()。这些函数在创建实例的过程中被使用,用于检查哪些实例级扩展和逻辑层可用于创建实例。
获取全局级函数的方式,与获取Vulkan Loader库中其他函数的方式类似。最简洁的方式是将全局级函数的名称添加到ListOfVulkanFunctions.inl文件中。

加载从Vulkan Loader库导出的函数
加载从Vulkan Loader库导出的函数

不需要更改VulkanFunctions.h和VulkanFunctions.cpp文件,但仍旧需要使用上一示例介绍的实现代码并加载全局级函数。

加载从Vulkan Loader库导出的函数
自定义宏GLOBAL_LEVEL_VULKAN_FUNCTION将函数的名称接收为参数,并将该参数提供给vkGetInstanceProcAddr()函数。vkGetInstanceProcAddr()函数会尝试加载指定的函数,如果加载操作失败,vkGetInstanceProcAddr()函数就会返回nullptr。vkGetInstanceProcAddr()函数返回的任何结果都会被转换为PFN_<name>类型,并被存储在合适的变量中。
在加载函数失败的情况下,该宏会显示一条消息,使用户知道哪个函数无法加载。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!

 

Vulkan实战