vkGetInstanceProcAddr
并且在API 文档vkGetDeviceProcAddr
中完全缺失。然而,他们需要使用交换链执行命令(从而制作任何有意义的 Vulkan 应用程序)。此外,SDK 附带的 cube/tri 演示使用它们非常不一致。
这两种方法是否可以互换,如果不能,有什么区别?
vkGetInstanceProcAddress
是获取将始终与从传入的实例创建的任何设备一起使用的函数指针。
然而,返回的函数可能包括调度逻辑(通常是为了说明可能会或可能不会为设备启用的扩展),这可能会减慢调用速度。这就是为什么vkGetDeviceProcAddress
存在获取没有调度逻辑的函数的原因。您没有义务使用它们,但它可能有助于获得一些额外的速度。
当您激活多个图层时,这一点尤其明显:
使用特定于设备的函数指针,可以删除最终调度:
如果您只使用 1 个设备,则应用程序的操作顺序为:
vkGetInstanceProcAddress
从平台/加载器获取。
vkCreateInstance
从中加载以及扩展和图层查询。(使用 null 作为实例参数)
创建实例。(您将使用它作为加载其他函数的第一个参数)
加载vkEnumeratePhysicalDevices
并与查询设备相关。
vkCreateDevice
使用指定的扩展名创建设备。
加载您需要的所有其他功能,vkGetDeviceProcAddress
并将设备作为第一个参数传递。
上面的答案是正确的。我要补充一点,对于 WSI 扩展,Windows、Linux 和 Android 加载器都表示它们将导出 WSI 扩展入口点。因此,在这些平台上,不需要使用 vkGetInstanceProcAddr 和 vkGetDeviceProcAddr 来获取 WSI 入口点。但一般来说,扩展入口点需要通过 Vulkan 中的 vkGet*ProcAddr 检索。