繁体   English   中英

在Mac上使用MoltenVk / Vulkan获取VK_ERROR_LAYER_NOT_PRESENT

[英]Getting VK_ERROR_LAYER_NOT_PRESENT with MoltenVk/Vulkan on Mac

我正在尝试在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

请注意,我正在链接.dylibs,但之前也尝试过使用.framework库。

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

我认为问题在于您的应用程序链接不正确。

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

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

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

但是,如果要使用加载程序和图层,则不要将MoltenVK和图层链接到应用程序。 您仅链接加载程序。 然后,加载程序会以ICD动态加载MoltenVK库,并根据需要动态加载图层。

就您而言,您似乎首先要链接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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM