Получение VK_ERROR_LAYER_NOT_PRESENT с MoltenVk / Vulkan на Mac - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь настроить 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;
}

build

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

1 Ответ

0 голосов
/ 04 апреля 2019

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

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

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

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

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

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

Я думаю, что если вы удалите -lMoltenVK и 5 других слоев libs, у вас все получится.

Вы также можете установить VK_LOADER_DEBUG=all в своей среде, чтобы увидеть, что делает загрузчик. Я подозреваю, что если вы запустите ваше текущее приложение с этим набором, вы ничего не увидите, потому что загрузчик не вмешивается.

Подробнее см. https://vulkan.lunarg.com/doc/sdk/1.1.101.0/mac/loader_and_layer_interface.html.

...