使用 Vulkan-hpp vk::enumerateInstanceVersion() 导致段错误
Using Vulkan-hpp vk::enumerateInstanceVersion() causes segfault
我遇到了一个奇怪的问题。我可以使用 vulkan.h
中的 vkEnumerateInstanceVersion
,但是使用 vulkan.hpp
中的 vk::enumerateInstanceVersion()
会导致 memory access violation
(段错误)。
我用这个函数创建了 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
长。
我遇到了一个奇怪的问题。我可以使用 vulkan.h
中的 vkEnumerateInstanceVersion
,但是使用 vulkan.hpp
中的 vk::enumerateInstanceVersion()
会导致 memory access violation
(段错误)。
我用这个函数创建了 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
长。