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