Vulkan_05_获取Command地址

获取command地址

参考文档:https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/chap3.html#initialization-instances

环境:Windows + VS2019 + Vulkan SDK 1.2 + Vulkan Program模板(参见:Vulkan_04)。显卡支持的Vulkan版本为 Vulkan 1.1

Vulkan的所有command(提供给应用程序的函数)都是通过动态库提供的。那么就需要在运行时获取command的地址。vkGetInstanceProcAddr就是用来获取command地址的函数。

Windows的Vulkan SDK提供了头文件和静态库,因此可以直接通过静态函数调用command。

vkGetInstanceProcAddr原型

PFN_vkVoidFunction vkGetInstanceProcAddr(
    VkInstance                                  instance,
    const char*                                 pName);

参数

  • instance 为VkInstance
  • pName 为command名称,UTF-8编码。

返回值

返回值为函数指针,定义如下:

typedef void (VKAPI_PTR *PFN_vkVoidFunction)(void);

因为此函数指针的定义没有参数,所以在使用前要经过强制类型转换。下面以vkEnumerateInstanceVersion为例在说明vkGetInstanceProcAddr的使用方式。

获取平台支持的Vulkan的版本

可以用vkEnumerateInstanceVersion来获取平台支持的Vulkan版本。

原型

VkResult vkEnumerateInstanceVersion(
    uint32_t*                                   pApiVersion);

参数

  • pApiVersion 传承参数,传出平台支持的Vulkan版本。可以分别通过VK_VERSION_MAJOR,VK_VERSION_MINOR,VK_VERSION_PATCH来获取major版本号、minor版本号和patch版本号

返回值

始终为VK_SUCCESS

直接通过Vulkan SDK提供的静态函数调用

int main()
{
	uint32_t vulkanInstanceVersion = 0;
	vkEnumerateInstanceVersion(&vulkanInstanceVersion);
	uint32_t majorVersion = VK_VERSION_MAJOR(vulkanInstanceVersion);
	uint32_t minorVersion = VK_VERSION_MINOR(vulkanInstanceVersion);
	uint32_t patchVersion = VK_VERSION_PATCH(vulkanInstanceVersion);
	std::cout << "Major Version is " << majorVersion << " Minor Version is " << minorVersion << " Patch Version is " << patchVersion << std::endl;
}

使用vkGetInstanceProcAddr获取地址的方式调用

/**按照vkEnumerateInstanceVersion说明定义函数指针类型**/
typedef VkResult(*VkEnumerateInstanceVersionCommandType)(uint32_t* version);

int main()
{
    /**获取当前平台Vulkan实现版本**/
    uint32_t vulkanInstanceVersion = 0;
    //获取vkEnumerateInstanceVersion函数指针。注意需要强制类型转换
    VkEnumerateInstanceVersionCommandType pEnumerateInstanceVersionCommand = (VkEnumerateInstanceVersionCommandType)vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion");
    if (NULL == pEnumerateInstanceVersionCommand)
    {
        return 1;
    }
    //调用enumerateInstanceVersionCommand
    pEnumerateInstanceVersionCommand(&vulkanInstanceVersion);
    uint32_t majorVersion = VK_VERSION_MAJOR(vulkanInstanceVersion);
    uint32_t minorVersion = VK_VERSION_MINOR(vulkanInstanceVersion);
    uint32_t patchVersion = VK_VERSION_PATCH(vulkanInstanceVersion);
    std::cout << "Major Version is " << majorVersion << " Minor Version is " << minorVersion << " Patch Version is " << patchVersion << std::endl;
}

如果您的显卡驱动不支持Valkan 1.1,vkGetInstanceProcAddr 获取vkEnumerateInstanceVersion地址时会返回NULL。此时请更新显卡驱动。如果直接通过调用静态函数的方式调用,编译时不会报错,但运行时会报错,提示在动态库中找不到vkEnumerateInstanceVersion

为节约时间,和以免大家看得不耐烦文章写的很简洁。如果在实际操作中遇到问题欢迎留言交流。

发布了53 篇原创文章 · 获赞 22 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 像素格子 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览