From 104e82601d9cb741a39d00e66d78b853dc942367 Mon Sep 17 00:00:00 2001 From: Amrit Bhogal Date: Thu, 13 Mar 2025 11:07:27 +0000 Subject: [PATCH 1/8] added more places to search for libvulkan --- src/core/gpu_vk.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/core/gpu_vk.c b/src/core/gpu_vk.c index c177f81ba..d4c640ada 100644 --- a/src/core/gpu_vk.c +++ b/src/core/gpu_vk.c @@ -2524,9 +2524,25 @@ bool gpu_init(gpu_config* config) { state.library = LoadLibraryA("vulkan-1.dll"); ASSERT(state.library, "Failed to load vulkan library") goto fail; vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) GetProcAddress(state.library, "vkGetInstanceProcAddr"); -#elif __APPLE__ - state.library = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL); +#else + // Checking if vulkan was linked in (`-DLOVR_LINK_VULKAN`) + state.library = NULL; + void *selflib = dlopen(NULL, RTLD_NOW); + if (selflib) { + if (dlsym(selflib, "vkGetInstanceProcAddr")) + state.library = selflib; + else + dlclose(selflib); + } + +#ifdef __APPLE__ + state.library = dlopen("libvulkan.dylib", RTLD_NOW | RTLD_LOCAL); + if (!state.library) state.library = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL); if (!state.library) state.library = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL); + if (!state.library) state.library = dlopen("vulkan.framework/vulkan", RTLD_NOW | RTLD_LOCAL); + if (!state.library) state.library = dlopen("MoltenVK.framework/MoltenVK", RTLD_NOW | RTLD_LOCAL); + if (!state.library && getenv("DYLD_FALLBACK_LIBRARY_PATH") == NULL) + state.library = dlopen("/usr/local/lib/libvulkan.dylib", RTLD_NOW | RTLD_LOCAL); ASSERT(state.library, "Failed to load vulkan library") goto fail; vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) dlsym(state.library, "vkGetInstanceProcAddr"); #else @@ -2534,6 +2550,7 @@ bool gpu_init(gpu_config* config) { if (!state.library) state.library = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); ASSERT(state.library, "Failed to load vulkan library") goto fail; vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) dlsym(state.library, "vkGetInstanceProcAddr"); +#endif #endif GPU_FOREACH_ANONYMOUS(GPU_LOAD_ANONYMOUS); From 0e6c527f8332eaced950287ae8dd343eeb4c7519 Mon Sep 17 00:00:00 2001 From: Amrit Bhogal Date: Thu, 13 Mar 2025 11:13:13 +0000 Subject: [PATCH 2/8] update cmakelists to allow for linking vulkan --- CMakeLists.txt | 8 ++++++++ src/core/gpu_vk.c | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b8e30050b..60b0fb039 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,8 @@ option(LOVR_BUILD_SHARED "Build a shared library (takes precedence over LOVR_BUI option(LOVR_BUILD_BUNDLE "On macOS, build a .app bundle instead of a raw program" OFF) option(LOVR_BUILD_WITH_SYMBOLS "Build with C function symbols exposed" OFF) +option(LOVR_LINK_VULKAN "Links vulkan with lovr bypassing the libvulkan search" OFF) + # Setup if(EMSCRIPTEN) string(CONCAT EMSCRIPTEN_LINKER_FLAGS @@ -205,6 +207,12 @@ endif() # Vulkan if(LOVR_USE_VULKAN) list(APPEND LOVR_INCLUDES deps/vulkan-headers/include) + + if(LOVR_LINK_VULKAN) + pkg_search_module(VULKAN REQUIRED vulkan) + target_link_directories(lovr ${VULKAN_LIBRARY_DIRS}) + target_link_libraries(lovr ${VULKAN_LIBRARIES}) + endif() endif() # OpenXR diff --git a/src/core/gpu_vk.c b/src/core/gpu_vk.c index d4c640ada..b0e269f8e 100644 --- a/src/core/gpu_vk.c +++ b/src/core/gpu_vk.c @@ -2525,7 +2525,7 @@ bool gpu_init(gpu_config* config) { ASSERT(state.library, "Failed to load vulkan library") goto fail; vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) GetProcAddress(state.library, "vkGetInstanceProcAddr"); #else - // Checking if vulkan was linked in (`-DLOVR_LINK_VULKAN`) + // Checking if vulkan was linked in (`-DLOVR_LINK_VULKAN` or `LD_PRELOAD`) state.library = NULL; void *selflib = dlopen(NULL, RTLD_NOW); if (selflib) { From 2f020aba2197261d7653f505854dbd1a18b09159 Mon Sep 17 00:00:00 2001 From: Amrit Bhogal Date: Thu, 13 Mar 2025 11:20:19 +0000 Subject: [PATCH 3/8] Fixed vulkan linkin --- CMakeLists.txt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 60b0fb039..3ff8375fc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -210,8 +210,8 @@ if(LOVR_USE_VULKAN) if(LOVR_LINK_VULKAN) pkg_search_module(VULKAN REQUIRED vulkan) - target_link_directories(lovr ${VULKAN_LIBRARY_DIRS}) - target_link_libraries(lovr ${VULKAN_LIBRARIES}) + set(LOVR_VULKAN_LIBDIR ${VULKAN_LIBRARY_DIRS}) + set(LOVR_VULKAN ${VULKAN_LIBRARIES}) endif() endif() @@ -346,6 +346,11 @@ target_include_directories(lovr PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/etc ) +target_link_directories(lovr PRIVATE + ${LOVR_LUA_LIBDIR} + ${LOVR_VULKAN_LIBDIR} +) + target_link_libraries(lovr ${LOVR_GLFW} ${LOVR_LUA} @@ -355,6 +360,7 @@ target_link_libraries(lovr ${LOVR_OPENXR} ${LOVR_OCULUS_AUDIO} ${LOVR_PTHREADS} + ${LOVR_VULKAN} ${EMSCRIPTEN_LINKER_FLAGS} ) From 51dd75582495938faea96e52000bdb3a011579b0 Mon Sep 17 00:00:00 2001 From: Amrit Bhogal Date: Thu, 13 Mar 2025 11:23:46 +0000 Subject: [PATCH 4/8] check libvulkan.1.dylib first --- src/core/gpu_vk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/gpu_vk.c b/src/core/gpu_vk.c index b0e269f8e..78bba6d4e 100644 --- a/src/core/gpu_vk.c +++ b/src/core/gpu_vk.c @@ -2536,8 +2536,8 @@ bool gpu_init(gpu_config* config) { } #ifdef __APPLE__ - state.library = dlopen("libvulkan.dylib", RTLD_NOW | RTLD_LOCAL); - if (!state.library) state.library = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL); + state.library = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL); + if (!state.library) state.library = dlopen("libvulkan.dylib", RTLD_NOW | RTLD_LOCAL); if (!state.library) state.library = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL); if (!state.library) state.library = dlopen("vulkan.framework/vulkan", RTLD_NOW | RTLD_LOCAL); if (!state.library) state.library = dlopen("MoltenVK.framework/MoltenVK", RTLD_NOW | RTLD_LOCAL); From 93dc8d0b16816d214c481da93efd179867b02b68 Mon Sep 17 00:00:00 2001 From: Frityet Date: Thu, 13 Mar 2025 11:53:52 +0000 Subject: [PATCH 5/8] Accidental inclusion of `${LOVR_LUA_LIBDIR}` --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ff8375fc..c76627fbf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -347,7 +347,6 @@ target_include_directories(lovr PRIVATE ) target_link_directories(lovr PRIVATE - ${LOVR_LUA_LIBDIR} ${LOVR_VULKAN_LIBDIR} ) From 74044c5fa92433e9c982a173dc2a9ea7a255a289 Mon Sep 17 00:00:00 2001 From: Frityet Date: Thu, 13 Mar 2025 18:23:40 +0000 Subject: [PATCH 6/8] Use `FindVulkan` --- CMakeLists.txt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c76627fbf..520be3889 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -209,9 +209,7 @@ if(LOVR_USE_VULKAN) list(APPEND LOVR_INCLUDES deps/vulkan-headers/include) if(LOVR_LINK_VULKAN) - pkg_search_module(VULKAN REQUIRED vulkan) - set(LOVR_VULKAN_LIBDIR ${VULKAN_LIBRARY_DIRS}) - set(LOVR_VULKAN ${VULKAN_LIBRARIES}) + find_package(Vulkan REQUIRED) endif() endif() @@ -359,10 +357,13 @@ target_link_libraries(lovr ${LOVR_OPENXR} ${LOVR_OCULUS_AUDIO} ${LOVR_PTHREADS} - ${LOVR_VULKAN} ${EMSCRIPTEN_LINKER_FLAGS} ) +if(LOVR_USE_VULKAN AND LOVR_LINK_VULKAN) + target_link_libraries(lovr PRIVATE Vulkan::Vulkan) +endif() + if(LOVR_SANITIZE) set(LOVR_SANITIZE_FLAGS "-fsanitize=address,undefined" "-O1" "-fno-omit-frame-pointer") target_compile_options(lovr PRIVATE ${LOVR_SANITIZE_FLAGS}) From 67cd589b17db5221c4aa43b56109275614a46bb9 Mon Sep 17 00:00:00 2001 From: Frityet Date: Thu, 13 Mar 2025 18:24:30 +0000 Subject: [PATCH 7/8] remove vulkan linkdir --- CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 520be3889..9b15c8cc8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -344,10 +344,6 @@ target_include_directories(lovr PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/etc ) -target_link_directories(lovr PRIVATE - ${LOVR_VULKAN_LIBDIR} -) - target_link_libraries(lovr ${LOVR_GLFW} ${LOVR_LUA} From 7c5db4d7c2117cc74ce2a9e8dbcbf918defa9f3e Mon Sep 17 00:00:00 2001 From: Frityet Date: Thu, 13 Mar 2025 18:26:57 +0000 Subject: [PATCH 8/8] Fix dlopen overwrite --- src/core/gpu_vk.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/core/gpu_vk.c b/src/core/gpu_vk.c index 78bba6d4e..81a7bc975 100644 --- a/src/core/gpu_vk.c +++ b/src/core/gpu_vk.c @@ -1,6 +1,7 @@ #include "gpu.h" #include #include +#include #include #ifdef _WIN32 @@ -2528,15 +2529,13 @@ bool gpu_init(gpu_config* config) { // Checking if vulkan was linked in (`-DLOVR_LINK_VULKAN` or `LD_PRELOAD`) state.library = NULL; void *selflib = dlopen(NULL, RTLD_NOW); - if (selflib) { - if (dlsym(selflib, "vkGetInstanceProcAddr")) - state.library = selflib; - else - dlclose(selflib); - } + if (dlsym(selflib, "vkGetInstanceProcAddr")) + state.library = selflib; + else + dlclose(selflib); #ifdef __APPLE__ - state.library = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL); + if (!state.library) state.library = dlopen("libvulkan.1.dylib", RTLD_NOW | RTLD_LOCAL); if (!state.library) state.library = dlopen("libvulkan.dylib", RTLD_NOW | RTLD_LOCAL); if (!state.library) state.library = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL); if (!state.library) state.library = dlopen("vulkan.framework/vulkan", RTLD_NOW | RTLD_LOCAL); @@ -2546,7 +2545,7 @@ bool gpu_init(gpu_config* config) { ASSERT(state.library, "Failed to load vulkan library") goto fail; vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) dlsym(state.library, "vkGetInstanceProcAddr"); #else - state.library = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL); + if (!state.library) state.library = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL); if (!state.library) state.library = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); ASSERT(state.library, "Failed to load vulkan library") goto fail; vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) dlsym(state.library, "vkGetInstanceProcAddr");