c++ - 在 Mac 上使用 MoltenVk/Vulkan 获取 VK_ERROR_LAYER_NOT_PRESENT

标签 c++ macos clang++ vulkan

我正在尝试在 Mac 上设置 vulkan/MoltenVk,但我在让验证层和扩展正常工作时遇到了一些问题。

我已经下载/安装了 MoltenVk 和 vulkan 库,设置了一些环境变量:

export VULKAN_SDK=/opt/vulkan-sdk
export DYLD_LIBRARY_PATH=$VULKAN_SDK/lib:$DYLD_LIBRARY_PATH
export VK_ICD_FILENAMES=$VULKAN_SDK/etc/vulkan/icd.d/MoltenVK_icd.json
export VK_LAYER_PATH=$VULKAN_SDK/etc/vulkan/explicit_layer.d
export VK_INSTANCE_LAYERS=VK_LAYER_LUNARG_standard_validation

vulkaninfo 按预期工作并显示 6 个验证层。

当我尝试构建自己的项目时,找不到图层。

我创建了一个小型测试项目来尝试弄清楚发生了什么。它编译和链接没有错误,但是当我运行它时,我得到了

[***MoltenVK ERROR***] VK_ERROR_LAYER_NOT_PRESENT: Vulkan layer VK_LAYER_LUNARG_standard_validation is not supported.
vkCreateInstance result: -6

main.cpp(从 https://vulkan.lunarg.com/doc/sdk/latest/mac/getting_started.html 复制)

#include <iostream>
#include <vulkan/vulkan.h>

int main(int argc, const char * argv[]) {
    VkInstance instance;
    VkResult result;
    VkInstanceCreateInfo info = {};
    uint32_t instance_layer_count;

    result = vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr);
    std::cout << instance_layer_count << " layers found!\n";
    if (instance_layer_count > 0) {
        std::unique_ptr<VkLayerProperties[]> instance_layers(new VkLayerProperties[instance_layer_count]);
        result = vkEnumerateInstanceLayerProperties(&instance_layer_count, instance_layers.get());
        for (int i = 0; i < instance_layer_count; ++i) {
            std::cout << instance_layers[i].layerName << "\n";
        }
    }

    const char * names[] = {
        "VK_LAYER_LUNARG_standard_validation"
    };
    info.enabledLayerCount = 1;
    info.ppEnabledLayerNames = names;

    result = vkCreateInstance(&info, NULL, &instance);
    std::cout << "vkCreateInstance result: " << result  << "\n";

    vkDestroyInstance(instance, nullptr);
    return 0;
}

构建

clang++ main.cpp 
-I/opt/vulkan-sdk/include/ 
-rpath /opt/vulkan-sdk/lib 
-L/opt/vulkan-sdk/lib/ 
-lMoltenVk 
-lvulkan 
-lVkLayer_core_validation 
-lVkLayer_object_lifetimes 
-lVkLayer_stateless_validation 
-lVkLayer_thread_safety -lVkLayer_unique_objects 
-o output

请注意,我链接的是 .dylib,但我之前也尝试过使用 .framework 库。

我怀疑我需要链接其他东西,或者在代码中添加特定的环境变量或#define。 有谁知道如何解决这个问题?

最佳答案

我认为问题在于您错误地链接了您的应用程序。

Vulkan 加载程序将 MoltenVK 库 (dylib) 视为 ICD(可安装客户端驱动程序)。加载程序是您在链接命令中使用 -lvulkan 链接的库。 Vulkan 加载器在执行时动态加载 ICD。使用 Vulkan 加载程序时,ICD 不会直接链接到应用程序。

同样,Vulkan 加载器在执行时动态加载层。图层不直接链接到应用程序。

MoltenVK 库有点不寻常,因为它的构建方式使应用程序可以直接链接到它并运行 MoltenVK(Vulkan 子集)应用程序,而无需使用加载程序和层。

但是如果你想使用加载器和图层,你不需要将 MoltenVK 和图层链接到你的应用程序。您只链接加载程序。然后加载程序将 MoltenVK 库作为 ICD 动态加载,并在需要时动态加载层。

在您的情况下,您似乎首先链接了 MoltenVK 库。这可能会首先通过 MoltenVK 库满足所有 Vulkan 符号。您的库列表中的 Vulkan 加载器可能甚至没有包含在您的可执行文件中,因为 MoltenVK 在那里并且 Vulkan 加载器实际上没有做任何事情。

我认为如果你删除 -lMoltenVK 和其他 5 个层库,你会做得更好。

您还可以在您的环境中设置 VK_LOADER_DEBUG=all 以查看加载程序正在做什么。我怀疑如果你用这个集合运行你当前的应用程序,你将看不到任何东西,因为加载程序没有参与。

参见 https://vulkan.lunarg.com/doc/sdk/1.1.101.0/mac/loader_and_layer_interface.html了解更多信息。

关于c++ - 在 Mac 上使用 MoltenVk/Vulkan 获取 VK_ERROR_LAYER_NOT_PRESENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55512981/

相关文章:

c++ - vector vector 的快速分配

c++ - Boost 1.65.1 几何距离策略使用 Visual Studio 2017 编译错误

c++ - “stoi”未在此范围内声明

c++ - Qt4 到 Qt5 链接错误

c++ - Cmake import -lpthread 等

c++ - Qt 小部件何时获得paintEvent?

macos - 如何在 bash 函数中使用 pbcopy?可以脚本化吗?

mysql - 将 mysqldump 添加到 MAMP(MacOS X 上的 MySQL/w Apache PHP)

c++ - 检查工作 CXX 编译器 :/cygdrive/c/cygwin64/bin/clang++ -- broken

c++ - Makefile 有两次看不到 main.o