Использование Vulkan-hpp vk :: enumerateInstanceVersion () вызывает segfault - PullRequest
0 голосов
/ 11 июля 2020

Я столкнулся со странной проблемой. Я могу использовать vkEnumerateInstanceVersion из vulkan.h, но использование vk::enumerateInstanceVersion() из vulkan.hpp вызывает 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, используя динамический c загрузчик по умолчанию:

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

I #define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1 до #include <vulkan/vulkan.hpp>, и в моем коде VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE ровно один раз.

1 Ответ

0 голосов
/ 21 июля 2020

Оказалось, что у объекта vk::DynamicLoader, созданного в loadVulkanGlobalFunctions, должно быть увеличено время жизни, так как он выгружает библиотеку c Dynami в своем деструкторе. Поскольку это локальная переменная, которая возникает при выходе loadVulkanGlobalFunctions и раскручивании стека. Я просто изменил его на это:

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

И присвоил результат переменной, время жизни которой больше, чем у vkInstance.

...