我刚刚在运行时第一次加载共享库。我当前正在做的是创建一个显式上下文,在其中加载所有函数指针。
在 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
、VkQueue
的函数或VkCommandBuffer
)。
但它也可以检索与设备本身对话的函数的指针。这些函数可以与任何 Vulkan 设备通信,无论它是在检索函数指针之前还是之后创建的。
相比之下,vkGetDeviceProcAddr
获取设备函数指针。这些函数指针是特定于设备的;它们不能与创建它们时使用的设备不同的设备一起使用。
因此,您可以创建全局函数指针,任何线程都可以使用它来与任何设备通信。但它们必须是实例函数指针。
或者您可以让 Vulkan SDK 完成其工作并为您处理所有这些。
Do I ever want to unload the Vulkan library at some point?
我不知道你为什么想要这么做。用户通常无法在不重新启动机器的情况下安装像 Vulkan 这样的驱动程序级系统的新版本。即使可以,您的代码也不知道如何处理新内容,因为您的代码是针对较低版本编写的。
关于c++ - 全局公开 Vulkan 的函数指针是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38874371/