全局公开 Vulkan 的函数指针是个好主意吗?

Is it a good idea to expose Vulkan's function pointers globally?

本文关键字:好主意 指针 函数 Vulkan 全局      更新时间:2023-10-16

我刚刚在运行时第一次加载了一个共享库。我目前正在做的是创建一个显式上下文,其中加载所有函数指针。

在c++中大致是这样的

auto entry = load_vk(..);
auto instance = entry.CreateInstance(...);
VkInstancePointer vk = load_vk_static_fn(instance);
vk.CreateDevice(...);

问题是我不确定这个的寿命。我需要跨不同的线程访问vk,所以我目前将其包装在shared_ptr<VkInstancePointer>中。我还在析构函数中卸载了库。

我遇到的问题是我想让vulkan api更方便一些,这样我就可以写

physical_device.create_logical_device(...);

但这意味着physical_device需要包含shared_ptr<VkInstancePointer>。这意味着很多东西将有一个额外的原子计数器增量的开销。

我想知道我是否可以全局加载vulkan函数指针?

load_entry();
auto instance = CreateInstance();
load_instance_fp(instance);
auto device = CreateDevice(..);

我通常不使用全局变量,但在这里似乎是有意义的。

我是否想在某个时候卸载Vulkan库?

在Vulkan中有两种函数指针:实例函数指针和设备函数指针。

实例函数指针通过vkGetInstanceProcAddr检索。这个函数可以为与设备无关的函数检索函数指针。也就是说,对于处理创建/管理/销毁设备的函数,而不是直接与设备通信的函数(即:任何接受VkDevice, VkQueueVkCommandBuffer的函数)。

但是它也可以检索与设备本身对话的函数的指针。这些函数可以与任何 Vulkan设备对话,无论它是在函数指针被检索之前还是之后创建的。

相比之下,vkGetDeviceProcAddr获得设备函数指针。这些函数指针是特定于设备的;不能与创建它们时使用的设备不同。

所以你可以创建全局函数指针,它可以从任何线程使用到任何设备。但是它们必须是实例函数指针。

或者你可以让Vulkan SDK完成它的工作,为你处理所有这些。

我是否想在某个时候卸载Vulkan库?

我不知道你为什么想要。如果不重启电脑,用户通常无法安装像Vulkan这样的驱动级系统的新版本。即使可以,您的代码也不知道如何处理这些新内容,因为您的代码是针对较低版本编写的。