【发布时间】:2019-08-26 00:50:11
【问题描述】:
我正在尝试在 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
请注意,我链接的是 .dylib,但我之前也尝试过使用 .framework 库。
我怀疑我需要链接其他东西,或者在代码中添加特定的环境变量或#define。 有谁知道如何解决这个问题?
【问题讨论】: