From 243c8e59efb446530d47feb11760c63984b09f2c Mon Sep 17 00:00:00 2001 From: mchughalex <25671999+mchughalex@users.noreply.github.com> Date: Sat, 6 Jun 2026 15:13:45 +0100 Subject: [PATCH] stage MoltenVK runtime files --- cmake/rexglue_helpers.cmake | 35 ++++++------------------------- cmake/write_moltenvk_icd.cmake | 14 +++++++++++++ src/ui/vulkan/vulkan_instance.cpp | 24 +++++++++++++-------- 3 files changed, 35 insertions(+), 38 deletions(-) create mode 100644 cmake/write_moltenvk_icd.cmake diff --git a/cmake/rexglue_helpers.cmake b/cmake/rexglue_helpers.cmake index 0edffab..0255ac7 100644 --- a/cmake/rexglue_helpers.cmake +++ b/cmake/rexglue_helpers.cmake @@ -115,10 +115,8 @@ function(rexglue_configure_target target_name) endforeach() elseif(APPLE) set(_rexglue_macos_vulkan_lib_dirs) - set(_rexglue_macos_vulkan_roots) if(DEFINED ENV{VULKAN_SDK}) list(APPEND _rexglue_macos_vulkan_lib_dirs "$ENV{VULKAN_SDK}/lib") - list(APPEND _rexglue_macos_vulkan_roots "$ENV{VULKAN_SDK}") endif() list(APPEND _rexglue_macos_vulkan_lib_dirs /opt/homebrew/lib /usr/local/lib) @@ -136,33 +134,12 @@ function(rexglue_configure_target target_name) endforeach() endforeach() - foreach(_vk_lib_dir ${_rexglue_macos_vulkan_lib_dirs}) - if(EXISTS "${_vk_lib_dir}/libMoltenVK.dylib") - add_custom_command(TARGET ${target_name} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory - $/lib - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${_vk_lib_dir}/libMoltenVK.dylib" - $/lib - VERBATIM - ) - break() - endif() - endforeach() - - foreach(_vk_root ${_rexglue_macos_vulkan_roots}) - if(EXISTS "${_vk_root}/share/vulkan/icd.d/MoltenVK_icd.json") - add_custom_command(TARGET ${target_name} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory - $/share/vulkan/icd.d - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${_vk_root}/share/vulkan/icd.d/MoltenVK_icd.json" - $/share/vulkan/icd.d - VERBATIM - ) - break() - endif() - endforeach() + add_custom_command(TARGET ${target_name} POST_BUILD + COMMAND ${CMAKE_COMMAND} + -DOUTPUT=$/MoltenVK_icd.json + -P "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/write_moltenvk_icd.cmake" + VERBATIM + ) endif() endfunction() diff --git a/cmake/write_moltenvk_icd.cmake b/cmake/write_moltenvk_icd.cmake new file mode 100644 index 0000000..e8a226f --- /dev/null +++ b/cmake/write_moltenvk_icd.cmake @@ -0,0 +1,14 @@ +if(NOT DEFINED OUTPUT OR OUTPUT STREQUAL "") + message(FATAL_ERROR "OUTPUT must be set") +endif() + +file(WRITE "${OUTPUT}" [=[ +{ + "file_format_version": "1.0.0", + "ICD": { + "library_path": "./libMoltenVK.dylib", + "api_version": "1.4.0", + "is_portability_driver": true + } +} +]=]) diff --git a/src/ui/vulkan/vulkan_instance.cpp b/src/ui/vulkan/vulkan_instance.cpp index c79e8ca..f85f331 100644 --- a/src/ui/vulkan/vulkan_instance.cpp +++ b/src/ui/vulkan/vulkan_instance.cpp @@ -34,16 +34,22 @@ std::unique_ptr VulkanInstance::Create(const bool with_surface, std::unique_ptr vulkan_instance(new VulkanInstance()); #if REX_PLATFORM_MAC - // The Vulkan loader does not discover MoltenVK from an executable-local SDK - // layout by default. Prefer user-provided loader settings, but make local - // command-line builds run without requiring VK_ICD_FILENAMES in the shell. + // The Vulkan loader does not discover executable-local MoltenVK manifests by + // default. Prefer user-provided loader settings, but make release folders run + // without requiring VK_ICD_FILENAMES in the shell. if (!std::getenv("VK_ICD_FILENAMES") && !std::getenv("VK_DRIVER_FILES")) { - auto local_icd_path = - rex::filesystem::GetExecutableFolder() / "share" / "vulkan" / "icd.d" / "MoltenVK_icd.json"; - if (std::filesystem::is_regular_file(local_icd_path)) { - std::string local_icd_path_string = local_icd_path.string(); - setenv("VK_ICD_FILENAMES", local_icd_path_string.c_str(), 0); - setenv("VK_DRIVER_FILES", local_icd_path_string.c_str(), 0); + const auto executable_folder = rex::filesystem::GetExecutableFolder(); + const std::filesystem::path local_icd_paths[] = { + executable_folder / "MoltenVK_icd.json", + executable_folder / "share" / "vulkan" / "icd.d" / "MoltenVK_icd.json", + }; + for (const auto& local_icd_path : local_icd_paths) { + if (std::filesystem::is_regular_file(local_icd_path)) { + std::string local_icd_path_string = local_icd_path.string(); + setenv("VK_ICD_FILENAMES", local_icd_path_string.c_str(), 0); + setenv("VK_DRIVER_FILES", local_icd_path_string.c_str(), 0); + break; + } } } #endif