From 1551387739959d4a0ba23767a21664ea9a860848 Mon Sep 17 00:00:00 2001 From: crueter Date: Mon, 11 Aug 2025 22:27:29 +0200 Subject: [PATCH] [cmake, frontend] feat: CPMUtil + dependency viewer (#238) - creates a CPMUtil.cmake module that makes my job 10x easier and removes boilerplate - also lets us generate dependency names/versions at compiletime, thus letting the frontend display each dependency's versions. Signed-off-by: crueter Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/238 --- CMakeLists.txt | 39 +++- CMakeModules/CPMUtil.cmake | 117 ++++++++++ CMakeModules/DownloadExternals.cmake | 14 +- CMakeModules/GenerateDepHashes.cmake | 21 ++ externals/CMakeLists.txt | 209 ++++++++---------- externals/ffmpeg/CMakeLists.txt | 15 +- src/CMakeLists.txt | 2 + src/common/CMakeLists.txt | 3 +- src/dep_hashes.h.in | 20 ++ src/dynarmic/externals/CMakeLists.txt | 42 ++-- src/network/announce_multiplayer_session.cpp | 12 +- .../backend/spirv/emit_spirv_warp.cpp | 2 +- src/video_core/CMakeLists.txt | 4 + .../vulkan_common/vulkan_device.cpp | 4 - src/yuzu/CMakeLists.txt | 4 + src/yuzu/aboutdialog.ui | 2 +- src/yuzu/deps_dialog.cpp | 121 ++++++++++ src/yuzu/deps_dialog.h | 41 ++++ src/yuzu/deps_dialog.ui | 166 ++++++++++++++ src/yuzu/externals/CMakeLists.txt | 12 +- src/yuzu/main.cpp | 9 +- src/yuzu/main.h | 1 + src/yuzu/main.ui | 6 + tools/cpm-hash.sh | 7 +- 24 files changed, 690 insertions(+), 183 deletions(-) create mode 100644 CMakeModules/CPMUtil.cmake create mode 100644 CMakeModules/GenerateDepHashes.cmake create mode 100644 src/dep_hashes.h.in create mode 100644 src/yuzu/deps_dialog.cpp create mode 100644 src/yuzu/deps_dialog.h create mode 100644 src/yuzu/deps_dialog.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index a364821734..f654ac7d46 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -216,14 +216,14 @@ if (YUZU_USE_BUNDLED_VCPKG) list(APPEND VCPKG_MANIFEST_FEATURES "android") endif() - include(CPM) - set(CPM_USE_LOCAL_PACKAGES OFF) + include(CPMUtil) - CPMAddPackage( + AddPackage( + NAME vcpkg DOWNLOAD_ONLY YES - GIT_REPOSITORY "https://github.com/microsoft/vcpkg.git" + URL "https://github.com/microsoft/vcpkg.git" GIT_TAG "ea2a964f93" - CUSTOM_CACHE_KEY "ea2a" + SHA "ea2a964f93" ) include(${vcpkg_SOURCE_DIR}/scripts/buildsystems/vcpkg.cmake) @@ -277,6 +277,30 @@ function(check_submodules_present) message(FATAL_ERROR "Git submodule ${module} not found. " "Please run: \ngit submodule update --init --recursive") endif() + + set(SUBMODULE_DIR "${PROJECT_SOURCE_DIR}/${module}") + + execute_process( + COMMAND git rev-parse --short=10 HEAD + WORKING_DIRECTORY ${SUBMODULE_DIR} + OUTPUT_VARIABLE SUBMODULE_SHA + ) + + # would probably be better to do string parsing, but whatever + execute_process( + COMMAND git remote get-url origin + WORKING_DIRECTORY ${SUBMODULE_DIR} + OUTPUT_VARIABLE SUBMODULE_URL + ) + + string(REGEX REPLACE "\n|\r" "" SUBMODULE_SHA ${SUBMODULE_SHA}) + string(REGEX REPLACE "\n|\r|\\.git" "" SUBMODULE_URL ${SUBMODULE_URL}) + + get_filename_component(SUBMODULE_NAME ${SUBMODULE_DIR} NAME) + + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${SUBMODULE_NAME}) + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${SUBMODULE_SHA}) + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${SUBMODULE_URL}) endforeach() endfunction() @@ -453,7 +477,7 @@ if (ENABLE_SDL2) endif() if (DEFINED SDL2_VER) - download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" SDL2_PREFIX) + download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" SDL2_PREFIX 2.32.8) endif() set(SDL2_FOUND YES) @@ -584,7 +608,7 @@ endif() if (WIN32 AND YUZU_CRASH_DUMPS) set(BREAKPAD_VER "breakpad-c89f9dd") - download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX) + download_bundled_external("breakpad/" ${BREAKPAD_VER} "breakpad-win" BREAKPAD_PREFIX "c89f9dd") set(BREAKPAD_CLIENT_INCLUDE_DIR "${BREAKPAD_PREFIX}/include") set(BREAKPAD_CLIENT_LIBRARY "${BREAKPAD_PREFIX}/lib/libbreakpad_client.lib") @@ -722,7 +746,6 @@ else() set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu-cmd) endif() - # Installation instructions # ========================= diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake new file mode 100644 index 0000000000..bd1a15b0cc --- /dev/null +++ b/CMakeModules/CPMUtil.cmake @@ -0,0 +1,117 @@ +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +# Created-By: crueter +# Docs will come at a later date, mostly this is to just reduce boilerplate +# and some cmake magic to allow for runtime viewing of dependency versions + +cmake_minimum_required(VERSION 3.22) +include(CPM) + +function(AddPackage) + cpm_set_policies() + + set(oneValueArgs + NAME + VERSION + REPO + SHA + HASH + KEY + URL # Only for custom non-GitHub urls + DOWNLOAD_ONLY + FIND_PACKAGE_ARGUMENTS + SYSTEM_PACKAGE + BUNDLED_PACKAGE + ) + + set(multiValueArgs OPTIONS PATCHES) + + cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}") + + if (NOT DEFINED PKG_ARGS_NAME) + message(FATAL_ERROR "CPMUtil: No package name defined") + endif() + + if (NOT DEFINED PKG_ARGS_URL) + if (DEFINED PKG_ARGS_REPO AND DEFINED PKG_ARGS_SHA) + set(PKG_GIT_URL https://github.com/${PKG_ARGS_REPO}) + set(PKG_URL "${PKG_GIT_URL}/archive/${PKG_ARGS_SHA}.zip") + else() + message(FATAL_ERROR "CPMUtil: No custom URL and no repository + sha defined") + endif() + else() + set(PKG_URL ${PKG_ARGS_URL}) + set(PKG_GIT_URL ${PKG_URL}) + endif() + + message(STATUS "CPMUtil: Downloading package ${PKG_ARGS_NAME} from ${PKG_URL}") + + if (NOT DEFINED PKG_ARGS_KEY) + if (DEFINED PKG_ARGS_SHA) + string(SUBSTRING ${PKG_ARGS_SHA} 0 4 PKG_KEY) + message(STATUS "CPMUtil: No custom key defined, using ${PKG_KEY} from sha") + else() + message(FATAL_ERROR "CPMUtil: No custom key and no commit sha defined") + endif() + else() + set(PKG_KEY ${PKG_ARGS_KEY}) + endif() + + if (DEFINED PKG_ARGS_HASH) + set(PKG_HASH "SHA512=${PKG_ARGS_HASH}") + endif() + + # Default behavior is bundled + if (DEFINED PKG_ARGS_SYSTEM_PACKAGE) + set(CPM_USE_LOCAL_PACKAGES ${PKG_ARGS_SYSTEM_PACKAGE}) + elseif (DEFINED PKG_ARGS_BUNDLED_PACKAGE) + if (PKG_ARGS_BUNDLED_PACKAGE) + set(CPM_USE_LOCAL_PACKAGES OFF) + else() + set(CPM_USE_LOCAL_PACKAGES ON) + endif() + else() + set(CPM_USE_LOCAL_PACKAGES OFF) + endif() + + CPMAddPackage( + NAME ${PKG_ARGS_NAME} + VERSION ${PKG_ARGS_VERSION} + URL ${PKG_URL} + URL_HASH ${PKG_HASH} + CUSTOM_CACHE_KEY ${PKG_KEY} + DOWNLOAD_ONLY ${PKG_ARGS_DOWNLOAD_ONLY} + FIND_PACKAGE_ARGUMENTS ${PKG_ARGS_FIND_PACKAGE_ARGUMENTS} + + OPTIONS ${PKG_ARGS_OPTIONS} + PATCHES ${PKG_ARGS_PATCHES} + + ${PKG_ARGS_UNPARSED_ARGUMENTS} + ) + + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_NAMES ${PKG_ARGS_NAME}) + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_URLS ${PKG_GIT_URL}) + + if (${PKG_ARGS_NAME}_ADDED) + if (DEFINED PKG_ARGS_SHA) + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_SHA}) + elseif(DEFINED PKG_ARGS_VERSION) + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS ${PKG_ARGS_VERSION}) + else() + message(WARNING "CPMUtil: Package ${PKG_ARGS_NAME} has no specified sha or version") + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown") + endif() + else() + if (DEFINED CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION) + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "${CPM_PACKAGE_${PKG_ARGS_NAME}_VERSION} (system)") + else() + set_property(GLOBAL APPEND PROPERTY CPM_PACKAGE_SHAS "unknown (system)") + endif() + endif() + + # pass stuff to parent scope + set(${PKG_ARGS_NAME}_ADDED "${${PKG_ARGS_NAME}_ADDED}" PARENT_SCOPE) + set(${PKG_ARGS_NAME}_SOURCE_DIR "${${PKG_ARGS_NAME}_SOURCE_DIR}" PARENT_SCOPE) + set(${PKG_ARGS_NAME}_BINARY_DIR "${${PKG_ARGS_NAME}_BINARY_DIR}" PARENT_SCOPE) +endfunction() diff --git a/CMakeModules/DownloadExternals.cmake b/CMakeModules/DownloadExternals.cmake index d4c1042740..62cf2689ab 100644 --- a/CMakeModules/DownloadExternals.cmake +++ b/CMakeModules/DownloadExternals.cmake @@ -6,7 +6,7 @@ # remote_path: path to the file to download, relative to the remote repository root # prefix_var: name of a variable which will be set with the path to the extracted contents set(CURRENT_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR}) -function(download_bundled_external remote_path lib_name cpm_key prefix_var) +function(download_bundled_external remote_path lib_name cpm_key prefix_var version) set(package_base_url "https://github.com/eden-emulator/") set(package_repo "no_platform") set(package_extension "no_platform") @@ -29,13 +29,13 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var) set(package_url "${package_base_url}${package_repo}") set(full_url ${package_url}${remote_path}${lib_name}${package_extension}) - set(CPM_USE_LOCAL_PACKAGES OFF) - - CPMAddPackage( + AddPackage( NAME ${cpm_key} + VERSION ${version} URL ${full_url} DOWNLOAD_ONLY YES - CUSTOM_CACHE_KEY ${CACHE_KEY} + KEY ${CACHE_KEY} + # TODO(crueter): hash ) set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE) @@ -46,11 +46,11 @@ function(download_win_archives) set(FORCE_WIN_ARCHIVES ON) set(FFmpeg_EXT_NAME "ffmpeg-7.1.1") - download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "") + download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" "" 7.1.1) # TODO(crueter): separate handling for arm64 set(SDL2_VER "SDL2-2.32.8") - download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "") + download_bundled_external("sdl2/" ${SDL2_VER} "sdl2-bundled" "" 2.32.8) set(FORCE_WIN_ARCHIVES OFF) endfunction() diff --git a/CMakeModules/GenerateDepHashes.cmake b/CMakeModules/GenerateDepHashes.cmake new file mode 100644 index 0000000000..d0d59bd22f --- /dev/null +++ b/CMakeModules/GenerateDepHashes.cmake @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2025 Eden Emulator Project +# SPDX-License-Identifier: GPL-3.0-or-later + +get_property(NAMES GLOBAL PROPERTY CPM_PACKAGE_NAMES) +get_property(SHAS GLOBAL PROPERTY CPM_PACKAGE_SHAS) +get_property(URLS GLOBAL PROPERTY CPM_PACKAGE_URLS) + +list(LENGTH NAMES DEPS_LENGTH) + +list(JOIN NAMES "\",\n\t\"" DEP_NAME_DIRTY) +set(DEP_NAMES "\t\"${DEP_NAME_DIRTY}\"") + +list(JOIN SHAS "\",\n\t\"" DEP_SHAS_DIRTY) +set(DEP_SHAS "\t\"${DEP_SHAS_DIRTY}\"") + +list(JOIN URLS "\",\n\t\"" DEP_URLS_DIRTY) +set(DEP_URLS "\t\"${DEP_URLS_DIRTY}\"") + +configure_file(dep_hashes.h.in dep_hashes.h @ONLY) +target_sources(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/dep_hashes.h) +target_include_directories(common PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt index 13e81b11b6..6e5f0d22ab 100644 --- a/externals/CMakeLists.txt +++ b/externals/CMakeLists.txt @@ -5,7 +5,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later # cpm -include(CPM) +include(CPMUtil) # Explicitly declare this option here to propagate to the oaknut CPM call option(DYNARMIC_TESTS "Build tests" ${BUILD_TESTING}) @@ -29,8 +29,6 @@ endif() # Xbyak (also used by Dynarmic, so needs to be added first) if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) - set(CPM_USE_LOCAL_PACKAGES OFF) - if ("${CMAKE_SYSTEM_NAME}" STREQUAL "SunOS") # Fix regset.h collisions set(XBYAK_HASH 51f507b0b3) @@ -40,22 +38,22 @@ if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) set(XBYAK_SHA512SUM 5824e92159e07fa36a774aedd3b3ef3541d0241371d522cffa4ab3e1f215fa5097b1b77865b47b2481376c704fa079875557ea463ca63d0a7fd6a8a20a589e70) endif() - CPMAddPackage( + AddPackage( NAME xbyak - URL "https://github.com/Lizzie841/xbyak/archive/${XBYAK_HASH}.zip" - URL_HASH SHA512=${XBYAK_SHA512SUM} - CUSTOM_CACHE_KEY ${XBYAK_HASH} + REPO "Lizzie841/xbyak" + SHA ${XBYAK_HASH} + HASH ${XBYAK_SHA512SUM} ) endif() # Oaknut (also used by Dynarmic, so needs to be added first) if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS) - CPMAddPackage( + AddPackage( NAME oaknut VERSION 2.0.1 - URL "https://github.com/merryhime/oaknut/archive/94c726ce03.zip" - URL_HASH SHA512=d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac - CUSTOM_CACHE_KEY "94c7" + REPO "merryhime/oaknut" + SHA 94c726ce03 + HASH d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac ) endif() @@ -69,15 +67,14 @@ add_subdirectory(glad) # mbedtls # TODO(crueter): test local mbedtls -set(CPM_USE_LOCAL_PACKAGES ON) - -CPMAddPackage( +AddPackage( NAME mbedtls - URL "https://github.com/Mbed-TLS/mbedtls/archive/8c88150ca1.zip" - URL_HASH SHA512=769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966 + REPO "Mbed-TLS/mbedtls" + SHA "8c88150ca1" + HASH 769ad1e94c570671071e1f2a5c0f1027e0bf6bcdd1a80ea8ac970f2c86bc45ce4e31aa88d6d8110fc1bed1de81c48bc624df1b38a26f8b340a44e109d784a966 PATCHES ${CMAKE_SOURCE_DIR}/.patch/mbedtls/0001-cmake-version.patch - CUSTOM_CACHE_KEY "8c88" + SYSTEM_PACKAGE ON ) if (mbedtls_ADDED) @@ -131,11 +128,12 @@ if (YUZU_USE_EXTERNAL_SDL2) set(SDL_SHA512SUM d95af47f469a312876f8ab361074a1e7b8083db19935a102d9c6e5887ace6008e64475a8c54b00164b40cad86492bb1b2366084efdd0b2555e5fea6d9c5da80e) endif() - CPMAddPackage( + AddPackage( NAME SDL2 - URL "https://github.com/libsdl-org/SDL/archive/${SDL_HASH}.zip" - URL_HASH SHA512=${SDL_SHA512SUM} - CUSTOM_CACHE_KEY "${YUZU_SYSTEM_PROFILE}" + REPO "libsdl-org/SDL" + SHA ${SDL_HASH} + HASH ${SDL_SHA512SUM} + KEY ${YUZU_SYSTEM_PROFILE} ) endif() @@ -146,18 +144,17 @@ if (NOT TARGET enet::enet) add_library(enet::enet ALIAS enet) endif() -# TODO(crueter): Create a common CPMUtil.cmake that does this for me -set(CPM_USE_LOCAL_PACKAGES ON) - -CPMAddPackage( +AddPackage( NAME cubeb - URL "https://github.com/mozilla/cubeb/archive/fa02160712.zip" + REPO "mozilla/cubeb" + SHA fa02160712 + HASH 82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61 FIND_PACKAGE_ARGUMENTS "CONFIG" # not sure this works outside of gentoo OPTIONS "USE_SANITIZERS OFF" "BUILD_TESTS OFF" "BUILD_TOOLS OFF" - CUSTOM_CACHE_KEY "fa02" + SYSTEM_PACKAGE ON ) if (cubeb_ADDED) @@ -184,19 +181,17 @@ endif() # DiscordRPC if (USE_DISCORD_PRESENCE) - set(CPM_USE_LOCAL_PACKAGES OFF) - - CPMAddPackage( + AddPackage( NAME discord-rpc - URL "https://github.com/discord/discord-rpc/archive/963aa9f3e5.zip" - URL_HASH SHA512=386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde + REPO "discord/discord-rpc" + SHA 963aa9f3e5 + HASH 386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde OPTIONS "BUILD_EXAMPLES OFF" PATCHES ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0001-cmake-version.patch ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0002-no-clang-format.patch ${CMAKE_SOURCE_DIR}/.patch/discord-rpc/0003-fix-cpp17.patch - CUSTOM_CACHE_KEY "963a" ) target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include) @@ -205,76 +200,68 @@ endif() # Sirit # TODO(crueter): spirv-tools doesn't work w/ system -set(CPM_USE_LOCAL_PACKAGES OFF) - -CPMAddPackage( +AddPackage( NAME SPIRV-Headers - URL "https://github.com/KhronosGroup/SPIRV-Headers/archive/4e209d3d7e.zip" - URL_HASH SHA512=f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4 - CUSTOM_CACHE_KEY "4e20" + REPO "KhronosGroup/SPIRV-Headers" + SHA 4e209d3d7e + HASH f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4 ) -set(CPM_USE_LOCAL_PACKAGES ON) - -CPMAddPackage( +AddPackage( NAME sirit - URL "https://github.com/raphaelthegreat/sirit/archive/51fcf9720f.zip" - URL_HASH SHA512=a8f98ea0c51763b89924d836ad482ebdfe9130251cf4e14733ccaacc885ae8cc4c8b03d1dc43e8861609e5f7929c16f935879c1f6bf61866fd75077954774394 + REPO "eden-emulator/sirit" + SHA db1f1e8ab5 + HASH 73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05 OPTIONS "SIRIT_USE_SYSTEM_SPIRV_HEADERS ON" - CUSTOM_CACHE_KEY "51fc" + SYSTEM_PACKAGE ON ) # httplib if ((ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER)) - set(CPM_USE_LOCAL_PACKAGES ${YUZU_USE_SYSTEM_HTTPLIB}) - - # TODO(crueter): fix local package (gentoo?) - CPMAddPackage( + AddPackage( NAME httplib VERSION 0.12 - URL "https://github.com/yhirose/cpp-httplib/archive/a609330e4c.zip" - URL_HASH SHA512=dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2 + REPO "yhirose/cpp-httplib" + SHA a609330e4c + HASH dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2 FIND_PACKAGE_ARGUMENTS "MODULE" OPTIONS "HTTPLIB_REQUIRE_OPENSSL ON" - CUSTOM_CACHE_KEY "a609" + SYSTEM_PACKAGE ${YUZU_USE_SYSTEM_HTTPLIB} ) endif() # cpp-jwt if (ENABLE_WEB_SERVICE) - set(CPM_USE_LOCAL_PACKAGES OFF) - - CPMAddPackage( + AddPackage( NAME cpp-jwt VERSION 1.4 - URL "https://github.com/arun11299/cpp-jwt/archive/10ef5735d8.zip" - URL_HASH SHA512=ebba3d26b33a3b0aa909f475e099594560edbce10ecd03e76d7fea68549a28713ea606d363808f88a5495b62c54c3cdb7e47aee2d946eceabd36e310479dadb7 + REPO "arun11299/cpp-jwt" + SHA 10ef5735d8 + HASH ebba3d26b33a3b0aa909f475e099594560edbce10ecd03e76d7fea68549a28713ea606d363808f88a5495b62c54c3cdb7e47aee2d946eceabd36e310479dadb7 FIND_PACKAGE_ARGUMENTS "CONFIG" OPTIONS "CPP_JWT_BUILD_EXAMPLES OFF" "CPP_JWT_BUILD_TESTS OFF" "CPP_JWT_USE_VENDORED_NLOHMANN_JSON OFF" - CUSTOM_CACHE_KEY "10ef" ) endif() # Opus -set(CPM_USE_LOCAL_PACKAGES ${YUZU_USE_SYSTEM_OPUS}) - -CPMAddPackage( +AddPackage( NAME Opus VERSION 1.3 - URL "https://github.com/xiph/opus/archive/5ded705cf4.zip" - URL_HASH SHA512=0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203 + REPO "xiph/opus" + SHA 5ded705cf4 + HASH 0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203 FIND_PACKAGE_ARGUMENTS "MODULE" OPTIONS "OPUS_BUILD_TESTING OFF" "OPUS_BUILD_PROGRAMS OFF" "OPUS_INSTALL_PKG_CONFIG_MODULE OFF" "OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF" - CUSTOM_CACHE_KEY "5ded" + SYSTEM_PACKAGE ${YUZU_USE_SYSTEM_OPUS} ) # FFMpeg @@ -290,31 +277,36 @@ endif() if (YUZU_USE_EXTERNAL_VULKAN_HEADERS) set(CPM_USE_LOCAL_PACKAGES OFF) else() - set(CPM_USE_LOCAL_PACKAGES ON) + set(CPM_USE_LOCAL_PACKAGES OFF) endif() -# TODO(crueter): System vk-headers are too new for externals vk-util +# TODO(crueter): Vk1.4 impl -CPMAddPackage( +# TODO(crueter): allow sys packages? +AddPackage( NAME VulkanHeaders VERSION 1.3.274 - URL "https://github.com/KhronosGroup/Vulkan-Headers/archive/89268a6d17.zip" - URL_HASH SHA512=3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8 - CUSTOM_CACHE_KEY "8926" + REPO "KhronosGroup/Vulkan-Headers" + SHA 89268a6d17 + HASH 3ab349f74298ba72cafb8561015690c0674d428a09fb91ccd3cd3daca83650d190d46d33fd97b0a8fd4223fe6df2bcabae89136fbbf7c0bfeb8776f9448304c8 + BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_HEADERS} ) -# Vulkan-Utility-Libraries -if (YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES) - set(CPM_USE_LOCAL_PACKAGES OFF) -else() - set(CPM_USE_LOCAL_PACKAGES ON) +# CMake's interface generator sucks +if (VulkanHeaders_ADDED) + target_include_directories(Vulkan-Headers INTERFACE ${VulkanHeaders_SOURCE_DIR}/include) endif() -CPMAddPackage( +set(VulkanHeaders_SOURCE_DIR "${VulkanHeaders_SOURCE_DIR}" PARENT_SCOPE) +set(VulkanHeaders_ADDED "${VulkanHeaders_ADDED}" PARENT_SCOPE) + +# Vulkan-Utility-Libraries +AddPackage( NAME VulkanUtilityLibraries - URL "https://github.com/KhronosGroup/Vulkan-Utility-Libraries/archive/df2e358152.zip" - URL_HASH SHA512=3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79 - CUSTOM_CACHE_KEY "df2e" + REPO "KhronosGroup/Vulkan-Utility-Libraries" + SHA df2e358152 + HASH 3e468c3d9ff93f6d418d71e5527abe0a12c8c7ab5b0b52278bbbee4d02bb87e99073906729b727e0147242b7e3fd5dedf68b803f1878cb4c0e4f730bc2238d79 + BUNDLED_PACKAGE ${YUZU_USE_EXTERNAL_VULKAN_UTILITY_LIBRARIES} ) set(VulkanUtilityLibraries_SOURCE_DIR "${VulkanUtilityLibraries_SOURCE_DIR}" PARENT_SCOPE) @@ -322,38 +314,35 @@ set(VulkanUtilityLibraries_ADDED "${VulkanUtilityLibraries_ADDED}" PARENT_SCOPE) # SPIRV-Tools if (YUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS) - CPMAddPackage( + AddPackage( NAME SPIRV-Tools - URL "https://github.com/KhronosGroup/SPIRV-Tools/archive/40eb301f32.zip" - URL_HASH SHA512=58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa + REPO "KhronosGroup/SPIRV-Tools" + SHA 40eb301f32 + HASH 58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa OPTIONS "SPIRV_SKIP_EXECUTABLES ON" - CUSTOM_CACHE_KEY "40eb" ) endif() # Boost headers -set(CPM_USE_LOCAL_PACKAGES OFF) - -CPMAddPackage( +AddPackage( NAME boost_headers - URL "https://github.com/boostorg/headers/archive/0456900fad.zip" - URL_HASH SHA512=50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3 - CUSTOM_CACHE_KEY "0456" + REPO "boostorg/headers" + SHA 0456900fad + HASH 50cd75dcdfc5f082225cdace058f47b4fb114a47585f7aee1d22236a910a80b667186254c214fa2fcebac67ae6d37ba4b6e695e1faea8affd6fd42a03cf996e3 ) # TZDB (Time Zone Database) add_subdirectory(nx_tzdb) # VMA -set(CPM_USE_LOCAL_PACKAGES ON) - -CPMAddPackage( +AddPackage( NAME VulkanMemoryAllocator - URL "https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/archive/1076b348ab.zip" - URL_HASH SHA512=a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772 + REPO "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator" + SHA 1076b348ab + HASH a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772 FIND_PACKAGE_ARGUMENTS "CONFIG" - CUSTOM_CACHE_KEY "1076" + # SYSTEM_PACKAGE ON ) set(VulkanMemoryAllocator_SOURCE_DIR "${VulkanMemoryAllocator_SOURCE_DIR}" PARENT_SCOPE) @@ -389,15 +378,13 @@ endif() if (ANDROID) if (ARCHITECTURE_arm64) - set(CPM_USE_LOCAL_PACKAGES OFF) - - CPMAddPackage( + AddPackage( NAME libadrenotools - URL "https://github.com/bylaws/libadrenotools/archive/8fae8ce254.zip" - URL_HASH SHA512=c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb + REPO "bylaws/libadrenotools" + SHA 8fae8ce254 + HASH c74fa855f0edebbf25c9bce40b00966daa2447bfc5e15f0cf1a95f86cbf70fc6b02590707edbde16328a0a2a4fb9a1fc419d2dfc22a4a4150971be91892d4edb PATCHES ${CMAKE_SOURCE_DIR}/.patch/libadrenotools/0001-linkerns-cpm.patch - CUSTOM_CACHE_KEY "8fae" ) endif() endif() @@ -422,13 +409,12 @@ if (YUZU_CRASH_DUMPS AND NOT TARGET libbreakpad_client) _CRT_NONSTDC_NO_DEPRECATE ) - set(CPM_USE_LOCAL_PACKAGES OFF) - CPMAddPackage( + AddPackage( NAME breakpad - URL "https://github.com/google/breakpad/archive/f80f288803.zip" - URL_HASH SHA512=4a87ee88cea99bd633d52a5b00135a649f1475e3b65db325a6df9c804ab82b054ad7e62419b35f6e22cc5dfbbb569214041d7ad5d10fab10106e700bb5050e1d + URL "google/breakpad" + SHA f80f288803 + HASH 4a87ee88cea99bd633d52a5b00135a649f1475e3b65db325a6df9c804ab82b054ad7e62419b35f6e22cc5dfbbb569214041d7ad5d10fab10106e700bb5050e1d DOWNLOAD_ONLY YES - CUSTOM_CACHE_KEY "f80f" ) # libbreakpad @@ -528,14 +514,11 @@ endif() # oboe if (ANDROID) - set(CPM_USE_LOCAL_PACKAGES ON) - CPMAddPackage( + AddPackage( NAME oboe - URL "https://github.com/google/oboe/archive/2bc873e53c.zip" - URL_HASH SHA512=02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768 - OPTIONS - "SPIRV_SKIP_EXECUTABLES ON" - CUSTOM_CACHE_KEY "2bc8" + REPO "google/oboe" + SHA 2bc873e53c + HASH 02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768 ) add_library(oboe::oboe ALIAS oboe) diff --git a/externals/ffmpeg/CMakeLists.txt b/externals/ffmpeg/CMakeLists.txt index 1a2ec0e180..02ce6c1f7c 100644 --- a/externals/ffmpeg/CMakeLists.txt +++ b/externals/ffmpeg/CMakeLists.txt @@ -19,14 +19,11 @@ if (NOT WIN32 AND NOT ANDROID) message(FATAL_ERROR "Required program `autoconf` not found.") endif() - include(CPM) - set(CPM_USE_LOCAL_PACKAGES OFF) - - CPMAddPackage( + AddPackage( NAME ffmpeg - URL "https://github.com/FFmpeg/FFmpeg/archive/c2184b65d2.zip" - URL_HASH SHA512=2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97 - CUSTOM_CACHE_KEY "c218" + REPO "FFmpeg/FFmpeg" + SHA c2184b65d2 + HASH 2a89d664119debbb3c006ab1c48d5d7f26e889f4a65ad2e25c8b0503308295123d5a9c5c78bf683aef5ff09acef8c3fc2837f22d3e8c611528b933bf03bcdd97 ) set(FFmpeg_PREFIX ${ffmpeg_SOURCE_DIR}) @@ -243,7 +240,7 @@ elseif(ANDROID) message(FATAL_ERROR "Unsupported architecture for Android FFmpeg") endif() - download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH) + download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH 7.1.1) set(FFmpeg_FOUND YES) set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/lib" CACHE PATH "Path to FFmpeg library directory" FORCE) @@ -268,7 +265,7 @@ elseif(WIN32) # Use yuzu FFmpeg binaries set(FFmpeg_EXT_NAME "ffmpeg-7.1.1") - download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH) + download_bundled_external("ffmpeg/" ${FFmpeg_EXT_NAME} "ffmpeg-bundled" FFmpeg_PATH 7.1.1) set(FFmpeg_FOUND YES) set(FFmpeg_INCLUDE_DIR "${FFmpeg_PATH}/include" CACHE PATH "Path to FFmpeg headers" FORCE) set(FFmpeg_LIBRARY_DIR "${FFmpeg_PATH}/bin" CACHE PATH "Path to FFmpeg library directory" FORCE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index aa23f1b50e..bd1285b2bc 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -232,3 +232,5 @@ if (ANDROID) add_subdirectory(android/app/src/main/jni) target_include_directories(yuzu-android PRIVATE android/app/src/main) endif() + +include(GenerateDepHashes) diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index f97dca2432..580f984ad8 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -159,7 +159,8 @@ add_library( wall_clock.cpp wall_clock.h zstd_compression.cpp - zstd_compression.h) + zstd_compression.h +) if(YUZU_ENABLE_PORTABLE) add_compile_definitions(YUZU_ENABLE_PORTABLE) diff --git a/src/dep_hashes.h.in b/src/dep_hashes.h.in new file mode 100644 index 0000000000..cee9df0537 --- /dev/null +++ b/src/dep_hashes.h.in @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +namespace Common { + +static const constexpr std::array dep_names = { +@DEP_NAMES@ +}; + +static const constexpr std::array dep_hashes = { +@DEP_SHAS@ +}; + +static const constexpr std::array dep_urls = { +@DEP_URLS@ +}; + +} // namespace Common diff --git a/src/dynarmic/externals/CMakeLists.txt b/src/dynarmic/externals/CMakeLists.txt index 7925744153..ce262d04d2 100644 --- a/src/dynarmic/externals/CMakeLists.txt +++ b/src/dynarmic/externals/CMakeLists.txt @@ -1,4 +1,4 @@ -include(CPM) +include(CPMUtil) # Always build externals as static libraries, even when dynarmic is built as shared if (BUILD_SHARED_LIBS) @@ -22,12 +22,12 @@ set(BUILD_TESTING OFF) if ("riscv" IN_LIST ARCHITECTURE) add_subdirectory(biscuit) - CPMAddPackage( + AddPackage( NAME biscuit VERSION 0.9.1 - URL "https://github.com/lioncash/biscuit/archive/76b0be8dae.zip" - URL_HASH SHA512=47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489 - CUSTOM_CACHE_KEY "76b0" + REPO "lioncash/biscuit" + SHA 76b0be8dae + HASH 47d55ed02d032d6cf3dc107c6c0a9aea686d5f25aefb81d1af91db027b6815bd5add1755505e19d76625feeb17aa2db6cd1668fe0dad2e6a411519bde6ca4489 ) endif() @@ -49,14 +49,14 @@ if (NOT TARGET fmt::fmt) endif() # mcl -CPMAddPackage( +AddPackage( NAME mcl VERSION 0.1.12 - URL "https://github.com/azahar-emu/mcl/archive/7b08d83418.zip" - URL_HASH SHA512=f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3 + REPO "azahar-emu/mcl" + SHA 7b08d83418 + HASH f943bac39c1879986decad7a442ff4288eaeca4a2907684c7914e115a55ecc43c2782ded85c0835763fe04e40d5c82220ce864423e489e648e408a84f54dc4f3 OPTIONS "MCL_INSTALL OFF" - CUSTOM_CACHE_KEY "7b08" ) # oaknut @@ -71,14 +71,14 @@ CPMAddPackage( # unordered_dense -CPMAddPackage( +AddPackage( NAME unordered_dense - URL "https://github.com/Lizzie841/unordered_dense/archive/e59d30b7b1.zip" - URL_HASH SHA512=71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0 + REPO "Lizzie841/unordered_dense" + SHA e59d30b7b1 + HASH 71eff7bd9ba4b9226967bacd56a8ff000946f8813167cb5664bb01e96fb79e4e220684d824fe9c59c4d1cc98c606f13aff05b7940a1ed8ab3c95d6974ee34fa0 FIND_PACKAGE_ARGUMENTS "CONFIG" OPTIONS "UNORDERED_DENSE_INSTALL OFF" - CUSTOM_CACHE_KEY "e59d" ) # xbyak @@ -93,24 +93,24 @@ CPMAddPackage( # zydis if ("x86_64" IN_LIST ARCHITECTURE) - CPMAddPackage( + AddPackage( NAME Zycore - URL "https://github.com/zyantific/zycore-c/archive/75a36c45ae.zip" - URL_HASH SHA512=15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924 - CUSTOM_CACHE_KEY "75a3" + REPO "zyantific/zycore-c" + SHA 75a36c45ae + HASH 15aa399f39713e042c4345bc3175c82f14dca849fde2a21d4f591f62c43e227b70d868d8bb86beb5f4eb68b1d6bd3792cdd638acf89009e787e3d10ee7401924 ) - CPMAddPackage( + AddPackage( NAME Zydis VERSION 4 - URL "https://github.com/zyantific/zydis/archive/c2d2bab025.zip" - URL_HASH SHA512=7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020 + REPO "zyantific/zydis" + SHA c2d2bab025 + HASH 7b48f213ff7aab2926f8c9c65195959143bebbfb2b9a25051ffd8b8b0f1baf1670d9739781de674577d955925f91ac89376e16b476a03828c84e2fd765d45020 OPTIONS "ZYDIS_BUILD_TOOLS OFF" "ZYDIS_BUILD_EXAMPLES OFF" "ZYDIS_BUILD_DOXYGEN OFF" "ZYAN_ZYCORE_PATH ${Zycore_SOURCE_DIR}" "CMAKE_DISABLE_FIND_PACKAGE_Doxygen ON" - CUSTOM_CACHE_KEY "c2d2" ) endif() diff --git a/src/network/announce_multiplayer_session.cpp b/src/network/announce_multiplayer_session.cpp index 8836524c73..9d86ea378c 100644 --- a/src/network/announce_multiplayer_session.cpp +++ b/src/network/announce_multiplayer_session.cpp @@ -23,13 +23,13 @@ namespace Core { static constexpr std::chrono::seconds announce_time_interval(15); AnnounceMultiplayerSession::AnnounceMultiplayerSession() { -//#ifdef ENABLE_WEB_SERVICE +#ifdef ENABLE_WEB_SERVICE backend = std::make_unique(Settings::values.web_api_url.GetValue(), Settings::values.eden_username.GetValue(), Settings::values.eden_token.GetValue()); -//#else -// backend = std::make_unique(); -//#endif +#else + backend = std::make_unique(); +#endif } WebService::WebResult AnnounceMultiplayerSession::Register() { @@ -156,11 +156,11 @@ bool AnnounceMultiplayerSession::IsRunning() const { void AnnounceMultiplayerSession::UpdateCredentials() { ASSERT_MSG(!IsRunning(), "Credentials can only be updated when session is not running"); -//#ifdef ENABLE_WEB_SERVICE +#ifdef ENABLE_WEB_SERVICE backend = std::make_unique(Settings::values.web_api_url.GetValue(), Settings::values.eden_username.GetValue(), Settings::values.eden_token.GetValue()); -//#endif +#endif } } // namespace Core diff --git a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp index 74884ab4eb..77ff8c5731 100644 --- a/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp +++ b/src/shader_recompiler/backend/spirv/emit_spirv_warp.cpp @@ -70,7 +70,7 @@ Id GetMaxThreadId(EmitContext& ctx, Id thread_id, Id clamp, Id segmentation_mask Id SelectValue(EmitContext& ctx, Id in_range, Id value, Id src_thread_id) { return ctx.OpSelect( ctx.U32[1], in_range, - ctx.OpGroupNonUniformShuffleXor(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id), value); + ctx.OpGroupNonUniformShuffle(ctx.U32[1], SubgroupScope(ctx), value, src_thread_id), value); } Id AddPartitionBase(EmitContext& ctx, Id thread_id) { diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt index 211727be2e..eed1a73bff 100644 --- a/src/video_core/CMakeLists.txt +++ b/src/video_core/CMakeLists.txt @@ -337,6 +337,10 @@ if (VulkanUtilityLibraries_ADDED) target_include_directories(video_core PUBLIC ${VulkanUtilityLibraries_SOURCE_DIR}/include) endif() +if (VulkanHeaders_ADDED) + target_include_directories(video_core PUBLIC ${VulkanHeaders_SOURCE_DIR}/include) +endif() + target_link_libraries(video_core PRIVATE sirit Vulkan::Headers) if (ENABLE_NSIGHT_AFTERMATH) diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 474e420daf..fc9e78a234 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp @@ -974,7 +974,6 @@ bool Device::GetSuitability(bool requires_swapchain) { // Configure properties. VkPhysicalDeviceVulkan12Features features_1_2{}; VkPhysicalDeviceVulkan13Features features_1_3{}; - VkPhysicalDeviceVulkan14Features features_1_4{}; // Configure properties. properties.properties = physical.GetProperties(); @@ -1053,13 +1052,10 @@ bool Device::GetSuitability(bool requires_swapchain) { if (instance_version >= VK_API_VERSION_1_2) { features_1_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES; features_1_3.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES; - features_1_4.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_4_FEATURES; features_1_2.pNext = &features_1_3; - features_1_3.pNext = &features_1_4; *next = &features_1_2; - // next = &features_1_4.pNext; } // Test all features we know about. If the feature is not available in core at our diff --git a/src/yuzu/CMakeLists.txt b/src/yuzu/CMakeLists.txt index 2902b695ad..fb42962840 100644 --- a/src/yuzu/CMakeLists.txt +++ b/src/yuzu/CMakeLists.txt @@ -238,6 +238,10 @@ add_executable(yuzu migration_dialog.h migration_dialog.cpp migration_worker.h migration_worker.cpp + + deps_dialog.cpp + deps_dialog.h + deps_dialog.ui ) set_target_properties(yuzu PROPERTIES OUTPUT_NAME "eden") diff --git a/src/yuzu/aboutdialog.ui b/src/yuzu/aboutdialog.ui index c220472142..1fedb01814 100644 --- a/src/yuzu/aboutdialog.ui +++ b/src/yuzu/aboutdialog.ui @@ -11,7 +11,7 @@ - About eden + About Eden diff --git a/src/yuzu/deps_dialog.cpp b/src/yuzu/deps_dialog.cpp new file mode 100644 index 0000000000..4cef05e054 --- /dev/null +++ b/src/yuzu/deps_dialog.cpp @@ -0,0 +1,121 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "yuzu/deps_dialog.h" +#include +#include +#include +#include +#include +#include +#include "dep_hashes.h" +#include "ui_deps_dialog.h" +#include + +DepsDialog::DepsDialog(QWidget* parent) + : QDialog(parent) + , ui{std::make_unique()} +{ + ui->setupUi(this); + + constexpr size_t rows = Common::dep_hashes.size(); + ui->tableDeps->setRowCount(rows); + + QStringList labels; + labels << tr("Dependency") << tr("Version"); + + ui->tableDeps->setHorizontalHeaderLabels(labels); + ui->tableDeps->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeMode::Stretch); + ui->tableDeps->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeMode::Fixed); + ui->tableDeps->horizontalHeader()->setMinimumSectionSize(200); + + for (size_t i = 0; i < rows; ++i) { + const std::string name = Common::dep_names.at(i); + const std::string sha = Common::dep_hashes.at(i); + const std::string url = Common::dep_urls.at(i); + + std::string dependency = fmt::format("{}", url, name); + + QTableWidgetItem *nameItem = new QTableWidgetItem(QString::fromStdString(dependency)); + QTableWidgetItem *shaItem = new QTableWidgetItem(QString::fromStdString(sha)); + + ui->tableDeps->setItem(i, 0, nameItem); + ui->tableDeps->setItem(i, 1, shaItem); + } + + ui->tableDeps->setItemDelegateForColumn(0, new LinkItemDelegate(this)); +} + +DepsDialog::~DepsDialog() = default; + +LinkItemDelegate::LinkItemDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{} + +void LinkItemDelegate::paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const +{ + auto options = option; + initStyleOption(&options, index); + + QTextDocument doc; + QString html = index.data(Qt::DisplayRole).toString(); + doc.setHtml(html); + + options.text.clear(); + + painter->save(); + painter->translate(options.rect.topLeft()); + doc.drawContents(painter, QRectF(0, 0, options.rect.width(), options.rect.height())); + painter->restore(); +} + +QSize LinkItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QStyleOptionViewItem options = option; + initStyleOption(&options, index); + + QTextDocument doc; + doc.setHtml(options.text); + doc.setTextWidth(options.rect.width()); + return QSize(doc.idealWidth(), doc.size().height()); +} + +bool LinkItemDelegate::editorEvent(QEvent *event, + QAbstractItemModel *model, + const QStyleOptionViewItem &option, + const QModelIndex &index) +{ + if (event->type() == QEvent::MouseButtonRelease) { + QMouseEvent *mouseEvent = static_cast(event); + if (mouseEvent->button() == Qt::LeftButton) { + QString html = index.data(Qt::DisplayRole).toString(); + QTextDocument doc; + doc.setHtml(html); + doc.setTextWidth(option.rect.width()); + + // this is kinda silly but it werks + QAbstractTextDocumentLayout *layout = doc.documentLayout(); + + QPoint pos = mouseEvent->pos() - option.rect.topLeft(); + int charPos = layout->hitTest(pos, Qt::ExactHit); + + if (charPos >= 0) { + QTextCursor cursor(&doc); + cursor.setPosition(charPos); + + QTextCharFormat format = cursor.charFormat(); + + if (format.isAnchor()) { + QString href = format.anchorHref(); + if (!href.isEmpty()) { + QDesktopServices::openUrl(QUrl(href)); + return true; + } + } + } + } + } + return QStyledItemDelegate::editorEvent(event, model, option, index); +} diff --git a/src/yuzu/deps_dialog.h b/src/yuzu/deps_dialog.h new file mode 100644 index 0000000000..f8e7f1d987 --- /dev/null +++ b/src/yuzu/deps_dialog.h @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include +#include +#include +#include + +namespace Ui { class DepsDialog; } + +class DepsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit DepsDialog(QWidget *parent); + ~DepsDialog() override; + +private: + std::unique_ptr ui; +}; + +class LinkItemDelegate : public QStyledItemDelegate +{ + Q_OBJECT + +public: + explicit LinkItemDelegate(QObject *parent = 0); + +protected: + void paint(QPainter *painter, + const QStyleOptionViewItem &option, + const QModelIndex &index) const override; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; + bool editorEvent(QEvent *event, + QAbstractItemModel *model, + const QStyleOptionViewItem &option, + const QModelIndex &index) override; +}; diff --git a/src/yuzu/deps_dialog.ui b/src/yuzu/deps_dialog.ui new file mode 100644 index 0000000000..5c539d50e2 --- /dev/null +++ b/src/yuzu/deps_dialog.ui @@ -0,0 +1,166 @@ + + + DepsDialog + + + + 0 + 0 + 701 + 500 + + + + Eden Dependencies + + + + + + + + + + + 0 + 0 + + + + + 200 + 200 + + + + + + + :/icons/default/256x256/eden.png + + + true + + + + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + + + + + + + + + + 0 + 0 + + + + <html><head/><body><p><span style=" font-size:28pt;">Eden Dependencies</span></p></body></html> + + + + + + + + 0 + 0 + + + + <html><head/><body><p>The projects that make Eden possible</p></body></html> + + + + + + + QAbstractItemView::EditTrigger::NoEditTriggers + + + true + + + QAbstractItemView::SelectionMode::NoSelection + + + 2 + + + false + + + false + + + + + + + + + + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Ok + + + + + + + + + + + buttonBox + accepted() + DepsDialog + accept() + + + 20 + 20 + + + 20 + 20 + + + + + buttonBox + rejected() + DepsDialog + reject() + + + 20 + 20 + + + 20 + 20 + + + + + diff --git a/src/yuzu/externals/CMakeLists.txt b/src/yuzu/externals/CMakeLists.txt index d159fa9229..1ded70813b 100644 --- a/src/yuzu/externals/CMakeLists.txt +++ b/src/yuzu/externals/CMakeLists.txt @@ -2,7 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-or-later # cpm -include(CPM) +include(CPMUtil) # Disable tests/tools in all externals supporting the standard option name set(BUILD_TESTING OFF) @@ -14,11 +14,11 @@ set(BUILD_SHARED_LIBS OFF) set_directory_properties(PROPERTIES EXCLUDE_FROM_ALL ON) # QuaZip -set(CPM_USE_LOCAL_PACKAGES ON) - -CPMAddPackage( +AddPackage( NAME QuaZip-Qt6 VERSION 1.3 - URL "https://github.com/crueter/quazip-qt6/archive/f838774d63.zip" - CUSTOM_CACHE_KEY "f838" + REPO "crueter/quazip-qt6" + SHA f838774d63 + HASH 9f629a438699801244a106c8df6d5f8f8d19e80df54f530a89403a10c8c4e37a6e95606bbdd307f23636961e8ce34eb37a2186d589a1f227ac9c8e2c678e326e + SYSTEM_PACKAGE ON ) diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 38c0e4b3ce..6c522794e5 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -160,6 +160,7 @@ static FileSys::VirtualFile VfsDirectoryCreateFileWrapper(const FileSys::Virtual #include "yuzu/debugger/console.h" #include "yuzu/debugger/controller.h" #include "yuzu/debugger/wait_tree.h" +#include "yuzu/deps_dialog.h" #include "yuzu/discord.h" #include "yuzu/game_list.h" #include "yuzu/game_list_p.h" @@ -1769,6 +1770,7 @@ void GMainWindow::ConnectMenuEvents() { connect_menu(ui->action_Firmware_From_ZIP, &GMainWindow::OnInstallFirmwareFromZIP); connect_menu(ui->action_Install_Keys, &GMainWindow::OnInstallDecryptionKeys); connect_menu(ui->action_About, &GMainWindow::OnAbout); + connect_menu(ui->action_Eden_Dependencies, &GMainWindow::OnEdenDependencies); } void GMainWindow::UpdateMenuState() { @@ -3742,7 +3744,7 @@ void GMainWindow::OnOpenFAQ() { } void GMainWindow::OnOpenDiscord() { - OpenURL(QUrl(QStringLiteral("https://discord.gg/kXAmGCXBGD"))); + OpenURL(QUrl(QStringLiteral("https://discord.gg/HstXbPch7X"))); } void GMainWindow::OnOpenRevolt() { @@ -4582,6 +4584,11 @@ void GMainWindow::OnAbout() { aboutDialog.exec(); } +void GMainWindow::OnEdenDependencies() { + DepsDialog depsDialog(this); + depsDialog.exec(); +} + void GMainWindow::OnToggleFilterBar() { game_list->SetFilterVisible(ui->action_Show_Filter_Bar->isChecked()); if (ui->action_Show_Filter_Bar->isChecked()) { diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 5e0405ee7f..c7dd2a45fa 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -397,6 +397,7 @@ private slots: void OnInstallFirmwareFromZIP(); void OnInstallDecryptionKeys(); void OnAbout(); + void OnEdenDependencies(); void OnToggleFilterBar(); void OnToggleStatusBar(); void OnGameListRefresh(); diff --git a/src/yuzu/main.ui b/src/yuzu/main.ui index 25aaf6ad1c..ac8a2b594e 100644 --- a/src/yuzu/main.ui +++ b/src/yuzu/main.ui @@ -217,6 +217,7 @@ + @@ -575,6 +576,11 @@ + + + &Eden Dependencies + + diff --git a/tools/cpm-hash.sh b/tools/cpm-hash.sh index 9fde15ff7d..da0fb395db 100755 --- a/tools/cpm-hash.sh +++ b/tools/cpm-hash.sh @@ -1,7 +1,4 @@ #!/bin/sh -for i in $@; do - SUM=`wget -q $i -O - | sha512sum` - echo "$i" - echo "URL_HASH SHA512=$SUM" | cut -d " " -f1-2 -done +SUM=`wget -q https://github.com/$1/archive/$2.zip -O - | sha512sum` +echo "$SUM" | cut -d " " -f1