Vulkan:vkGetInstanceProcAddress和vkGetDeviceProcAddress之间的区别

Mue*_*ito 8 c++ vulkan

vkGetInstanceProcAddr并且vkGetDeviceProcAddrAPI文档中完全遗漏了.但是,他们需要使用交换链执行命令(从而制作任何有意义的Vulkan应用程序).此外,SDK附带的cube/tri演示使用它们非常不一致.

这两种方法是否可以互换,如果没有,有什么区别?

rat*_*eak 13

vkGetInstanceProcAddress 是获取将始终与从传入的实例创建的任何设备一起使用的函数指针.

然而,返回的功能可以包括调度逻辑(通常用于考虑可能或可能不为设备启用的扩展),这可能减慢呼叫的速度.这就是为什么vkGetDeviceProcAddress存在获得没有调度逻辑的功能的原因.您没有义务使用它们,但它可能有助于获得一些额外的速度.

激活多个图层时尤其明显:

在此输入图像描述

使用特定于设备的函数指针,可以删除最终的调度:

在此输入图像描述
来自khonos加载器和图层界面文档的图像

如果您只使用1个设备,则应用程序的操作顺序为:

  1. 获得vkGetInstanceProcAddress从平台/装载机.

  2. vkCreateInstance从中加载以及扩展和图层查询.(使用null作为实例参数)

  3. 创建实例.(您将使用此作为加载其他函数的第一个参数)

  4. 加载vkEnumeratePhysicalDevices并与查询设备相关.

  5. 创建设备并vkCreateDevice指定所需的扩展名.

  6. 加载您需要的所有其他功能并将vkGetDeviceProcAddress设备作为第一个参数传递.