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

标签 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 库?

最佳答案

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

实例函数指针通过vkGetInstanceProcAddr检索。此函数可以检索与设备无关的函数的函数指针。也就是说,对于处理创建/管理/销毁设备的函数,而不是直接与设备对话的函数(即:任何采用 VkDeviceVkQueue 的函数或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/

相关文章:

c++ - 如何获取当前函数的标识符?

变体的 C++ boost::spirit::karma 规则

c++ - OpenCV 和最新的 PS3 Eye 驱动程序

OpenCL、Vulkan、Sycl

Vulkan:一次创建一个管道、命令缓冲区等有什么缺点吗?

c++ - vkCreateSwapchainKHR 错误

resize - 调整 xcb 窗口大小时 VkSurfaceKHR 不会更新

c++ - 对于具有默认分配器的标准容器,std::container::size_type 是否保证为 size_t?

c++ - 如何在解决方案中跨项目使用全局变量?

definition - Vulkan 术语中的 "presentation engine"到底是什么?