diff options
| author | 2023-08-22 13:10:26 -0400 | |
|---|---|---|
| committer | 2023-08-22 13:10:26 -0400 | |
| commit | bc4ad5e62d6d9a8e81a56ce70b33dd3e8ae7bd5d (patch) | |
| tree | 7b3354dd90ada7fabb5efa93a5f2a8c8892c6da8 | |
| parent | Merge pull request #11303 from lat9nq/screenshots-configurable (diff) | |
| parent | Add macos moltenvk bundle, Add copy moltevk dylib script (diff) | |
| download | yuzu-bc4ad5e62d6d9a8e81a56ce70b33dd3e8ae7bd5d.tar.gz yuzu-bc4ad5e62d6d9a8e81a56ce70b33dd3e8ae7bd5d.tar.xz yuzu-bc4ad5e62d6d9a8e81a56ce70b33dd3e8ae7bd5d.zip | |
Merge pull request #11302 from vonchenplus/vulkan_macos
Add macos moltenvk bundle, Add copy moltevk dylib script
| -rw-r--r-- | CMakeLists.txt | 4 | ||||
| -rw-r--r-- | CMakeModules/DownloadExternals.cmake | 18 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_instance.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_library.cpp | 16 | ||||
| -rw-r--r-- | src/yuzu/CMakeLists.txt | 12 |
5 files changed, 48 insertions, 10 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index af9f394f1..7858d0450 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt | |||
| @@ -49,7 +49,7 @@ option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}") | |||
| 49 | 49 | ||
| 50 | option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON) | 50 | option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON) |
| 51 | 51 | ||
| 52 | cmake_dependent_option(YUZU_ROOM "Compile LDN room server" ON "NOT ANDROID" OFF) | 52 | CMAKE_DEPENDENT_OPTION(YUZU_ROOM "Compile LDN room server" ON "NOT ANDROID" OFF) |
| 53 | 53 | ||
| 54 | CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile Windows crash dump (Minidump) support" OFF "WIN32" OFF) | 54 | CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile Windows crash dump (Minidump) support" OFF "WIN32" OFF) |
| 55 | 55 | ||
| @@ -63,6 +63,8 @@ option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" OFF) | |||
| 63 | 63 | ||
| 64 | CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF) | 64 | CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF) |
| 65 | 65 | ||
| 66 | CMAKE_DEPENDENT_OPTION(USE_SYSTEM_MOLTENVK "Use the system MoltenVK lib (instead of the bundled one)" OFF "APPLE" OFF) | ||
| 67 | |||
| 66 | set(DEFAULT_ENABLE_OPENSSL ON) | 68 | set(DEFAULT_ENABLE_OPENSSL ON) |
| 67 | if (ANDROID OR WIN32 OR APPLE) | 69 | if (ANDROID OR WIN32 OR APPLE) |
| 68 | # - Windows defaults to the Schannel backend. | 70 | # - Windows defaults to the Schannel backend. |
diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index 972f5ca74..a52148bd8 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake | |||
| @@ -36,3 +36,21 @@ endif() | |||
| 36 | message(STATUS "Using bundled binaries at ${prefix}") | 36 | message(STATUS "Using bundled binaries at ${prefix}") |
| 37 | set(${prefix_var} "${prefix}" PARENT_SCOPE) | 37 | set(${prefix_var} "${prefix}" PARENT_SCOPE) |
| 38 | endfunction() | 38 | endfunction() |
| 39 | |||
| 40 | function(download_moltenvk_external platform version) | ||
| 41 | set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK") | ||
| 42 | set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar") | ||
| 43 | if (NOT EXISTS ${MOLTENVK_DIR}) | ||
| 44 | if (NOT EXISTS ${MOLTENVK_TAR}) | ||
| 45 | file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/${version}/MoltenVK-${platform}.tar | ||
| 46 | ${MOLTENVK_TAR} SHOW_PROGRESS) | ||
| 47 | endif() | ||
| 48 | |||
| 49 | execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}" | ||
| 50 | WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals") | ||
| 51 | endif() | ||
| 52 | |||
| 53 | # Add the MoltenVK library path to the prefix so find_library can locate it. | ||
| 54 | list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}") | ||
| 55 | set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE) | ||
| 56 | endfunction() | ||
diff --git a/src/video_core/vulkan_common/vulkan_instance.cpp b/src/video_core/vulkan_common/vulkan_instance.cpp index 72aedb8d8..bc16145be 100644 --- a/src/video_core/vulkan_common/vulkan_instance.cpp +++ b/src/video_core/vulkan_common/vulkan_instance.cpp | |||
| @@ -41,9 +41,6 @@ namespace { | |||
| 41 | bool enable_validation) { | 41 | bool enable_validation) { |
| 42 | std::vector<const char*> extensions; | 42 | std::vector<const char*> extensions; |
| 43 | extensions.reserve(6); | 43 | extensions.reserve(6); |
| 44 | #ifdef __APPLE__ | ||
| 45 | extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); | ||
| 46 | #endif | ||
| 47 | switch (window_type) { | 44 | switch (window_type) { |
| 48 | case Core::Frontend::WindowSystemType::Headless: | 45 | case Core::Frontend::WindowSystemType::Headless: |
| 49 | break; | 46 | break; |
| @@ -74,6 +71,11 @@ namespace { | |||
| 74 | if (window_type != Core::Frontend::WindowSystemType::Headless) { | 71 | if (window_type != Core::Frontend::WindowSystemType::Headless) { |
| 75 | extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); | 72 | extensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME); |
| 76 | } | 73 | } |
| 74 | #ifdef __APPLE__ | ||
| 75 | if (AreExtensionsSupported(dld, std::array{VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME})) { | ||
| 76 | extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); | ||
| 77 | } | ||
| 78 | #endif | ||
| 77 | if (enable_validation) { | 79 | if (enable_validation) { |
| 78 | const bool debug_utils = | 80 | const bool debug_utils = |
| 79 | AreExtensionsSupported(dld, std::array{VK_EXT_DEBUG_UTILS_EXTENSION_NAME}); | 81 | AreExtensionsSupported(dld, std::array{VK_EXT_DEBUG_UTILS_EXTENSION_NAME}); |
diff --git a/src/video_core/vulkan_common/vulkan_library.cpp b/src/video_core/vulkan_common/vulkan_library.cpp index 47f6f2a03..0130f6a0d 100644 --- a/src/video_core/vulkan_common/vulkan_library.cpp +++ b/src/video_core/vulkan_common/vulkan_library.cpp | |||
| @@ -19,13 +19,17 @@ std::shared_ptr<Common::DynamicLibrary> OpenLibrary( | |||
| 19 | #else | 19 | #else |
| 20 | auto library = std::make_shared<Common::DynamicLibrary>(); | 20 | auto library = std::make_shared<Common::DynamicLibrary>(); |
| 21 | #ifdef __APPLE__ | 21 | #ifdef __APPLE__ |
| 22 | const auto libvulkan_filename = | ||
| 23 | Common::FS::GetBundleDirectory() / "Contents/Frameworks/libvulkan.1.dylib"; | ||
| 24 | const auto libmoltenvk_filename = | ||
| 25 | Common::FS::GetBundleDirectory() / "Contents/Frameworks/libMoltenVK.dylib"; | ||
| 26 | const char* library_paths[] = {std::getenv("LIBVULKAN_PATH"), libvulkan_filename.c_str(), | ||
| 27 | libmoltenvk_filename.c_str()}; | ||
| 22 | // Check if a path to a specific Vulkan library has been specified. | 28 | // Check if a path to a specific Vulkan library has been specified. |
| 23 | char* const libvulkan_env = std::getenv("LIBVULKAN_PATH"); | 29 | for (const auto& library_path : library_paths) { |
| 24 | if (!libvulkan_env || !library->Open(libvulkan_env)) { | 30 | if (library_path && library->Open(library_path)) { |
| 25 | // Use the libvulkan.dylib from the application bundle. | 31 | break; |
| 26 | const auto filename = | 32 | } |
| 27 | Common::FS::GetBundleDirectory() / "Contents/Frameworks/libvulkan.dylib"; | ||
| 28 | void(library->Open(Common::FS::PathToUTF8String(filename).c_str())); | ||
| 29 | } | 33 | } |
| 30 | #else | 34 | #else |
| 31 | std::string filename = Common::DynamicLibrary::GetVersionedFilename("vulkan", 1); | 35 | std::string filename = Common::DynamicLibrary::GetVersionedFilename("vulkan", 1); |
diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 2e4da696c..8f86a1553 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt | |||
| @@ -313,6 +313,18 @@ if (APPLE) | |||
| 313 | target_sources(yuzu PRIVATE ${MACOSX_ICON}) | 313 | target_sources(yuzu PRIVATE ${MACOSX_ICON}) |
| 314 | set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE TRUE) | 314 | set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE TRUE) |
| 315 | set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) | 315 | set_target_properties(yuzu PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) |
| 316 | |||
| 317 | if (NOT USE_SYSTEM_MOLTENVK) | ||
| 318 | set(MOLTENVK_PLATFORM "macOS") | ||
| 319 | set(MOLTENVK_VERSION "v1.2.5") | ||
| 320 | download_moltenvk_external(${MOLTENVK_PLATFORM} ${MOLTENVK_VERSION}) | ||
| 321 | endif() | ||
| 322 | find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED) | ||
| 323 | message(STATUS "Using MoltenVK at ${MOLTENVK_LIBRARY}.") | ||
| 324 | set_source_files_properties(${MOLTENVK_LIBRARY} PROPERTIES MACOSX_PACKAGE_LOCATION Frameworks | ||
| 325 | XCODE_FILE_ATTRIBUTES "CodeSignOnCopy") | ||
| 326 | target_sources(yuzu PRIVATE ${MOLTENVK_LIBRARY}) | ||
| 327 | |||
| 316 | elseif(WIN32) | 328 | elseif(WIN32) |
| 317 | # compile as a win32 gui application instead of a console application | 329 | # compile as a win32 gui application instead of a console application |
| 318 | if (QT_VERSION VERSION_GREATER_EQUAL 6) | 330 | if (QT_VERSION VERSION_GREATER_EQUAL 6) |