【问题标题】:How to set validation layers from within program rather than env var?如何从程序内部而不是 env var 设置验证层?
【发布时间】:2021-09-26 02:35:43
【问题描述】:

官方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);

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

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

更具体地说,我在运行 sn -p 时遇到的错误发生在 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();

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

【问题讨论】:

  • 发布的代码看起来不错,应该可以工作。
  • 我添加了一些附加信息,除非通过环境变量指定层路径,否则它不起作用。
  • 设置环境变量的时候,是否也设置了VK_LAYER_PATH?如果是这样,您仍然需要为要找到的图层进行设置。
  • 这就是我在这个问题上所说的。阅读文档,您似乎可以通过编程方式完成所有操作,但只有设置 VK_LAYER_PATH 才能让我的程序正常工作
  • 哪些层可用以及它们所在的位置不是您可以控制的,因为它可能因系统而异。您“可以”以编程方式控制的是启用了哪些层。

标签: c++ environment-variables vulkan validation-layers


【解决方案1】:

只需VkInstanceCreateInfo::ppEnabledLayerNames 启用层。

图层必须可用才能启用。这可以通过vkEnumerateInstanceLayerProperties 确定。

显然,Vulkan 并不神奇,加载程序需要知道在哪里寻找扩展。该系统在LoaderAndLayerInterface.md 中进行了概述。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多