Vulkan Dynamic Loader-访问函数时违反acces

问题描述

我正在尝试运行以下Nvidia示例:https://github.com/nvpro-samples/gl_render_vk_direct_display 问题在于通话中:

std::vector<vk::PhysicalDevice> devices = m_instance->enumeratePhysicalDevices();

应用程序因错误而崩溃

访问冲突执行位置0x00007FF953BA88E0

如果我在此位置下的VS调试器中检查过程变量,则存储vkEnumeratePhysicalDevices方法地址。奇怪的是,如果我直接调用Vulkan C API的vkEnumeratePhysicalDevices方法而不是C ++ api调用m_instance->enumeratePhysicalDevices(),则不会收到任何访问冲突消息。我有点怀疑问题可能出在新的Vulkan Dynamic加载程序中,但我只是在猜测。创建vk::Instance时,将以这种方式执行加载程序:

  vk::DynamicLoader         dl;
  PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr =
      dl.getProcAddress<PFN_vkGetInstanceProcAddr>("vkGetInstanceProcAddr");
  VULKAN_HPP_DEFAULT_DISPATCHER.init(vkGetInstanceProcAddr);

  // check for required instance extensions
  std::vector<vk::ExtensionProperties> availableInstanceExtensions = vk::enumerateInstanceExtensionProperties();
  for(const auto& required : requiredInstanceExtensions)
  {
    bool found = false;
    for(const auto& available : availableInstanceExtensions)
    {
      if(std::string(required) == available.extensionName)
      {
        found = true;
        break;
      }
    }
    if(!found)
    {
      throw std::exception(("Required instance extension not found: " + std::string(required)).c_str());
    }
  }
  vk::InstanceCreateInfo createInfo{
      vk::InstanceCreateFlags(),nullptr,uint32_t(requiredInstanceExtensions.size()),requiredInstanceExtensions.data()};
  m_instance = vk::createInstanceUnique(createInfo);

  VULKAN_HPP_DEFAULT_DISPATCHER.init(m_instance.get());

使用动态调度程序加载时,我做错什么了吗?

VULKAN_HPP_DEFAULT_DISPATCHER.init(device);

我需要对设备执行相同的初始化吗?就像我在这里看到的https://github.com/KhronosGroup/Vulkan-Hpp/blob/master/tests/DispatchLoaderDynamic/DispatchLoaderDynamic.cpp。对于我来说,这是完全晦涩的,例如,在“ Vulkan最小示例”中,家伙只是通过调度程序地址(https://github.com/dokipen3d/vulkanHppMinimalExample/blob/master/main.cpp)来通过调度程序加载的。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)