stage MoltenVK runtime files

This commit is contained in:
mchughalex 2026-06-06 15:13:45 +01:00
parent 5b6b87bcea
commit 243c8e59ef
3 changed files with 35 additions and 38 deletions

View file

@ -115,10 +115,8 @@ function(rexglue_configure_target target_name)
endforeach() endforeach()
elseif(APPLE) elseif(APPLE)
set(_rexglue_macos_vulkan_lib_dirs) set(_rexglue_macos_vulkan_lib_dirs)
set(_rexglue_macos_vulkan_roots)
if(DEFINED ENV{VULKAN_SDK}) if(DEFINED ENV{VULKAN_SDK})
list(APPEND _rexglue_macos_vulkan_lib_dirs "$ENV{VULKAN_SDK}/lib") list(APPEND _rexglue_macos_vulkan_lib_dirs "$ENV{VULKAN_SDK}/lib")
list(APPEND _rexglue_macos_vulkan_roots "$ENV{VULKAN_SDK}")
endif() endif()
list(APPEND _rexglue_macos_vulkan_lib_dirs /opt/homebrew/lib /usr/local/lib) 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()
endforeach() endforeach()
foreach(_vk_lib_dir ${_rexglue_macos_vulkan_lib_dirs}) add_custom_command(TARGET ${target_name} POST_BUILD
if(EXISTS "${_vk_lib_dir}/libMoltenVK.dylib") COMMAND ${CMAKE_COMMAND}
add_custom_command(TARGET ${target_name} POST_BUILD -DOUTPUT=$<TARGET_FILE_DIR:${target_name}>/MoltenVK_icd.json
COMMAND ${CMAKE_COMMAND} -E make_directory -P "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/write_moltenvk_icd.cmake"
$<TARGET_FILE_DIR:${target_name}>/lib VERBATIM
COMMAND ${CMAKE_COMMAND} -E copy_if_different )
"${_vk_lib_dir}/libMoltenVK.dylib"
$<TARGET_FILE_DIR:${target_name}>/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
$<TARGET_FILE_DIR:${target_name}>/share/vulkan/icd.d
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${_vk_root}/share/vulkan/icd.d/MoltenVK_icd.json"
$<TARGET_FILE_DIR:${target_name}>/share/vulkan/icd.d
VERBATIM
)
break()
endif()
endforeach()
endif() endif()
endfunction() endfunction()

View file

@ -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
}
}
]=])

View file

@ -34,16 +34,22 @@ std::unique_ptr<VulkanInstance> VulkanInstance::Create(const bool with_surface,
std::unique_ptr<VulkanInstance> vulkan_instance(new VulkanInstance()); std::unique_ptr<VulkanInstance> vulkan_instance(new VulkanInstance());
#if REX_PLATFORM_MAC #if REX_PLATFORM_MAC
// The Vulkan loader does not discover MoltenVK from an executable-local SDK // The Vulkan loader does not discover executable-local MoltenVK manifests by
// layout by default. Prefer user-provided loader settings, but make local // default. Prefer user-provided loader settings, but make release folders run
// command-line builds run without requiring VK_ICD_FILENAMES in the shell. // without requiring VK_ICD_FILENAMES in the shell.
if (!std::getenv("VK_ICD_FILENAMES") && !std::getenv("VK_DRIVER_FILES")) { if (!std::getenv("VK_ICD_FILENAMES") && !std::getenv("VK_DRIVER_FILES")) {
auto local_icd_path = const auto executable_folder = rex::filesystem::GetExecutableFolder();
rex::filesystem::GetExecutableFolder() / "share" / "vulkan" / "icd.d" / "MoltenVK_icd.json"; const std::filesystem::path local_icd_paths[] = {
if (std::filesystem::is_regular_file(local_icd_path)) { executable_folder / "MoltenVK_icd.json",
std::string local_icd_path_string = local_icd_path.string(); executable_folder / "share" / "vulkan" / "icd.d" / "MoltenVK_icd.json",
setenv("VK_ICD_FILENAMES", local_icd_path_string.c_str(), 0); };
setenv("VK_DRIVER_FILES", local_icd_path_string.c_str(), 0); 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 #endif