Получение VK_ERROR_LAYER_NOT_PRESENT с помощью MoltenVk/Vulkan на Mac

Я пытаюсь настроить vulkan/MoltenVk на Mac, и у меня возникают проблемы с работой слоев и расширений проверки.

Я скачал/установил библиотеки 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 в код. Кто-нибудь знает, как это исправить?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 320
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что проблема в том, что вы неправильно связываете свое приложение.

Библиотека MoltenVK (dylib) рассматривается загрузчиком Vulkan как ICD (устанавливаемый клиентский драйвер). Загрузчик — это библиотека, которую вы связываете -lvulkan в своей команде ссылки. Загрузчик Vulkan динамически загружает ICD во время выполнения. При использовании загрузчика Vulkan ICD не связаны напрямую с приложением.

Точно так же загрузчик Vulkan динамически загружает слои во время выполнения. Слои не связаны напрямую с приложением.

Библиотека MoltenVK немного необычна, потому что она построена таким образом, что приложение может ссылаться на нее напрямую и запускать приложения MoltenVK (подмножество Vulkan) без использования загрузчика и слоев.

Но если вы хотите использовать загрузчик и слои, вы не связываете MoltenVK и слои со своим приложением. Вы связываете только загрузчик. Затем загрузчик динамически загружает библиотеку MoltenVK как ICD и динамически загружает слои по запросу.

В вашем случае, похоже, вы сначала подключаете библиотеку MoltenVK. Это может привести к тому, что сначала будут удовлетворены все символы Vulkan через библиотеку MoltenVK. Загрузчик 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 для получения дополнительной информации.

Спасибо, Карл. Это было именно так. clang++ main.cpp -I/opt/vulkan-sdk/include/ -rpath /opt/vulkan-sdk/lib -L/opt/vulkan-sdk/lib/ -lvulkan -o output Достаточно, чтобы все заработало.

Jroddev 05.04.2019 09:40

Другие вопросы по теме