diff --git a/.ci/linux/build.sh b/.ci/linux/build.sh index 2a0a7e58b1..16eaef394b 100755 --- a/.ci/linux/build.sh +++ b/.ci/linux/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later case "$1" in @@ -104,7 +104,8 @@ cmake .. -G Ninja \ -DYUZU_USE_QT_MULTIMEDIA=$MULTIMEDIA \ -DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \ -DYUZU_USE_FASTER_LD=ON \ - -DENABLE_LTO=ON \ + -DYUZU_ENABLE_LTO=ON \ + -DDYNARMIC_ENABLE_LTO=ON \ "${EXTRA_CMAKE_FLAGS[@]}" ninja -j${NPROC} diff --git a/.ci/windows/build.sh b/.ci/windows/build.sh old mode 100755 new mode 100644 index 48cca8eb4d..fd1883048c --- a/.ci/windows/build.sh +++ b/.ci/windows/build.sh @@ -1,6 +1,6 @@ #!/bin/bash -ex -# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project # SPDX-License-Identifier: GPL-3.0-or-later if [ "$COMPILER" == "clang" ] @@ -32,8 +32,9 @@ cmake .. -G Ninja \ -DYUZU_ROOM_STANDALONE=OFF \ -DYUZU_USE_QT_MULTIMEDIA=${USE_MULTIMEDIA:-false} \ -DYUZU_USE_QT_WEB_ENGINE=${USE_WEBENGINE:-false} \ - -DENABLE_LTO=ON \ + -DYUZU_ENABLE_LTO=ON \ -DCMAKE_EXE_LINKER_FLAGS=" /LTCG" \ + -DDYNARMIC_ENABLE_LTO=ON \ -DYUZU_USE_BUNDLED_QT=${BUNDLE_QT:-false} \ -DUSE_CCACHE=${CCACHE:-false} \ -DENABLE_UPDATE_CHECKER=${DEVEL:-true} \ diff --git a/.gitignore b/.gitignore index 67bdd8adf4..0be76d85cd 100644 --- a/.gitignore +++ b/.gitignore @@ -63,4 +63,3 @@ artifacts *.AppImage* /install* vulkansdk*.exe -*.tar.zst diff --git a/.patch/httplib/0002-fix-zstd.patch b/.patch/httplib/0002-fix-zstd.patch deleted file mode 100644 index f54485ea53..0000000000 --- a/.patch/httplib/0002-fix-zstd.patch +++ /dev/null @@ -1,89 +0,0 @@ -From 509be32bbfa6eb95014860f7c9ea6d45c8ddaa56 Mon Sep 17 00:00:00 2001 -From: crueter -Date: Sun, 8 Mar 2026 15:11:12 -0400 -Subject: [PATCH] [cmake] Simplify zstd find logic, and support pre-existing - zstd target - -Some deduplication work on the zstd required/if-available logic. Also -adds support for pre-existing `zstd::libzstd` which is useful for -projects that bundle their own zstd in a way that doesn't get caught by -`CONFIG` - -Signed-off-by: crueter ---- - CMakeLists.txt | 46 ++++++++++++++++++++++++++-------------------- - 1 file changed, 26 insertions(+), 20 deletions(-) - -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 1874e36be0..8d31198006 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -241,28 +241,34 @@ endif() - # NOTE: - # zstd < 1.5.6 does not provide the CMake imported target `zstd::libzstd`. - # Older versions must be consumed via their pkg-config file. --if(HTTPLIB_REQUIRE_ZSTD) -- find_package(zstd 1.5.6 CONFIG) -- if(NOT zstd_FOUND) -- find_package(PkgConfig REQUIRED) -- pkg_check_modules(zstd REQUIRED IMPORTED_TARGET libzstd) -- add_library(zstd::libzstd ALIAS PkgConfig::zstd) -- endif() -- set(HTTPLIB_IS_USING_ZSTD TRUE) --elseif(HTTPLIB_USE_ZSTD_IF_AVAILABLE) -- find_package(zstd 1.5.6 CONFIG QUIET) -- if(NOT zstd_FOUND) -- find_package(PkgConfig QUIET) -- if(PKG_CONFIG_FOUND) -- pkg_check_modules(zstd QUIET IMPORTED_TARGET libzstd) -- -- if(TARGET PkgConfig::zstd) -+if (HTTPLIB_REQUIRE_ZSTD) -+ set(HTTPLIB_ZSTD_REQUESTED ON) -+ set(HTTPLIB_ZSTD_REQUIRED REQUIRED) -+elseif (HTTPLIB_USE_ZSTD_IF_AVAILABLE) -+ set(HTTPLIB_ZSTD_REQUESTED ON) -+ set(HTTPLIB_ZSTD_REQUIRED QUIET) -+endif() -+ -+if (HTTPLIB_ZSTD_REQUESTED) -+ if (TARGET zstd::libzstd) -+ set(HTTPLIB_IS_USING_ZSTD TRUE) -+ else() -+ find_package(zstd 1.5.6 CONFIG QUIET) -+ -+ if (NOT zstd_FOUND) -+ find_package(PkgConfig ${HTTPLIB_ZSTD_REQUIRED}) -+ pkg_check_modules(zstd ${HTTPLIB_ZSTD_REQUIRED} IMPORTED_TARGET libzstd) -+ -+ if (TARGET PkgConfig::zstd) - add_library(zstd::libzstd ALIAS PkgConfig::zstd) - endif() - endif() -+ -+ # This will always be true if zstd is required. -+ # If zstd *isn't* found when zstd is set to required, -+ # CMake will error out earlier in this block. -+ set(HTTPLIB_IS_USING_ZSTD ${zstd_FOUND}) - endif() -- # Both find_package and PkgConf set a XXX_FOUND var -- set(HTTPLIB_IS_USING_ZSTD ${zstd_FOUND}) - endif() - - # Used for default, common dirs that the end-user can change (if needed) -@@ -317,13 +323,13 @@ if(HTTPLIB_COMPILE) - $ - $ - ) -- -+ - # Add C++20 module support if requested - # Include from separate file to prevent parse errors on older CMake versions - if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.28") - include(cmake/modules.cmake) - endif() -- -+ - set_target_properties(${PROJECT_NAME} - PROPERTIES - VERSION ${${PROJECT_NAME}_VERSION} diff --git a/.patch/mbedtls/0001-aesni-fix.patch b/.patch/mbedtls/0001-aesni-fix.patch new file mode 100644 index 0000000000..5587e4c22d --- /dev/null +++ b/.patch/mbedtls/0001-aesni-fix.patch @@ -0,0 +1,35 @@ +diff --git a/library/aesni.h b/library/aesni.h +index 754c984c79..59e27afd3e 100644 +--- a/library/aesni.h ++++ b/library/aesni.h +@@ -35,7 +35,7 @@ + /* GCC-like compilers: currently, we only support intrinsics if the requisite + * target flag is enabled when building the library (e.g. `gcc -mpclmul -msse2` + * or `clang -maes -mpclmul`). */ +-#if (defined(__GNUC__) || defined(__clang__)) && defined(__AES__) && defined(__PCLMUL__) ++#if defined(__GNUC__) || defined(__clang__) + #define MBEDTLS_AESNI_HAVE_INTRINSICS + #endif + /* For 32-bit, we only support intrinsics */ +diff --git a/library/aesni.c b/library/aesni.c +index 2857068..3e104ab 100644 +--- a/library/aesni.c ++++ b/library/aesni.c +@@ -31,16 +31,14 @@ + #include + #endif + +-#if defined(MBEDTLS_ARCH_IS_X86) + #if defined(MBEDTLS_COMPILER_IS_GCC) + #pragma GCC push_options + #pragma GCC target ("pclmul,sse2,aes") + #define MBEDTLS_POP_TARGET_PRAGMA +-#elif defined(__clang__) && (__clang_major__ >= 5) ++#elif defined(__clang__) + #pragma clang attribute push (__attribute__((target("pclmul,sse2,aes"))), apply_to=function) + #define MBEDTLS_POP_TARGET_PRAGMA + #endif +-#endif + + #if !defined(MBEDTLS_AES_USE_HARDWARE_ONLY) + /* diff --git a/.patch/mbedtls/0002-arm64-aes-fix.patch b/.patch/mbedtls/0002-arm64-aes-fix.patch new file mode 100644 index 0000000000..2140943426 --- /dev/null +++ b/.patch/mbedtls/0002-arm64-aes-fix.patch @@ -0,0 +1,20 @@ +diff --git a/library/common.h b/library/common.h +index 50f2a29..c60d9dc 100644 +--- a/library/common.h ++++ b/library/common.h +@@ -19,11 +19,11 @@ + #include + #include + +-#if defined(__ARM_NEON) +-#include ++#if defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64) ++#include + #define MBEDTLS_HAVE_NEON_INTRINSICS +-#elif defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64) +-#include ++#elif (defined(__ANDROID__) && defined(__ARM_FP)) || defined(__ARM_NEON) ++#include + #define MBEDTLS_HAVE_NEON_INTRINSICS + #endif + diff --git a/.patch/unordered-dense/0001-avoid-memset-when-clearing-an-empty-table.patch b/.patch/unordered-dense/0001-avoid-memset-when-clearing-an-empty-table.patch deleted file mode 100644 index f7d7c7ebe2..0000000000 --- a/.patch/unordered-dense/0001-avoid-memset-when-clearing-an-empty-table.patch +++ /dev/null @@ -1,26 +0,0 @@ -From b3622608433c183ba868a1dc8dd9cf285eb3b916 Mon Sep 17 00:00:00 2001 -From: Dario Petrillo -Date: Thu, 27 Nov 2025 23:12:38 +0100 -Subject: [PATCH] avoid extra memset when clearing an empty table - ---- - include/ankerl/unordered_dense.h | 6 ++++-- - 1 file changed, 4 insertions(+), 2 deletions(-) - -diff --git a/include/ankerl/unordered_dense.h b/include/ankerl/unordered_dense.h -index 0835342..4938212 100644 ---- a/include/ankerl/unordered_dense.h -+++ b/include/ankerl/unordered_dense.h -@@ -1490,8 +1490,10 @@ class table : public std::conditional_t, base_table_type_map, bas - // modifiers ////////////////////////////////////////////////////////////// - - void clear() { -- m_values.clear(); -- clear_buckets(); -+ if (!empty()) { -+ m_values.clear(); -+ clear_buckets(); -+ } - } - - auto insert(value_type const& value) -> std::pair { diff --git a/CMakeLists.txt b/CMakeLists.txt index 4490df21cb..175ad7c3f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,8 +32,8 @@ if (PLATFORM_OPENBSD) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R6/lib") elseif (PLATFORM_NETBSD) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include -I${CMAKE_SYSROOT}/usr/pkg/include/c++/v1") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include -I${CMAKE_SYSROOT}/usr/pkg/include/c++/v1") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R7/lib") endif() @@ -49,28 +49,35 @@ if (YUZU_STATIC_ROOM) # disable e v e r y t h i n g set(ENABLE_QT OFF) + set(ENABLE_SDL2 OFF) set(YUZU_CMD OFF) set(ENABLE_CUBEB OFF) set(ENABLE_UPDATE_CHECKER OFF) set(USE_DISCORD_PRESENCE OFF) set(BUILD_TESTING OFF) + set(ENABLE_OPENSSL OFF) set(ENABLE_WEB_SERVICE OFF) set(ENABLE_LIBUSB OFF) - # allow static libs for boost though + # allow static libs for boost and mbedtls though set(Boost_USE_STATIC_LIBS ON) set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") - set(OPENSSL_USE_STATIC_LIBS ON) + set(MBEDTLS_LIB_SUFFIX "_static") + set(YUZU_USE_CPM ON) set(zstd_FORCE_BUNDLED ON) set(fmt_FORCE_BUNDLED ON) endif() +# common network mbedtls +# common: xbyak? booost fmt lz4 zstd +# network: enet boost + # qt stuff option(ENABLE_QT "Enable the Qt frontend" ON) option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF) option(ENABLE_UPDATE_CHECKER "Enable update checker (for Qt and Android)" OFF) -cmake_dependent_option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF "NOT YUZU_USE_BUNDLED_QT" OFF) +option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF) cmake_dependent_option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF "NOT YUZU_USE_BUNDLED_QT" OFF) set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries") cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF) @@ -123,7 +130,12 @@ if (YUZU_STATIC_BUILD) set(YUZU_USE_BUNDLED_OPENSSL ON) set(HTTPLIB_USE_BROTLI_IF_AVAILABLE OFF) + + ## some libraries define a Library::Name_static alternative ## + set(MBEDTLS_LIB_SUFFIX _static) elseif(APPLE) + set(YUZU_USE_CPM ON) + set(YUZU_USE_BUNDLED_FFMPEG ON) set(YUZU_USE_BUNDLED_SDL2 ON) set(YUZU_USE_BUNDLED_OPENSSL ON) @@ -133,6 +145,7 @@ if (YUZU_STATIC_BUILD) set(SPIRV-Tools_FORCE_BUNDLED ON) set(SPIRV-Headers_FORCE_BUNDLED ON) set(zstd_FORCE_BUNDLED ON) + set(MbedTLS_FORCE_BUNDLED ON) endif() endif() @@ -170,9 +183,13 @@ if (MSVC AND NOT CXX_CLANG) set(CMAKE_CXX_FLAGS_INIT "${CMAKE_CXX_FLAGS_INIT} /W3 /WX-") endif() +# Set bundled sdl2/qt as dependent options. +# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion +cmake_dependent_option(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF) + # TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system -cmake_dependent_option(YUZU_USE_EXTERNAL_SDL2 "Build SDL2 from external source" OFF "NOT MSVC;NOT ANDROID" OFF) -cmake_dependent_option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}" "NOT ANDROID" OFF) +cmake_dependent_option(YUZU_USE_EXTERNAL_SDL2 "Build SDL2 from external source" OFF "ENABLE_SDL2;NOT MSVC" OFF) +cmake_dependent_option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}" "ENABLE_SDL2" OFF) option(ENABLE_CUBEB "Enables the cubeb audio backend" ON) @@ -181,6 +198,8 @@ if (MSVC OR ANDROID) set(EXT_DEFAULT ON) endif() +option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched." ${EXT_DEFAULT}) + # ffmpeg option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT}) cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from external source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF) @@ -215,7 +234,7 @@ option(NIGHTLY_BUILD "Use Nightly qualifiers in the update checker and build met cmake_dependent_option(YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" OFF) cmake_dependent_option(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF) -cmake_dependent_option(YUZU_CMD "Compile the eden-cli executable" ON "NOT ANDROID" OFF) +cmake_dependent_option(YUZU_CMD "Compile the eden-cli executable" ON "ENABLE_SDL2;NOT ANDROID" OFF) cmake_dependent_option(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR PLATFORM_LINUX" OFF) @@ -226,12 +245,29 @@ cmake_dependent_option(YUZU_USE_BUNDLED_MOLTENVK "Download bundled MoltenVK lib" option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF) +set(DEFAULT_ENABLE_OPENSSL ON) +if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN) + # - Windows defaults to the Schannel backend. + # - macOS defaults to the SecureTransport backend. + # - Android currently has no SSL backend as the NDK doesn't include any SSL + # library; a proper 'native' backend would have to go through Java. + # But you can force builds for those platforms to use OpenSSL if you have + # your own copy of it. + set(DEFAULT_ENABLE_OPENSSL OFF) +endif() + +if (ENABLE_WEB_SERVICE OR USE_DISCORD_PRESENCE) + set(DEFAULT_ENABLE_OPENSSL ON) +endif() + +option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL}) + set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF) -if (EXT_DEFAULT OR PLATFORM_SUN OR PLATFORM_OPENBSD) +if (EXT_DEFAULT OR PLATFORM_SUN) set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON) endif() -option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL}) +cmake_dependent_option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL} "ENABLE_OPENSSL" OFF) if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL) AddJsonPackage(vulkan-validation-layers) @@ -359,94 +395,123 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) -find_package(RenderDoc MODULE) - # openssl funniness -if (YUZU_USE_BUNDLED_OPENSSL) +if (ENABLE_OPENSSL) + if (YUZU_USE_BUNDLED_OPENSSL) + set(BUILD_SHARED_LIBS OFF) + AddJsonPackage(openssl) + if (OpenSSL_ADDED) + add_compile_definitions(YUZU_BUNDLED_OPENSSL) + endif() + endif() + + find_package(OpenSSL 1.1.1 REQUIRED) +endif() + +if (YUZU_USE_CPM) + message(STATUS "Fetching needed dependencies with CPM") + set(BUILD_SHARED_LIBS OFF) - AddJsonPackage(openssl) - if (OpenSSL_ADDED) - add_compile_definitions(YUZU_BUNDLED_OPENSSL) - endif() -endif() + set(BUILD_TESTING OFF) + set(ENABLE_TESTING OFF) -find_package(OpenSSL 3 REQUIRED) + # TODO(crueter): renderdoc? -message(STATUS "Fetching needed dependencies with CPM") + # boost + set(BOOST_INCLUDE_LIBRARIES algorithm icl pool container heap asio headers process filesystem crc variant) -set(BUILD_SHARED_LIBS OFF) -set(BUILD_TESTING OFF) -set(ENABLE_TESTING OFF) + AddJsonPackage(boost) -# boost -set(BOOST_INCLUDE_LIBRARIES algorithm icl pool container heap asio headers process filesystem crc variant) + # really annoying thing where boost::headers doesn't work with cpm + # TODO(crueter) investigate + set(BOOST_NO_HEADERS ${Boost_ADDED}) -AddJsonPackage(boost) - -# really annoying thing where boost::headers doesn't work with cpm -# TODO(crueter) investigate -set(BOOST_NO_HEADERS ${Boost_ADDED}) - -if (Boost_ADDED) - if (MSVC OR ANDROID) - add_compile_definitions(YUZU_BOOST_v1) - endif() - - if (NOT MSVC OR CXX_CLANG) - # boost sucks - if (PLATFORM_SUN) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthreads") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthreads") + if (Boost_ADDED) + if (MSVC OR ANDROID) + add_compile_definitions(YUZU_BOOST_v1) endif() - target_compile_options(boost_heap INTERFACE -Wno-shadow) - target_compile_options(boost_icl INTERFACE -Wno-shadow) - target_compile_options(boost_asio INTERFACE -Wno-conversion -Wno-implicit-fallthrough) - endif() -endif() + if (NOT MSVC OR CXX_CLANG) + # boost sucks + if (PLATFORM_SUN) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthreads") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthreads") + endif() -# fmt -AddJsonPackage(fmt) - -# lz4 -AddJsonPackage(lz4) - -if (lz4_ADDED) - add_library(lz4::lz4 ALIAS lz4_static) -endif() - -# zstd -AddJsonPackage(zstd) - -if (zstd_ADDED) - add_library(zstd::zstd ALIAS libzstd_static) - add_library(zstd::libzstd ALIAS libzstd_static) -endif() - -if (NOT YUZU_STATIC_ROOM) - # nlohmann - AddJsonPackage(nlohmann) - - # zlib - AddJsonPackage(zlib) - - if (ZLIB_ADDED) - add_library(ZLIB::ZLIB ALIAS zlibstatic) - endif() - - # Opus - AddJsonPackage(opus) - - if (Opus_ADDED) - if (MSVC AND CXX_CLANG) - target_compile_options(opus PRIVATE - -Wno-implicit-function-declaration - ) + target_compile_options(boost_heap INTERFACE -Wno-shadow) + target_compile_options(boost_icl INTERFACE -Wno-shadow) + target_compile_options(boost_asio INTERFACE -Wno-conversion -Wno-implicit-fallthrough) endif() endif() - if (NOT TARGET Opus::opus) - add_library(Opus::opus ALIAS opus) + # fmt + AddJsonPackage(fmt) + + # lz4 + AddJsonPackage(lz4) + + if (lz4_ADDED) + add_library(lz4::lz4 ALIAS lz4_static) + endif() + + # zstd + AddJsonPackage(zstd) + + if (zstd_ADDED) + add_library(zstd::zstd ALIAS libzstd_static) + add_library(zstd::libzstd ALIAS libzstd_static) + endif() + + if (NOT YUZU_STATIC_ROOM) + # nlohmann + AddJsonPackage(nlohmann) + + # zlib + AddJsonPackage(zlib) + + if (ZLIB_ADDED) + add_library(ZLIB::ZLIB ALIAS zlibstatic) + endif() + + # Opus + AddJsonPackage(opus) + + if (Opus_ADDED) + if (MSVC AND CXX_CLANG) + target_compile_options(opus PRIVATE + -Wno-implicit-function-declaration + ) + endif() + endif() + + if (NOT TARGET Opus::opus) + add_library(Opus::opus ALIAS opus) + endif() + endif() +else() + # TODO: we can probably just use CPM for this... right? + # Enforce the search mode of non-required packages for better and shorter failure messages + find_package(fmt 8 REQUIRED) + + if (NOT YUZU_DISABLE_LLVM) + find_package(LLVM MODULE COMPONENTS Demangle) + endif() + + find_package(nlohmann_json 3.8 REQUIRED) + find_package(lz4 REQUIRED) + find_package(RenderDoc MODULE) + find_package(stb MODULE) + + find_package(Opus 1.3 MODULE REQUIRED) + + find_package(ZLIB 1.2 REQUIRED) + find_package(zstd 1.5 REQUIRED MODULE) + + # wow + find_package(Boost 1.57.0 CONFIG REQUIRED OPTIONAL_COMPONENTS headers context system fiber filesystem) + + if (ENABLE_OPENSSL) + find_package(OpenSSL 1.1.1 REQUIRED) endif() endif() @@ -508,9 +573,8 @@ message(STATUS "Platform Libraries: ${PLATFORM_LIBRARIES}") add_subdirectory(externals) # pass targets from externals -# TODO(crueter): CPMUtil Propagate func? find_package(enet) -find_package(unordered_dense REQUIRED) +find_package(MbedTLS) if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64) find_package(xbyak) @@ -539,7 +603,7 @@ if (NOT YUZU_STATIC_ROOM) find_package(oaknut) endif() - if (NOT ANDROID) + if (ENABLE_SDL2) find_package(SDL2) endif() @@ -575,7 +639,7 @@ if (ENABLE_QT) list(APPEND CMAKE_PREFIX_PATH "${Qt6_DIR}") endif() - find_package(Qt6 CONFIG REQUIRED COMPONENTS Widgets Charts Concurrent) + find_package(Qt6 CONFIG REQUIRED COMPONENTS Widgets Concurrent) if (YUZU_USE_QT_MULTIMEDIA) find_package(Qt6 REQUIRED COMPONENTS Multimedia) @@ -614,7 +678,7 @@ if (ENABLE_QT) ## Components ## # Best practice is to ask for all components at once, so they are from the same version - set(YUZU_QT_COMPONENTS Core Widgets Charts Concurrent) + set(YUZU_QT_COMPONENTS Core Widgets Concurrent) if (PLATFORM_LINUX) list(APPEND YUZU_QT_COMPONENTS DBus) endif() diff --git a/CMakeModules/CPMUtil.cmake b/CMakeModules/CPMUtil.cmake index b992f24083..4c9b645d16 100644 --- a/CMakeModules/CPMUtil.cmake +++ b/CMakeModules/CPMUtil.cmake @@ -84,11 +84,7 @@ function(SystemPackageViable JSON_NAME) parse_object(${object}) string(REPLACE " " ";" find_args "${find_args}") - if (${package}_FORCE_BUNDLED) - set(${package}_FOUND OFF) - else() - find_package(${package} ${version} ${find_args} QUIET NO_POLICY_SCOPE) - endif() + find_package(${package} ${version} ${find_args} QUIET NO_POLICY_SCOPE) set(${pkg}_VIABLE ${${package}_FOUND} PARENT_SCOPE) set(${pkg}_PACKAGE ${package} PARENT_SCOPE) diff --git a/CMakeModules/GenerateSCMRev.cmake b/CMakeModules/GenerateSCMRev.cmake index 5b0adad8dd..f91a207dfd 100644 --- a/CMakeModules/GenerateSCMRev.cmake +++ b/CMakeModules/GenerateSCMRev.cmake @@ -36,17 +36,14 @@ set(GIT_DESC ${BUILD_VERSION}) # Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well # Auto-updater metadata! Must somewhat mirror GitHub API endpoint +set(BUILD_AUTO_UPDATE_WEBSITE "https://github.com") +set(BUILD_AUTO_UPDATE_API "http://api.github.com") + if (NIGHTLY_BUILD) - set(BUILD_AUTO_UPDATE_WEBSITE "https://github.com") - set(BUILD_AUTO_UPDATE_API "api.github.com") - set(BUILD_AUTO_UPDATE_API_PATH "/repos/") set(BUILD_AUTO_UPDATE_REPO "Eden-CI/Nightly") set(REPO_NAME "Eden Nightly") else() - set(BUILD_AUTO_UPDATE_WEBSITE "https://git.eden-emu.dev") - set(BUILD_AUTO_UPDATE_API "git.eden-emu.dev") - set(BUILD_AUTO_UPDATE_API_PATH "/api/v1/repos/") - set(BUILD_AUTO_UPDATE_REPO "eden-emu/eden") + set(BUILD_AUTO_UPDATE_REPO "eden-emulator/Releases") set(REPO_NAME "Eden") endif() diff --git a/README.md b/README.md index 44a2b4c28b..db52c6435d 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@


