【问题标题】:Using Vulkan-hpp vk::enumerateInstanceVersion() causes segfault使用 Vulkan-hpp vk::enumerateInstanceVersion() 会导致段错误
【发布时间】:2020-07-11 16:00:30
【问题描述】:

我遇到了一个奇怪的问题。我可以使用来自vulkan.hvkEnumerateInstanceVersion,但使用来自vulkan.hppvk::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 &lt;vulkan/vulkan.hpp&gt; 之前是#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1,而我的代码中只有一次VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE

【问题讨论】:

    标签: c++ graphics 3d segmentation-fault vulkan


    【解决方案1】:

    事实证明,在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 的生命周期长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-18
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 2021-05-25
      相关资源
      最近更新 更多