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