- Eden + Eden
Eden
@@ -61,10 +61,6 @@ See the [sign-up instructions](docs/SIGNUP.md) for information on registration. Alternatively, if you wish to add translations, go to the [Eden project on Transifex](https://app.transifex.com/edenemu/eden-emulator) and review [the translations README](./dist/languages). -## Documentation - -We have a user manual! See our [User Handbook](./docs/user/README.md). - ## Building See the [General Build Guide](docs/Build.md) @@ -73,9 +69,7 @@ For information on provided development tooling, see the [Tools directory](./too ## Download -You can download the latest releases from [here](https://git.eden-emu.dev/eden-emu/eden/releases). - -Save us some bandwidth! We have [mirrors available](./docs/user/ThirdParty.md#mirrors) as well. +You can download the latest releases from [here](https://github.com/eden-emulator/Releases/releases). ## Support diff --git a/cpmfile.json b/cpmfile.json index c938e67e88..80086797af 100644 --- a/cpmfile.json +++ b/cpmfile.json @@ -5,7 +5,7 @@ "name": "openssl", "repo": "crueter-ci/OpenSSL", "version": "3.6.0-1cb0d36b39", - "min_version": "3" + "min_version": "1.1.1" }, "boost": { "package": "Boost", @@ -46,9 +46,9 @@ "package": "ZLIB", "repo": "madler/zlib", "tag": "v%VERSION%", - "hash": "16fea4df307a68cf0035858abe2fd550250618a97590e202037acd18a666f57afc10f8836cbbd472d54a0e76539d0e558cb26f059d53de52ff90634bbf4f47d4", + "hash": "06eaa3a1eaaeb31f461a2283b03a91ed8eb2406e62cd97ea1c69836324909edeecd93edd03ff0bf593d9dde223e3376149134c5b1fe2e8688c258cadf8cd60ff", "version": "1.2", - "git_version": "1.3.2", + "git_version": "1.3.1.2", "options": [ "ZLIB_BUILD_SHARED OFF", "ZLIB_INSTALL OFF" @@ -98,9 +98,9 @@ "package": "VVL", "repo": "KhronosGroup/Vulkan-ValidationLayers", "tag": "vulkan-sdk-%VERSION%", - "git_version": "1.4.341.0", + "git_version": "1.4.335.0", "artifact": "android-binaries-%VERSION%.zip", - "hash": "8812ae84cbe49e6a3418ade9c458d3be6d74a3dffd319d4502007b564d580998056e8190414368ec11b27bc83993c7a0dad713c31bcc3d9553b51243efee3753" + "hash": "48167c4a17736301bd08f9290f41830443e1f18cce8ad867fc6f289b49e18b40e93c9850b377951af82f51b5b6d7313aa6a884fc5df79f5ce3df82696c1c1244" }, "quazip": { "package": "QuaZip-Qt6", diff --git a/dist/dev.eden_emu.eden.svg b/dist/dev.eden_emu.eden.svg index b125f4fb80..f88b52f625 100644 --- a/dist/dev.eden_emu.eden.svg +++ b/dist/dev.eden_emu.eden.svg @@ -6,191 +6,225 @@ viewBox="0 0 512 512" version="1.1" id="svg7" - sodipodi:docname="saintpatrick2026_named.svg" - inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)" - xml:space="preserve" - inkscape:export-filename="dev.eden_emu.eden.png" + sodipodi:docname="base.svg.2026_01_12_14_43_47.0.svg" + inkscape:version="1.4.2 (ebf0e94, 2025-05-08)" + inkscape:export-filename="base.svg.2026_01_12_14_43_47.0.svg" inkscape:export-xdpi="96" inkscape:export-ydpi="96" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:dc="http://purl.org/dc/elements/1.1/"> - - - - - - - Madeline_Dev - mailto:madelvidel@gmail.com - - - 2025 - - 2025 Eden Emulator Project - https://git.eden-emu.dev - - - + xmlns:svg="http://www.w3.org/2000/svg"> + id="defs7"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/eden.bmp b/dist/eden.bmp index 498d6f3893..2f9b91c73b 100644 Binary files a/dist/eden.bmp and b/dist/eden.bmp differ diff --git a/dist/eden.ico b/dist/eden.ico index 187013ae63..5ce1a7095f 100644 Binary files a/dist/eden.ico and b/dist/eden.ico differ diff --git a/dist/icon_variations/2025_named.svg b/dist/icon_variations/2025_named.svg new file mode 100644 index 0000000000..c374ceb63e --- /dev/null +++ b/dist/icon_variations/2025_named.svg @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/icon_variations/README.md b/dist/icon_variations/README.md index 4259f9ba39..7c444a7e04 100644 --- a/dist/icon_variations/README.md +++ b/dist/icon_variations/README.md @@ -2,7 +2,7 @@ These icons are licensed under GPLv3. Please see the [script for generating icons](../../tools/README.md) and appropriatedly redirect for seasonal icons. -- `base_named.svg` - Named variant (deprecated). +- `base_named.svg` - Named variant. - `base_small.svg`: Variant used for tiny icons (16x16, 64x64, etc). - `base.svg`: Variant without branding/naming. diff --git a/dist/icon_variations/base_named.svg b/dist/icon_variations/base_named.svg new file mode 100644 index 0000000000..37f747d0fb --- /dev/null +++ b/dist/icon_variations/base_named.svg @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/icon_variations/halloween2025_named.svg b/dist/icon_variations/halloween2025_named.svg new file mode 100644 index 0000000000..78fcaef5d9 --- /dev/null +++ b/dist/icon_variations/halloween2025_named.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/icon_variations/newyear2025_named.svg b/dist/icon_variations/newyear2025_named.svg new file mode 100644 index 0000000000..5530089e4d --- /dev/null +++ b/dist/icon_variations/newyear2025_named.svg @@ -0,0 +1,684 @@ + + + + + + New Year 2025 Logo + + + Madeline_Dev + mailto:madelvidel@gmail.com + + + 2025 + + 2025 Eden Emulator Project + https://git.eden-emu.dev + + + + diff --git a/dist/icon_variations/original_named.svg b/dist/icon_variations/original_named.svg new file mode 100644 index 0000000000..127bd05ae1 --- /dev/null +++ b/dist/icon_variations/original_named.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + diff --git a/dist/icon_variations/saintpatrick2026.svg b/dist/icon_variations/saintpatrick2026.svg deleted file mode 100644 index b125f4fb80..0000000000 --- a/dist/icon_variations/saintpatrick2026.svg +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - Madeline_Dev - mailto:madelvidel@gmail.com - - - 2025 - - 2025 Eden Emulator Project - https://git.eden-emu.dev - - - - diff --git a/dist/icon_variations/saintpatrick2026_bgcolor b/dist/icon_variations/saintpatrick2026_bgcolor deleted file mode 100644 index 5fc9cb0b37..0000000000 --- a/dist/icon_variations/saintpatrick2026_bgcolor +++ /dev/null @@ -1 +0,0 @@ -#3cce5bff \ No newline at end of file diff --git a/dist/icon_variations/valentines2026.svg b/dist/icon_variations/valentines2026.svg deleted file mode 100644 index 7a68ed3e67..0000000000 --- a/dist/icon_variations/valentines2026.svg +++ /dev/null @@ -1,211 +0,0 @@ - - - - - - - - - Madeline_Dev - mailto:madelvidel@gmail.com - - - 2025 - - 2025 Eden Emulator Project - https://git.eden-emu.dev - - - - diff --git a/dist/icon_variations/valentines2026_bgcolor b/dist/icon_variations/valentines2026_bgcolor deleted file mode 100644 index d6377400f2..0000000000 --- a/dist/icon_variations/valentines2026_bgcolor +++ /dev/null @@ -1 +0,0 @@ -#e48cc9ff diff --git a/dist/qt_themes/default/icons/256x256/eden.png b/dist/qt_themes/default/icons/256x256/eden.png index fbee9f1836..2fb04d8bc2 100644 Binary files a/dist/qt_themes/default/icons/256x256/eden.png and b/dist/qt_themes/default/icons/256x256/eden.png differ diff --git a/dist/qt_themes/default/icons/256x256/eden_named.png b/dist/qt_themes/default/icons/256x256/eden_named.png new file mode 100644 index 0000000000..a349ac7ac8 Binary files /dev/null and b/dist/qt_themes/default/icons/256x256/eden_named.png differ diff --git a/docs/Caveats.md b/docs/Caveats.md index d554f3ff77..ed98f602d8 100644 --- a/docs/Caveats.md +++ b/docs/Caveats.md @@ -85,13 +85,11 @@ If you have `quazip1_qt6_devel`, uninstall it. It may call `Core5Compat` on CMak ## OpenBSD -System boost doesn't have `context` (as of 7.8); so you may need to specify `-DYUZU_USE_CPM=ON -DBoost_FORCE_BUNDLED=ON`. - After configuration, you may need to modify `externals/ffmpeg/CMakeFiles/ffmpeg-build/build.make` to use `-j$(nproc)` instead of just `-j`. `-lc++-experimental` doesn't exist in OpenBSD but the LLVM driver still tries to link against it, to solve just symlink `ln -s /usr/lib/libc++.a /usr/lib/libc++experimental.a`. Builds are currently not working due to lack of `std::jthread` and such, either compile libc++ manually or wait for ports to catch up. -If clang has errors, try using `g++11`. +If clang has errors, try using `g++-11`. ## FreeBSD @@ -107,8 +105,6 @@ hw.usb.usbhid.enable="0" ## NetBSD -2026-02-07: `vulkan-headers` must not be installed, since the version found in `pkgsrc` is older than required. Either wait for binary packages to update or build newer versions from source. - Install `pkgin` if not already `pkg_add pkgin`, see also the general [pkgsrc guide](https://www.netbsd.org/docs/pkgsrc/using.html). For NetBSD 10.1 provide `echo 'PKG_PATH="https://cdn.netbsd.org/pub/pkgsrc/packages/NetBSD/amd64/10.1/All/"' >/etc/pkg_install.conf`. If `pkgin` is taking too much time consider adding the following to `/etc/rc.conf`: ```sh @@ -118,7 +114,7 @@ ip6addrctl_policy=ipv4_prefer System provides a default `g++-10` which doesn't support the current C++ codebase; install `clang-19` with `pkgin install clang-19`. Or install `gcc14` (or `gcc15` with current pkgsrc). Provided that, the following CMake commands may work: -- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -Bbuild` (Recommended) +- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -Bbuild` - `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/pkg/gcc14/bin/gcc -DCMAKE_CXX_COMPILER=/usr/pkg/gcc14/bin/g++ -Bbuild` - `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/pkg/gcc15/bin/gcc -DCMAKE_CXX_COMPILER=/usr/pkg/gcc15/bin/g++ -Bbuild` @@ -140,12 +136,8 @@ cmake --install build However, pkgsrc is highly recommended, see [getting pkgsrc](https://iso.us.netbsd.org/pub/pkgsrc/current/pkgsrc/doc/pkgsrc.html#getting). You must get `current` not the `2025Q2` version. -`QtCore` on NetBSD is included, but due to misconfigurations(!) we MUST include one of the standard headers that include `bits/c++config.h`, since source_location (required by `QtCore`) isn't properly configured to intake `bits/c++config.h` (none of the experimental library is). This is a bug with NetBSD packaging and not our fault, but alas. - ## DragonFlyBSD -2026-02-07: `vulkan-headers` and `vulkan-utility-libraries` must NOT be uninstalled, since they're too old: `1.3.289`. Either wait for binary packages to update or build newer versions from source. - If `libstdc++.so.6` is not found (`GLIBCXX_3.4.30`) then attempt: ```sh diff --git a/docs/Debug.md b/docs/Debug.md index f384918fe2..3fc3bc9fee 100644 --- a/docs/Debug.md +++ b/docs/Debug.md @@ -22,25 +22,17 @@ Debug logs can be found in General -> Debug -> Open Log Location on desktop, and Ignoring SIGSEGV when debugging in host: -- **gdb**: `handle SIGSEGV nostop pass`. +- **gdb**: `handle all nostop pass`. - **lldb**: `pro hand -p true -s false -n false SIGSEGV`. ## Debugging (guest code) ### gdb -You must have GDB installed for aarch64 to debug the target. Install it through your package manager, e.g.: -* On Arch: - * `sudo pacman -Syu aarch64-linux-gnu-gdb` -* On Gentoo: - * `sudo emerge --ask crossdev` - * `sudo crossdev -t aarch64-unknown-linux-gnu --ex-gdb` - Run `./build/bin/eden-cli -c -d -g ` -Or `Enable GDB Stub` at General > Debug, then hook up an aarch64-gdb: -* `target remote localhost:6543` -Type `c` (for continue) and then if it crashes just do a `bt` (backtrace) and `layout asm` +Then hook up an aarch64-gdb (use `yay aarch64-gdb` or `sudo pkg in arch64-gdb` to install) +Then type `target remote localhost:1234` and type `c` (for continue) - and then if it crashes just do a `bt` (backtrace) and `layout asm`. ### gdb cheatsheet diff --git a/docs/Deps.md b/docs/Deps.md index fe1f7a14b2..689d12800a 100644 --- a/docs/Deps.md +++ b/docs/Deps.md @@ -51,11 +51,12 @@ All other dependencies will be downloaded and built by [CPM](https://github.com/ * [fmt](https://fmt.dev/) 8.0.1+ * [lz4](http://www.lz4.org) * [nlohmann\_json](https://github.com/nlohmann/json) 3.8+ -* [OpenSSL](https://www.openssl.org/source/) 3+ +* [OpenSSL](https://www.openssl.org/source/) 1.1.1+ * [ZLIB](https://www.zlib.net/) 1.2+ * [zstd](https://facebook.github.io/zstd/) 1.5+ * [enet](http://enet.bespin.org/) 1.3+ * [Opus](https://opus-codec.org/) 1.3+ +* [MbedTLS](https://github.com/Mbed-TLS/mbedtls) 3+ Vulkan 1.3.274+ is also needed: @@ -120,7 +121,7 @@ sudo emerge -a \ dev-util/vulkan-utility-libraries dev-util/glslang \ media-gfx/renderdoc media-libs/libva media-libs/opus media-video/ffmpeg \ media-libs/VulkanMemoryAllocator media-libs/libsdl2 media-libs/cubeb \ - net-libs/enet \ + net-libs/enet net-libs/mbedtls \ sys-libs/zlib \ dev-cpp/nlohmann_json dev-cpp/simpleini dev-cpp/cpp-httplib dev-cpp/cpp-jwt \ games-util/gamemode \ @@ -138,6 +139,7 @@ Required USE flags: * `dev-qt/qtbase network concurrent dbus gui widgets` * `dev-libs/quazip qt6` +* `net-libs/mbedtls cmac` * `media-libs/libsdl2 haptic joystick sound video` * `dev-cpp/cpp-httplib ssl` @@ -149,7 +151,7 @@ Required USE flags: Arch Linux ```sh -sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 ninja nlohmann-json openssl opus qt6-base qt6-multimedia qt6-charts sdl2 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers +sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 mbedtls ninja nlohmann-json openssl opus qt6-base qt6-multimedia sdl2 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers ``` * Building with QT Web Engine requires `qt6-webengine` as well. @@ -162,7 +164,7 @@ sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glsl Ubuntu, Debian, Mint Linux ```sh -sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev qt6-charts-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl2-dev libopus-dev libasound2t64 vulkan-utility-libraries-dev +sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev libmbedtls-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl2-dev libopus-dev libasound2t64 vulkan-utility-libraries-dev ``` * Ubuntu 22.04, Linux Mint 20, or Debian 12 or later is required. @@ -176,7 +178,7 @@ sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev l Fedora: ```sh -sudo dnf install autoconf cmake fmt-devel gcc{,-c++} glslang hidapi-devel json-devel libtool libusb1-devel libzstd-devel lz4-devel nasm ninja-build openssl-devel pulseaudio-libs-devel qt6-linguist qt6-qtbase{-private,}-devel qt6-qtwebengine-devel qt6-qtmultimedia-devel qt6-charts-devel speexdsp-devel wayland-devel zlib-devel ffmpeg-devel libXext-devel boost jq +sudo dnf install autoconf cmake fmt-devel gcc{,-c++} glslang hidapi-devel json-devel libtool libusb1-devel libzstd-devel lz4-devel nasm ninja-build openssl-devel pulseaudio-libs-devel qt6-linguist qt6-qtbase{-private,}-devel qt6-qtwebengine-devel qt6-qtmultimedia-devel speexdsp-devel wayland-devel zlib-devel ffmpeg-devel libXext-devel boost jq ``` AlmaLinux (use `YUZU_USE_CPM=ON`): @@ -209,15 +211,17 @@ First, enable the community repository; [see here](https://wiki.alpinelinux.org/ # Enable the community repository setup-apkrepos -c # Install -apk add g++ git cmake make mesa-dev qt6-qtbase-dev qt6-qtbase-private-dev libquazip1-qt6 ffmpeg-dev qt6-charts-dev libusb-dev libtool boost-dev sdl2-dev zstd-dev vulkan-utility-libraries spirv-tools-dev openssl-dev nlohmann-json lz4-dev opus-dev jq patch +apk add g++ git cmake make mbedtls-dev mbedtls-static mesa-dev qt6-qtbase-dev qt6-qtbase-private-dev libquazip1-qt6 ffmpeg-dev libusb-dev libtool boost-dev sdl2-dev zstd-dev vulkan-utility-libraries spirv-tools-dev openssl-dev nlohmann-json lz4-dev opus-dev jq patch ``` +`mbedtls-static` has to be specified otherwise `libeverest.a` and `libp256m.a` will fail to be found. +
Void Linux ```sh -xbps-install -Su git make cmake clang pkg-config patch SPIRV-Tools-devel SPIRV-Headers lz4 liblz4-devel boost-devel ffmpeg6-devel catch2 Vulkan-Utility-Libraries Vulkan-Headers glslang openssl-devel SDL2-devel quazip-qt6-devel qt6-base-devel qt6-qt5compat-devel qt6-charts-devel fmt-devel json-c++ libenet-devel libusb-devel +xbps-install -Su git make cmake clang pkg-config patch mbedtls-devel SPIRV-Tools-devel SPIRV-Headers lz4 liblz4-devel boost-devel ffmpeg6-devel catch2 Vulkan-Utility-Libraries Vulkan-Headers glslang openssl-devel SDL2-devel quazip-qt6-devel qt6-base-devel qt6-qt5compat-devel fmt-devel json-c++ libenet-devel libusb-devel ``` Yes, `nlohmann-json` is just named `json-c++`. Why? @@ -229,8 +233,6 @@ Yes, `nlohmann-json` is just named `json-c++`. Why? A convenience script is provided on the root of this project [shell.nix](../shell.nix). Run the usual `nix-shell`. -If you're going for a pure build (i.e no downloaded deps), use `-DYUZU_USE_CPM=ON -DCPMUTIL_FORCE_SYSTEM=ON`. -
macOS @@ -255,7 +257,7 @@ brew install molten-vk
FreeBSD -As root run: `pkg install devel/cmake devel/sdl20 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/qt6-charts devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/unordered-dense vulkan-headers quazip-qt6` +As root run: `pkg install devel/cmake devel/sdl20 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/unordered-dense mbedtls3 vulkan-headers quazip-qt6` If using FreeBSD 12 or prior, use `devel/pkg-config` instead. @@ -265,7 +267,7 @@ If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
NetBSD -For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv-headers spirv-tools ffmpeg7 libva nlohmann-json jq libopus qt6 cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx`. +For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv-headers spirv-tools ffmpeg7 libva nlohmann-json jq libopus qt6 mbedtls3 cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx`. [Caveats](./Caveats.md#netbsd). @@ -275,7 +277,7 @@ For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv ```sh pkg_add -u -pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gmake qt6 jq fmt nlohmann-json enet boost vulkan-utility-libraries vulkan-headers spirv-headers spirv-tools catch2 sdl2 libusb1-1.0.29 +pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gmake llvm-19.1.7p3 qt6 jq fmt nlohmann-json enet boost vulkan-utility-libraries vulkan-headers spirv-headers spirv-tools catch2 sdl2 libusb1-1.0.27 ``` [Caveats](./Caveats.md#openbsd). @@ -285,7 +287,7 @@ pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gm DragonFlyBSD ```sh -pkg install gcc14 git cmake unzip nasm autoconf bash pkgconf ffmpeg glslang gmake jq nlohmann-json enet spirv-tools sdl2 vulkan-utility-libraries vulkan-headers catch2 libfmt openssl liblz4 boost-libs cpp-httplib qt6-base qt6-charts quazip-qt6 unordered-dense libva-vdpau-driver libva-utils libva-intel-driver +pkg install gcc14 git cmake unzip nasm autoconf bash pkgconf ffmpeg glslang gmake jq nlohmann-json enet spirv-tools sdl2 vulkan-utility-libraries vulkan-headers catch2 libfmt openssl liblz4 boost-libs cpp-httplib qt6-base quazip-qt6 unordered-dense libva-vdpau-driver libva-utils libva-intel-driver ``` [Caveats](./Caveats.md#dragonflybsd). @@ -309,7 +311,7 @@ sudo pkg install qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json ope ```sh BASE="git make autoconf libtool automake-wrapper jq patch" -MINGW="qt6-base qt6-charts qt6-tools qt6-translations qt6-svg cmake toolchain clang python-pip openssl vulkan-memory-allocator vulkan-devel glslang boost fmt lz4 nlohmann-json zlib zstd enet opus libusb unordered_dense openssl SDL2" +MINGW="qt6-base qt6-tools qt6-translations qt6-svg cmake toolchain clang python-pip openssl vulkan-memory-allocator vulkan-devel glslang boost fmt lz4 nlohmann-json zlib zstd enet opus mbedtls libusb unordered_dense openssl SDL2" # Either x86_64 or clang-aarch64 (Windows on ARM) packages="$BASE" for pkg in $MINGW; do @@ -335,7 +337,7 @@ pacman -Syuu --needed --noconfirm $packages HaikuOS ```sh -pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel +pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel mbedtls3_devel glslang qt6_devel ``` [Caveats](./Caveats.md#haikuos). diff --git a/docs/Development.md b/docs/Development.md index eb9f4159b5..062bc140d9 100644 --- a/docs/Development.md +++ b/docs/Development.md @@ -82,15 +82,15 @@ You may additionally need the `Qt Extension Pack` extension if building Qt. # Build speedup -If you have an HDD, use ramdisk (build in RAM), approximatedly you need 4GB for a full build with debug symbols: +If you have an HDD, use ramdisk (build in RAM): ```sh -mkdir /tmp/ramdisk -chmod 777 /tmp/ramdisk +sudo mkdir /tmp/ramdisk +sudo chmod 777 /tmp/ramdisk # about 8GB needed -mount -t tmpfs -o size=4G myramdisk /tmp/ramdisk +sudo mount -t tmpfs -o size=8G myramdisk /tmp/ramdisk cmake -B /tmp/ramdisk cmake --build /tmp/ramdisk -- -j32 -umount /tmp/ramdisk +sudo umount /tmp/ramdisk ``` # Assets and large files diff --git a/docs/Options.md b/docs/Options.md deleted file mode 100644 index 55aead805f..0000000000 --- a/docs/Options.md +++ /dev/null @@ -1,100 +0,0 @@ -# CMake Options - -To change these options, add `-DOPTION_NAME=NEWVALUE` to the command line. - -- On Qt Creator, go to Project -> Current Configuration - -Notes: - -- Defaults are marked per-platform. -- "Non-UNIX" just means Windows/MSVC and Android (yes, macOS is UNIX -- Android generally doesn't need to change anything; if you do, go to `src/android/app/build.gradle.kts` -- To set a boolean variable to on, use `ON` for the value; to turn it off, use `OFF` -- If a variable is mentioned as being e.g. "ON" for a specific platform(s), that means it is defaulted to OFF on others -- TYPE is always boolean unless otherwise specified -- Format: - - `OPTION_NAME` (TYPE DEFAULT) DESCRIPTION - -## Options - -### Dependencies - -These options control dependencies. - -- `YUZU_USE_BUNDLED_FFMPEG` (ON for non-UNIX) Download a pre-built and configured FFmpeg -- `YUZU_USE_EXTERNAL_FFMPEG` (ON for Solaris) Build FFmpeg from source -- `YUZU_DOWNLOAD_ANDROID_VVL` (ON) Download validation layer binary for Android -- `YUZU_DOWNLOAD_TIME_ZONE_DATA` (ON) Always download time zone binaries - - Currently, build fails without this -- `YUZU_TZDB_PATH` (string) Path to a pre-downloaded timezone database (useful for nixOS and Gentoo) -- `YUZU_USE_BUNDLED_MOLTENVK` (ON, macOS only) Download bundled MoltenVK lib -- `YUZU_USE_BUNDLED_OPENSSL` (ON for MSVC, Android, Solaris, and OpenBSD) Download bundled OpenSSL build -- `YUZU_USE_EXTERNAL_SDL2` (OFF) Compiles SDL2 from source -- `YUZU_USE_BUNDLED_SDL2` (ON for MSVC) Download a prebuilt SDL2 - -### Miscellaneous - -- `ENABLE_WEB_SERVICE` (ON) Enable multiplayer service -- `ENABLE_WIFI_SCAN` (OFF) Enable WiFi scanning (requires iw on Linux) - experimental -- `ENABLE_CUBEB` (ON) Enables the cubeb audio backend - - This option is subject for removal. -- `YUZU_TESTS` (ON) Compile tests - requires Catch2 -- `ENABLE_LTO` (OFF) Enable link-time optimization - - Not recommended on Windows - - UNIX may be better off appending `-flto=thin` to compiler args -- `USE_FASTER_LINKER` (OFF) Check if a faster linker is available - - Not recommended outside of Linux - -### Flavors - -These options control executables and build flavors. - -- `YUZU_LEGACY` (OFF): Apply patches to improve compatibility on some older GPUs at the cost of performance -- `NIGHTLY_BUILD` (OFF): This is only used by CI. Do not use this unless you're making your own distribution and know what you're doing. -- `YUZU_STATIC_BUILD` (OFF) Attempt to build using static libraries if possible - - Not supported on Linux - - Automatically set if `YUZU_USE_BUNDLED_QT` is on for non-Linux -- `ENABLE_UPDATE_CHECKER` (OFF) Enable update checking functionality -- `YUZU_DISABLE_LLVM` (OFF) Do not attempt to link to the LLVM demangler - - Really only useful for CI or distribution builds - -**Desktop only**: - -- `YUZU_CMD` (ON) Compile the SDL2 frontend (eden-cli) -- `YUZU_ROOM` (OFF) Compile dedicated room functionality into the main executable -- `YUZU_ROOM_STANDALONE` (OFF) Compile a separate executable for room functionality -- `YUZU_STATIC_ROOM` (OFF) Compile the room executable *only* as a static, portable executable - - This is only usable on Alpine Linux. - -### Desktop - -The following options are desktop only. - -- `ENABLE_LIBUSB` (ON) Enable the use of the libusb input frontend (HIGHLY RECOMMENDED) -- `ENABLE_OPENGL` (ON) Enable the OpenGL graphics frontend - - Unavailable on Windows/ARM64 - - You probably shouldn't turn this off. - -### Qt - -Also desktop-only, but apply strictly to Qt - -- `ENABLE_QT` (ON) Enable the Qt frontend (recommended) -- `ENABLE_QT_TRANSLATION` (OFF) Enable translations for the Qt frontend -- `YUZU_USE_BUNDLED_QT` (ON for MSVC) Download bundled Qt binaries - - Not recommended on Linux. For Windows and macOS, the provided build is statically linked. -- `YUZU_QT_MIRROR` (string) What mirror to use for downloading the bundled Qt libraries -- `YUZU_USE_QT_MULTIMEDIA` (OFF) Use QtMultimedia for camera support -- `YUZU_USE_QT_WEB_ENGINE` (OFF) Use QtWebEngine for web applet implementation (requires the huge QtWebEngine dependency; not recommended) -- `USE_DISCORD_PRESENCE` (OFF) Enables Discord Rich Presence (Qt frontend only) - -### Retired Options - -The following options were a part of Eden at one point, but have since been retired. - -- `ENABLE_OPENSSL` - MbedTLS was fully replaced with OpenSSL in [#3606](https://git.eden-emu.dev/eden-emu/eden/pulls/3606), because OpenSSL straight-up performs better. -- `ENABLE_SDL2` - While technically possible to *not* use SDL2 on desktop, this is **NOT** a supported configuration under any means, and adding this matrix to our build system was not worth the effort. -- `YUZU_USE_CPM` - This option once had a purpose, but that purpose has long since passed us by. *All* builds use CPMUtil to manage dependencies now. - - If you want to *force* the usage of system dependencies, use `-DCPMUTIL_FORCE_SYSTEM=ON`. - -See `src/dynarmic/CMakeLists.txt` for additional options--usually, these don't need changed diff --git a/docs/README.md b/docs/README.md index 4ea532be8e..5af1ac8345 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,11 +1,8 @@ # Eden Build Documentation -Are you just a casual user? Take a look at our [User Handbook](./user) then! - This contains documentation created by developers. This contains build instructions, guidelines, instructions/layouts for [cool stuff we made](./CPMUtil), and more. - **[General Build Instructions](Build.md)** -- **[CMake Options](Options.md)** - **[Cross Compiling](CrossCompile.md)** - **[Development Guidelines](Development.md)** - **[Dependencies](Deps.md)** @@ -13,6 +10,7 @@ This contains documentation created by developers. This contains build instructi - **[CPM - CMake Package Manager](./CPMUtil)** - **[Platform-Specific Caveats](Caveats.md)** - **[The NVIDIA SM86 (Maxwell) GPU](./NvidiaGpu.md)** +- **[User Handbook](./user)** - **[Dynarmic](./dynarmic)** - **[Cross compilation](./CrossCompile.md)** - **[Driver Bugs](./DriverBugs.md)** diff --git a/docs/SIGNUP.md b/docs/SIGNUP.md index 5e5f7cebf6..6995db6d9a 100644 --- a/docs/SIGNUP.md +++ b/docs/SIGNUP.md @@ -18,7 +18,7 @@ First of all, you MUST have a valid reason to sign up for our Git. Valid reasons The following are not valid reasons to sign up: - I want to contribute to Eden. - * Be at least somewhat specific! We always welcome contributors and developers, but generic "I want to contribute" messages don't give us enough information. + * Be at least somewhat specific! - I want to support Eden. * If you wish to support us through development, be more specific; otherwise, to support us, check out our [donations page](https://eden-emu.dev/donations). - I want to report issues. @@ -41,36 +41,17 @@ Email: I wish to sign up because... ``` -Email notifications are disabled for the time being, so you don't have to use a real email. If you wish to remain anonymous, either send a separate email asking for access to a shared anonymous account, *or* create a fake username and email. Do note that the email you sign up with is used to accredit commits on the web UI, and *must* match your configured GPG key. - -## Patches - -In general, PRs are the preferred method of tracking patches, as they allow us to go through our standard triage, CI, and testing process without having to deal with the minutiae of incremental patches. However, we also understand that many people prefer to use raw patches, and that's totally okay! While we currently don't have a mailing list, we do accept email patches. To do so: - -1. Make your changes on a clean copy of the master branch -2. Commit your changes with a descriptive, well-formed message (see the [commit message docs](https://git.eden-emu.dev/eden-emu/eden/src/branch/master/docs/Development.md#pull-requests)), and a proper description thoroughly explaining your changes. - * Note that we don't need to know all the individual details about your code. A description explaining the motivation and general implementation of your changes is enough, alongside caveats and any potential blockers. -3. Format your patch with `git format-patch -1 HEAD`. -4. Email us with the subject `[Eden] [PATCH] `, with a brief description of your patch, and the previously-formatted patch file as an attachment. - * If you don't include the first two bracketed parts, your email may be lost! - -The following emails are currently set up to receive and process patches: - -- [eden@eden-emu.dev](mailto:eden@eden-emu.dev] -- [crueter@eden-emu.dev](mailto:eden@eden-emu.dev) +Email notifications are disabled for the time being, so you don't have to use a real email. If you wish to remain anonymous, either send a separate email asking for access to a shared anonymous account, *or* create a fake username and email. ## Instructions If you have read everything above and affirm that you will not abuse your access, click the summary below to get the email to send your request to.
-I affirm that I have read ALL of the information above, and will not abuse my access to Eden, nor will I send unnecessary spam to the following email. +I affirm that I have read ALL of the information above, and will not abuse my access to Eden, nor will I send unnecessary spam requests or the following email. Email [crueter@crueter.xyz](mailto:crueter@crueter.xyz) with the format above. Once your request is processed, you should receive a confirmation email from crueter with your password alongside a link to a repository containing instructions on SSH, etc. Note that you are required to change your password. If your request is rejected, you will receive a notice as such, asking for clarification if needed. If you do not receive a response in 48 hours, you may send another email. -> [!WARNING] -> Some email providers may place the response email in your spam/junk folder; notable offenders include Gmail and Outlook. *Always* ensure to check your Spam/Junk folder, until Google/Microsoft finally end their vendetta against the great evil of my `.xyz` domain. - -
+
\ No newline at end of file diff --git a/docs/dynarmic/Design.md b/docs/dynarmic/Design.md index 020cfd65bd..8c6c1929b2 100644 --- a/docs/dynarmic/Design.md +++ b/docs/dynarmic/Design.md @@ -286,6 +286,15 @@ Exclusive OR (i.e.: XOR) Memory access. +### Terminal: Interpret + +```c++ +SetTerm(IR::Term::Interpret{next}) +``` + +This terminal instruction calls the interpreter, starting at `next`. +The interpreter must interpret exactly one instruction. + ### Terminal: ReturnToDispatch ```c++ diff --git a/docs/dynarmic/README.md b/docs/dynarmic/README.md index bfba7c9cb0..a97d36680d 100644 --- a/docs/dynarmic/README.md +++ b/docs/dynarmic/README.md @@ -117,6 +117,11 @@ public: MemoryWrite32(vaddr + 4, u32(value >> 32)); } + void InterpreterFallback(u32 pc, size_t num_instructions) override { + // This is never called in practice. + std::terminate(); + } + void CallSVC(u32 swi) override { // Do something. } diff --git a/docs/policies/AI.md b/docs/policies/AI.md index 719548f4c8..1618420a11 100644 --- a/docs/policies/AI.md +++ b/docs/policies/AI.md @@ -17,9 +17,7 @@ AI is notorious for hallucinating facts out of thin air and sometimes outright l - Code that works, but is extraordinarily verbose or not nearly as efficient as it can be - Code that works well and is written well, but solves a different problem than was intended, or solves the same problem but in a completely incorrect way that will break other things horribly. -Human-written code will, without exception, always be of infinitely higher quality when properly researched and implemented by someone familiar with *both* the surrounding code and the programming language in use. LLMs may produce a "good enough" result, but this result is often subpar. - -**All code is held under a STRICT STANDARD OF EXCELLENCE**. AI code is no different, and since it often produces subpar or outright terrible code, it will often fail to meet this excellence standard. +Human-written code will, without exception, always be of infinitely higher quality when properly researched and implemented by someone both familiar with the surrounding code and the programming language in use. LLMs may produce a "good enough" result, but this result is often subpar. Keep in mind: all code is held under a standard of excellence. If your code sucks, it will be rejected. AI-generated code just so happens to be a particularly sucky genre of code, and will thus be held to this same standard. On a lesser-known note, LLM outputs often contain unicode symbols such as emojis or the arrow symbol. Please don't put Unicode symbols in your code. It messes with many an IDE, and the three people viewing your code on Lynx will be very unhappy. @@ -27,8 +25,7 @@ On a lesser-known note, LLM outputs often contain unicode symbols such as emojis ## Acceptable Use -As stated previously, AI is good in a few *very specific* cases. In these cases, it's usually fine to use AI, as long as you **explicitly provide notice that it was used**. - +- As stated previously, AI is good in a few *very specific* cases. In these cases, it's usually fine to use AI, as long as you **explicitly provide notice that it was used**. - Anything directly outside of the realm of the code written in your PR or patch is none of our business. - This primarily covers research. - However, we *still* strongly discourage this for the reasons mentioned above. @@ -107,6 +104,4 @@ This consolidates profile removal behavior, fixes potential race conditions in t This has all of the same problems as the other one. Needlessly verbose, doesn't address *what* it actually fixes ("consolidates profile removal behavior"... okay, why? What does it fix?), etc. It even has the bonus of totally hallucinating the addition of a method! -On a more "philosophical" note, LLMs tend to be geared towards *corporate language*, as that's what they're trained on. This is why AI-generated commit messages feel like "word salad", and typically pad out the commit message to make it *look* like a lot of things were changed (trust me, it's like that in the corporate world). They typically also drift towards unneeded buzzwords and useless implementation details. - **Don't use AI for commit messages**. diff --git a/docs/user/SteamROM.md b/docs/user/AddEdenToSRM.md similarity index 50% rename from docs/user/SteamROM.md rename to docs/user/AddEdenToSRM.md index a782b51969..4658bcf7e0 100644 --- a/docs/user/SteamROM.md +++ b/docs/user/AddEdenToSRM.md @@ -1,6 +1,4 @@ -# User Handbook - Configuring Steam ROM Manager - -## Importing Eden into Steam with Steam Rom Manager +# Importing Eden into Steam with Steam Rom Manager Use this when you want to import the Eden AppImage into your Steam Library along with artwork using *Steam ROM Manager.* @@ -8,7 +6,7 @@ Use this when you want to import the Eden AppImage into your Steam Library along --- -#### Pre-Requisites +### Pre-Requisites - Eden set up and configured - Internet Connection @@ -16,9 +14,9 @@ Use this when you want to import the Eden AppImage into your Steam Library along --- -### Steps +## Steps -#### Initial Setup +### Initial Setup 1. Press the **STEAM** button and then go to *Power → Switch to Desktop* to enter the Desktop mode. @@ -26,14 +24,14 @@ Use this when you want to import the Eden AppImage into your Steam Library along --- - #### Manual Installation + ### Manual Installation 1. Open the *Discover Store* and search for *Steam ROM Manager.* 2. Select the **Install** button to install the program. --- - #### Installing Through *EmuDeck* + ### Installing Through *EmuDeck*