首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mac上用MoltenVk/Vulkan实现VK_ERROR_LAYER_NOT_PRESENT

在Mac上用MoltenVk/Vulkan实现VK_ERROR_LAYER_NOT_PRESENT
EN

Stack Overflow用户
提问于 2019-04-04 09:55:14
回答 1查看 1.7K关注 0票数 3

我正试图在Mac上安装vulkan/MoltenVk,而且我在验证层和扩展的工作上遇到了一些困难。

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

代码语言:javascript
复制
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个验证层.

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

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

代码语言:javascript
复制
[***MoltenVK ERROR***] VK_ERROR_LAYER_NOT_PRESENT: Vulkan layer VK_LAYER_LUNARG_standard_validation is not supported.
vkCreateInstance result: -6

main.cpp (从started.html复制)

代码语言:javascript
复制
#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;
}

构建

代码语言:javascript
复制
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。有人知道怎么解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-04 17:13:46

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

MoltenVK库(dylib)被Vulkan加载程序视为ICD (Installable驱动程序)。加载器是链接命令中要与-lvulkan链接的库。Vulkan加载程序在执行时动态加载ICD。使用Vulkan加载程序时,ICD不会直接链接到应用程序。

类似地,Vulkan加载程序在执行时动态加载层。层不直接链接到应用程序。

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

但是,如果要使用加载程序和层,则不将MoltenVK和层链接到应用程序。你只连接装载机。然后加载器将MoltenVK库动态加载为ICD,并在请求时动态加载层。

在您的示例中,看起来您首先要链接MoltenVK库。这可能会首先通过MoltenVK库满足所有的Vulkan符号。库列表中的Vulkan加载程序可能甚至没有包括在您的可执行文件中,因为MoltenVK在那里,而Vulkan加载程序实际上没有做任何事情。

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

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

有关更多信息,请参见interface.html

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55512981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档