-
Notifications
You must be signed in to change notification settings - Fork 179
Description
If macOS VulkanSDK 1.3.296 is used with on installed, run vulkaninfo and you will get this:
ERROR at /Users/lunarg/Dev/macos-sdk-build/Vulkan-Tools/vulkaninfo/./vulkaninfo.h:409: Failed to initialize: Vulkan loader is not installed, not found, or failed to load.
I always use VulkanSDK with no installed and config icd.d/explicit_layer.d manually in /home/me/.config/vulkan and in early version of VulkanSDK it worked.
I checked source code of vulkaninfo, and I found this:
// 1.3.268
VkResult dllErr = dll.Initialize();
if (dllErr != VK_SUCCESS) {
THROW_ERR("Failed to initialize: Vulkan loader is not installed, not found, or failed to load.");
}
// 1.3.296
VkResult dllErr = volkInitialize();
if (dllErr != VK_SUCCESS) {
THROW_ERR("Failed to initialize: " API_NAME " loader is not installed, not found, or failed to load.");
}New version will use volk to perform vulkan library load. And volk initialize do this:
VkResult volkInitialize(void)
{
#if defined(_WIN32)
HMODULE module = LoadLibraryA("vulkan-1.dll");
if (!module)
return VK_ERROR_INITIALIZATION_FAILED;
// note: function pointer is cast through void function pointer to silence cast-function-type warning on gcc8
vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)(void(*)(void))GetProcAddress(module, "vkGetInstanceProcAddr");
#elif defined(__APPLE__)
void* module = dlopen("libvulkan.dylib", RTLD_NOW | RTLD_LOCAL);
if (!module)
module = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL);
if (!module)
module = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL);
// Add support for using Vulkan and MoltenVK in a Framework. App store rules for iOS
// strictly enforce no .dylib's. If they aren't found it just falls through
if (!module)
module = dlopen("vulkan.framework/vulkan", RTLD_NOW | RTLD_LOCAL);
if (!module)
module = dlopen("MoltenVK.framework/MoltenVK", RTLD_NOW | RTLD_LOCAL);
// modern versions of macOS don't search /usr/local/lib automatically contrary to what man dlopen says
// Vulkan SDK uses this as the system-wide installation location, so we're going to fallback to this if all else fails
if (!module && getenv("DYLD_FALLBACK_LIBRARY_PATH") == NULL)
module = dlopen("/usr/local/lib/libvulkan.dylib", RTLD_NOW | RTLD_LOCAL);
if (!module)
return VK_ERROR_INITIALIZATION_FAILED;
vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)dlsym(module, "vkGetInstanceProcAddr");
#else
void* module = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL);
if (!module)
module = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL);
if (!module)
return VK_ERROR_INITIALIZATION_FAILED;
VOLK_DISABLE_GCC_PEDANTIC_WARNINGS
vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr)dlsym(module, "vkGetInstanceProcAddr");
VOLK_RESTORE_GCC_PEDANTIC_WARNINGS
#endif
loadedModule = module;
volkGenLoadLoader(NULL, vkGetInstanceProcAddrStub);
return VK_SUCCESS;
}It just load vulkan dynamic library in system or in working directory, it will break vulkaninfo application when VulkanSDK is not installed.
In my workflow, there is a simple workaround: just copy libvulkan.dylib to same directory of vulkaninfo application or just set working directory of vulkaninfo application to path of libvulkan.dylib.
But you know some projects will pack all the VulkanSDK as 3rd party dependency, in this way, VulkanSDK will not installed, so I want to report this, I think vulkaninfo need to give same experience no matter VulkanSDK installed or not. Cause it is a important tool to diagnose vulkan environment.