繁体   English   中英

使用 Vulkan-hpp vk::enumerateInstanceVersion() 会导致段错误

[英]Using Vulkan-hpp vk::enumerateInstanceVersion() causes segfault

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

我使用这个 function 创建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必须延长其生命周期,因为它会在其析构函数中卸载动态库。 因为它是在loadVulkanGlobalFunctions退出并且堆栈展开时发生的局部变量。 我只是将其更改为:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM