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

时间:2016-08-10 13:08:11

标签: c++ vulkan

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

在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库?

1 个答案:

答案 0 :(得分:2)

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

通过vkGetInstanceProcAddr检索实例函数指针。此函数可以检索与设备无关的函数的函数指针。也就是说,对于处理创建/管理/销毁设备的功能,与直接与设备通信的功能相反(即:任何采用VkDeviceVkQueueVkCommandBuffer的功能)。

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

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

因此,您可以创建全局函数指针,可以从任何线程使用该指针与任何设备进行通信。但它们必须是实例函数指针。

或者您可以让Vulkan SDK完成其工作并为您处理所有这些。

  

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

我不知道你想要的原因。用户通常无法在不重新启动计算机的情况下安装新版本的驱动程序级系统(如Vulkan)。即使你可以,你的代码也不知道如何处理它的新东西,因为你的代码是用较低版本编写的。