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驱动程序,但是我敢肯定甚至以前也安装了相同的驱动程序。因此重新安装驱动程序可以解决问题,但对我来说还是个谜。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...