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





Я думаю, что проблема в том, что вы неправильно связываете свое приложение.
Библиотека 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Достаточно, чтобы все заработало.