Skip to content

Commit afc7241

Browse files
committed
Build MoltenVK as submodule and bundle with macOS app.
1 parent 42aea53 commit afc7241

File tree

7 files changed

+126
-0
lines changed

7 files changed

+126
-0
lines changed

.gitmodules

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,9 @@
6161
[submodule "thirdparty/dxc-bin"]
6262
path = thirdparty/dxc-bin
6363
url = https://github.com/rt64/dxc-bin
64+
[submodule "thirdparty/MoltenVK/MoltenVK"]
65+
path = thirdparty/MoltenVK/MoltenVK
66+
url = https://github.com/KhronosGroup/MoltenVK.git
67+
[submodule "thirdparty/MoltenVK/SPIRV-Cross"]
68+
path = thirdparty/MoltenVK/SPIRV-Cross
69+
url = https://github.com/KhronosGroup/SPIRV-Cross.git

UnleashedRecomp/CMakeLists.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,26 @@ elseif (APPLE)
325325
MACOSX_BUNDLE_SHORT_VERSION_STRING ${MACOS_BUNDLE_VERSION}
326326
MACOSX_BUNDLE_ICON_FILE "game_icon.icns"
327327
)
328+
329+
# Linking with MoltenVK directly would prevent using the system Vulkan loader to load with debug layers.
330+
# Instead, copy the MoltenVK dylib to the app bundle along with an ICD file for the loader to find it.
331+
# In the event the loader is not installed, the MoltenVK dylib can still be picked up directly in the app bundle.
332+
set(MVK_ICD ${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/MoltenVK/MoltenVK_icd.json)
333+
target_sources(UnleashedRecomp PRIVATE ${MVK_ICD})
334+
set_source_files_properties(${MVK_ICD} PROPERTIES MACOSX_PACKAGE_LOCATION Resources/vulkan/icd.d)
335+
336+
# Unfortunately using the MoltenVK target output as a resource file does not quite create the correct
337+
# dependency chain, so we need to resolve the paths manually and create a copy target dependency chain.
338+
set(MVK_DYLIB_SRC ${CMAKE_BINARY_DIR}/thirdparty/MoltenVK/libMoltenVK.dylib)
339+
set(MVK_DYLIB_DST ${CMAKE_CURRENT_BINARY_DIR}/UnleashedRecomp.app/Contents/Frameworks/libMoltenVK.dylib)
340+
add_custom_command(
341+
OUTPUT ${MVK_DYLIB_DST}
342+
DEPENDS ${MVK_DYLIB_SRC}
343+
COMMAND cmake -E copy ${MVK_DYLIB_SRC} ${MVK_DYLIB_DST})
344+
add_custom_target(CopyMoltenVK DEPENDS ${MVK_DYLIB_DST})
345+
add_dependencies(CopyMoltenVK MoltenVK)
346+
add_dependencies(UnleashedRecomp CopyMoltenVK)
347+
set_property(TARGET UnleashedRecomp APPEND PROPERTY BUILD_RPATH "@executable_path/../Frameworks")
328348
else()
329349
add_executable(UnleashedRecomp ${UNLEASHED_RECOMP_CXX_SOURCES})
330350
endif()

thirdparty/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,7 @@ add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/nativefiledialog-extended"
2020
add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/o1heap")
2121
add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/SDL")
2222
add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/SDL_mixer")
23+
24+
if (APPLE)
25+
add_subdirectory("${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/MoltenVK")
26+
endif()

thirdparty/MoltenVK/CMakeLists.txt

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Simple CMake script to compile MoltenVK with SPIRV-Cross as a shared library target
2+
3+
# Prepare MoltenVK Git revision
4+
find_package(Git)
5+
if(GIT_FOUND)
6+
execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
7+
OUTPUT_VARIABLE MVK_GIT_REV
8+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK
9+
ERROR_QUIET
10+
OUTPUT_STRIP_TRAILING_WHITESPACE)
11+
endif()
12+
set(MVK_GENERATED_INCLUDES ${CMAKE_CURRENT_BINARY_DIR}/Generated)
13+
file(WRITE ${MVK_GENERATED_INCLUDES}/mvkGitRevDerived.h "static const char* mvkRevString = \"${MVK_GIT_REV}\";")
14+
message(STATUS "MoltenVK revision: ${MVK_GIT_REV}")
15+
16+
# Prepare MoltenVK version
17+
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK/MoltenVK/API/mvk_private_api.h MVK_PRIVATE_API)
18+
string(REGEX MATCH "#define MVK_VERSION_MAJOR [0-9]+" MVK_VERSION_MAJOR_LINE "${MVK_PRIVATE_API}")
19+
string(REGEX MATCH "[0-9]+" MVK_VERSION_MAJOR "${MVK_VERSION_MAJOR_LINE}")
20+
string(REGEX MATCH "#define MVK_VERSION_MINOR [0-9]+" MVK_VERSION_MINOR_LINE "${MVK_PRIVATE_API}")
21+
string(REGEX MATCH "[0-9]+" MVK_VERSION_MINOR "${MVK_VERSION_MINOR_LINE}")
22+
string(REGEX MATCH "#define MVK_VERSION_PATCH [0-9]+" MVK_VERSION_PATCH_LINE "${MVK_PRIVATE_API}")
23+
string(REGEX MATCH "[0-9]+" MVK_VERSION_PATCH "${MVK_VERSION_PATCH_LINE}")
24+
set(MVK_VERSION "${MVK_VERSION_MAJOR}.${MVK_VERSION_MINOR}.${MVK_VERSION_PATCH}")
25+
message(STATUS "MoltenVK version: ${MVK_VERSION}")
26+
27+
# Find required system libraries
28+
find_library(APPKIT_LIBRARY AppKit REQUIRED)
29+
find_library(FOUNDATION_LIBRARY Foundation REQUIRED)
30+
find_library(IOKIT_LIBRARY IOKit REQUIRED)
31+
find_library(IOSURFACE_LIBRARY IOSurface REQUIRED)
32+
find_library(METAL_LIBRARY Metal REQUIRED)
33+
find_library(QUARTZCORE_LIBRARY QuartzCore REQUIRED)
34+
35+
# SPIRV-Cross
36+
option(SPIRV_CROSS_CLI "" OFF)
37+
option(SPIRV_CROSS_ENABLE_TESTS "" OFF)
38+
option(SPIRV_CROSS_ENABLE_HLSL "" OFF)
39+
option(SPIRV_CROSS_ENABLE_CPP "" OFF)
40+
option(SPIRV_CROSS_SKIP_INSTALL "" ON)
41+
add_subdirectory(SPIRV-Cross)
42+
43+
# Common
44+
set(MVK_COMMON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/Common)
45+
file(GLOB_RECURSE MVK_COMMON_SOURCES CONFIGURE_DEPENDS
46+
${MVK_COMMON_DIR}/*.cpp
47+
${MVK_COMMON_DIR}/*.m
48+
${MVK_COMMON_DIR}/*.mm)
49+
set(MVK_COMMON_INCLUDES ${MVK_COMMON_DIR})
50+
51+
add_library(MoltenVKCommon STATIC ${MVK_COMMON_SOURCES})
52+
target_include_directories(MoltenVKCommon PUBLIC ${MVK_COMMON_INCLUDES})
53+
target_compile_options(MoltenVKCommon PRIVATE -w)
54+
55+
# MoltenVKShaderConverter
56+
set(MVK_SHADER_CONVERTER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVKShaderConverter)
57+
file(GLOB_RECURSE MVK_SHADER_CONVERTER_SOURCES CONFIGURE_DEPENDS
58+
${MVK_SHADER_CONVERTER_DIR}/MoltenVKShaderConverter/*.cpp
59+
${MVK_SHADER_CONVERTER_DIR}/MoltenVKShaderConverter/*.m
60+
${MVK_SHADER_CONVERTER_DIR}/MoltenVKShaderConverter/*.mm)
61+
set(MVK_SHADER_CONVERTER_INCLUDES ${MVK_SHADER_CONVERTER_DIR} ${MVK_SHADER_CONVERTER_DIR}/include)
62+
63+
add_library(MoltenVKShaderConverter STATIC ${MVK_SHADER_CONVERTER_SOURCES})
64+
target_include_directories(MoltenVKShaderConverter PUBLIC ${MVK_SHADER_CONVERTER_INCLUDES})
65+
target_compile_options(MoltenVKShaderConverter PRIVATE -w)
66+
target_link_libraries(MoltenVKShaderConverter PRIVATE spirv-cross-msl spirv-cross-reflect MoltenVKCommon)
67+
target_compile_definitions(MoltenVKShaderConverter PRIVATE MVK_EXCLUDE_SPIRV_TOOLS=1)
68+
69+
# MoltenVK
70+
set(MVK_DIR ${CMAKE_CURRENT_SOURCE_DIR}/MoltenVK/MoltenVK)
71+
file(GLOB_RECURSE MVK_SOURCES CONFIGURE_DEPENDS
72+
${MVK_DIR}/MoltenVK/*.cpp
73+
${MVK_DIR}/MoltenVK/*.m
74+
${MVK_DIR}/MoltenVK/*.mm)
75+
file(GLOB MVK_SRC_INCLUDES LIST_DIRECTORIES ON ${MVK_DIR}/MoltenVK/*)
76+
set(MVK_INCLUDES
77+
${MVK_SRC_INCLUDES} ${MVK_GENERATED_INCLUDES} ${MVK_DIR}/include
78+
${UNLEASHED_RECOMP_THIRDPARTY_ROOT}/Vulkan-Headers/include)
79+
80+
add_library(MoltenVK SHARED ${MVK_SOURCES})
81+
target_include_directories(MoltenVK PRIVATE ${MVK_INCLUDES})
82+
target_compile_options(MoltenVK PRIVATE -w)
83+
target_link_libraries(MoltenVK PRIVATE
84+
${APPKIT_LIBRARY} ${FOUNDATION_LIBRARY} ${IOKIT_LIBRARY} ${IOSURFACE_LIBRARY} ${METAL_LIBRARY} ${QUARTZCORE_LIBRARY}
85+
spirv-cross-msl MoltenVKCommon MoltenVKShaderConverter)
86+
target_compile_definitions(MoltenVK PRIVATE MVK_FRAMEWORK_VERSION=${MVK_VERSION} MVK_USE_CEREAL=0)

thirdparty/MoltenVK/MoltenVK

Submodule MoltenVK added at 2048427
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"file_format_version": "1.0.0",
3+
"ICD": {
4+
"library_path": "../../../Frameworks/libMoltenVK.dylib",
5+
"api_version": "1.2.0",
6+
"is_portability_driver": true
7+
}
8+
}

thirdparty/MoltenVK/SPIRV-Cross

Submodule SPIRV-Cross added at 2c32b6b

0 commit comments

Comments
 (0)