使用Vulkan hpp vk::enumerateInstanceVersion()会导致segfault



我遇到了一个奇怪的问题。我可以从vulkan.h使用vkEnumerateInstanceVersion,但从vulkan.hpp使用vk::enumerateInstanceVersion()会导致memory access violation(segfault(。

我使用此函数创建vk::Instance:

static vk::Instance createInstance()
{
loadVulkanGlobalFunctions();
uint32_t version;
vkEnumerateInstanceVersion(&version); // works fine, returns version 1.2.131
version = vk::enumerateInstanceVersion(); // error 0xC0000005 memory access violation
std::cout << "Supported Vulkan Version is "
<< VK_VERSION_MAJOR(version) << '.'
<< VK_VERSION_MINOR(version) << '.'
<< VK_VERSION_PATCH(version) << 'n';
// instance creation ...
}

我使用默认的动态加载器加载全局Vulkan函数:

static void loadVulkanGlobalFunctions()
{
vk::DynamicLoader loader;
auto vkGetInstanceProcAddr = loader.getProcAddress<PFN_vkGetInstanceProcAddr>("vkGetInstanceProcAddr");
VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr);
}

我在#include <vulkan/vulkan.hpp>之前#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1,并且我的代码中正好有一次VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE

事实证明,在loadVulkanGlobalFunctions中创建的vk::DynamicLoader对象必须延长其生存期,因为它在其析构函数中卸载动态库。因为它是loadVulkanGlobalFunctions退出和堆栈展开时发生的局部变量。我只是把它改成了这个:

static vk::DynamicLoader createVulkanLoader()
{
vk::DynamicLoader loader;
auto vkGetInstanceProcAddr = loader.getProcAddress<PFN_vkGetInstanceProcAddr>("vkGetInstanceProcAddr");
VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr);
return loader;
}

并将结果分配给一个变量,该变量的寿命比vkInstance的寿命长。

最新更新