8

vkGetInstanceProcAddr并且在API 文档vkGetDeviceProcAddr中完全缺失。然而,他们需要使用交换链执行命令(从而制作任何有意义的 Vulkan 应用程序)。此外,SDK 附带的 cube/tri 演示使用它们非常不一致。

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

4

2 回答 2

14

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

然而,返回的函数可能包括调度逻辑(通常是为了说明可能会或可能不会为设备启用的扩展),这可能会减慢调用速度。这就是为什么vkGetDeviceProcAddress存在获取没有调度逻辑的函数的原因。您没有义务使用它们,但它可能有助于获得一些额外的速度。

当您激活多个图层时,这一点尤其明显:

在此处输入图像描述

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

在此处输入图像描述
来自khonos 加载器和层接口文档的图像

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

  1. vkGetInstanceProcAddress从平台/加载器获取。

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

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

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

  5. vkCreateDevice使用指定的扩展名创建设备。

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

于 2016-02-19T12:00:46.423 回答
1

上面的答案是正确的。我要补充一点,对于 WSI 扩展,Windows、Linux 和 Android 加载器都表示它们将导出 WSI 扩展入口点。因此,在这些平台上,不需要使用 vkGetInstanceProcAddr 和 vkGetDeviceProcAddr 来获取 WSI 入口点。但一般来说,扩展入口点需要通过 Vulkan 中的 vkGet*ProcAddr 检索。

于 2016-02-19T15:47:04.933 回答