如何解决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 举报,一经查实,本站将立刻删除。