微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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)来通过调度程序加载的。

解决方法

我不知道为什么,但是突然之间C ++ api调用开始起作用。关于VulkanSDK,我没有做任何更改。我所做的唯一一件事就是重新安装了GPU驱动程序,但是我敢肯定甚至以前也安装了相同的驱动程序。因此重新安装驱动程序可以解决问题,但对我来说还是个谜。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。