Vulkan:vkGetInstanceProcAddress和vkGetDeviceProcAddress之间的区别

时间:2016-02-19 11:46:07

标签: c++ vulkan

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

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

2 个答案:

答案 0 :(得分:13)

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

但是,返回的功能可能包括调度逻辑(通常用于考虑可能启用或未启用设备的扩展),这可能会降低呼叫速度。这就是vkGetDeviceProcAddress存在以获得没有调度逻辑的函数的原因。你没有义务使用它们,但它可能有助于获得一些额外的速度。

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

enter image description here

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

enter image description here
来自khonos loader and layer interface document

图片

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

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

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

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

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

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

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

答案 1 :(得分:1)

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