Vulkan:vkGetInstanceProcAddress 和 vkGetDeviceProcAddress 之间的区别

Vulkan: difference between vkGetInstanceProcAddress and vkGetDeviceProcAddress

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

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

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

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

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

使用设备特定函数指针可以删除最终分派:


图片来自 khonos loader and layer interface document

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

  1. 从 platform/loader.

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

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

  5. 加载vkEnumeratePhysicalDevices和查询设备相关。

  6. 使用 vkCreateDevice 创建设备并指定所需的扩展。

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

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