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

如何从程序内部而不是 env var 设置验证层?

如何解决如何从程序内部而不是 env var 设置验证层?

官方 vulkan documentation 声明:

应用程序可以通过 vkCreateInstance() 入口点以编程方式激活层。

这是设置环境变量的替代方法。但是,本节中没有其他关于如何设置它们的内容。我们可以阅读 VkCreateInstance 的 official docs,它没有说明验证层,因此我们可以查看 CreateInfo。此处唯一相关的字段似乎是 ppEnabledLayerNames

基于到目前为止的所有内容,人们可能认为将正确的字符串传递给创建信息就足以设置图层。所以人们可能会这样做:

    const std::vector<const char*> VALIDATION_LAYERS = {"VK_LAYER_KHRONOS_validation"};

    // Create Vulkan instance to communicate with the loader
    vk::InstanceCreateInfo create_info = {};
    create_info.pApplicationInfo = &program_info,create_info.enabledLayerCount = static_cast<uint32_t>(VALIDATION_LAYERS.size()),create_info.ppEnabledLayerNames = VALIDATION_LAYERS.data(),create_info.enabledExtensionCount = static_cast<uint32_t>(required_extensions.size()),create_info.ppEnabledExtensionNames = required_extensions.data();

    auto [result,instance] = vk::createInstanceUnique(create_info);

我正在一个更大的应用程序中运行上述代码段。如果我按照文档中的描述手动设置 env var,它就会运行。但是,如果我不设置 env var 而是仅依赖上面的代码片段,我的程序就会在创建实例时崩溃。

由于文档明确说您可以通过编程方式进行设置,但似乎没有说明如何设置,您应该怎么做才能避免依赖 env var?

更具体地说,我在运行代码段时遇到的错误发生在 hpp 标头中,断言失败:

typename vk::ResultValueType<vk::UniqueHandle<Type,dispatch> >::type vk::createResultValue(vk::Result,T&,const char*,const typename vk::UniqueHandleTraits<Type,dispatch>::deleter&) [with T = vk::Instance; D = vk::dispatchLoaderStatic; typename vk::ResultValueType<vk::UniqueHandle<Type,dispatch> >::type = vk::ResultValue<vk::UniqueHandle<vk::Instance,vk::dispatchLoaderStatic> >; typename vk::UniqueHandleTraits<Type,dispatch>::deleter = vk::ObjectDestroy<vk::noparent,vk::dispatchLoaderStatic>]: Assertion `result == Result::eSuccess' Failed.

使用 gdb 分析堆栈显示这发生在实例创建时。 导致断言失败的具体错误代码vk::Result::eErrorLayerNotPresent

作为附加信息,调用auto [result,availableLayers] = vk::enumerateInstanceLayerProperties();

调用实例创建之前立即返回一个空数组。

解决方法

只需 VkInstanceCreateInfo::ppEnabledLayerNames 启用层。

层必须可用才能启用。这可以由 vkEnumerateInstanceLayerProperties 确定。

显然,Vulkan 不是魔术,加载程序需要知道在哪里寻找扩展。 LoaderAndLayerInterface.md 中概述了该系统。

基本上在 Windows 上,它在注册表中的规范路径中查找。在 Linux 上,它查找文件系统中的规范路径。这些将由 SDK 的可安装版本设置。或者 VK_LAYER_PATH 环境变量可以覆盖默认路径。

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