diff --git a/.ci/linux/build.sh b/.ci/linux/build.sh
index 093b30a7ea..114df7051b 100755
--- a/.ci/linux/build.sh
+++ b/.ci/linux/build.sh
@@ -3,43 +3,53 @@
# SPDX-FileCopyrightText: 2025 eden Emulator Project
# SPDX-License-Identifier: GPL-3.0-or-later
-export ARCH="$(uname -m)"
-
case "$1" in
- amd64|"")
- echo "Making amd64-v3 optimized build of Eden"
- ARCH="amd64_v3"
- ARCH_FLAGS="-march=x86-64-v3"
- ;;
- steamdeck)
- echo "Making Steam Deck (Zen 2) optimized build of Eden"
- ARCH="steamdeck"
- ARCH_FLAGS="-march=znver2 -mtune=znver2"
- ;;
- rog-ally|allyx)
- echo "Making ROG Ally X (Zen 4) optimized build of Eden"
- ARCH="rog-ally-x"
- ARCH_FLAGS="-march=znver3 -mtune=znver4" # GH actions runner is a Zen 3 CPU, so a small workaround
- ;;
- legacy)
- echo "Making amd64 generic build of Eden"
- ARCH=amd64
- ARCH_FLAGS="-march=x86-64 -mtune=generic"
- ;;
- aarch64)
- echo "Making armv8-a build of Eden"
- ARCH=aarch64
- ARCH_FLAGS="-march=armv8-a -mtune=generic -w"
- ;;
- armv9)
- echo "Making armv9-a build of Eden"
- ARCH=armv9
- ARCH_FLAGS="-march=armv9-a -mtune=generic -w"
- ;;
- *)
- echo "Invalid target $1 specified, must be one of amd64, steamdeck, allyx, rog-ally, legacy, aarch64, armv9"
- exit 1
- ;;
+amd64 | "")
+ echo "Making amd64-v3 optimized build of Eden"
+ ARCH="amd64_v3"
+ ARCH_FLAGS="-march=x86-64-v3"
+ export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=v3)
+ ;;
+steamdeck | zen2)
+ echo "Making Steam Deck (Zen 2) optimized build of Eden"
+ ARCH="steamdeck"
+ ARCH_FLAGS="-march=znver2 -mtune=znver2"
+ export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=zen2 -DYUZU_SYSTEM_PROFILE=steamdeck)
+ ;;
+rog-ally | allyx | zen4)
+ echo "Making ROG Ally X (Zen 4) optimized build of Eden"
+ ARCH="rog-ally-x"
+ ARCH_FLAGS="-march=znver4 -mtune=znver4"
+ export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=zen2 -DYUZU_SYSTEM_PROFILE=steamdeck)
+ ;;
+legacy)
+ echo "Making amd64 generic build of Eden"
+ ARCH=amd64
+ ARCH_FLAGS="-march=x86-64 -mtune=generic"
+ export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=generic)
+ ;;
+aarch64)
+ echo "Making armv8-a build of Eden"
+ ARCH=aarch64
+ ARCH_FLAGS="-march=armv8-a -mtune=generic -w"
+ export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=generic)
+ ;;
+armv9)
+ echo "Making armv9-a build of Eden"
+ ARCH=armv9
+ ARCH_FLAGS="-march=armv9-a -mtune=generic -w"
+ export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=armv9)
+ ;;
+native)
+ echo "Making native build of Eden"
+ ARCH="$(uname -m)"
+ ARCH_FLAGS="-march=native -mtune=native"
+ export EXTRA_CMAKE_FLAGS=(-DYUZU_BUILD_PRESET=native)
+ ;;
+*)
+ echo "Invalid target $1 specified, must be one of native, amd64, steamdeck, zen2, allyx, rog-ally, zen4, legacy, aarch64, armv9"
+ exit 1
+ ;;
esac
export ARCH_FLAGS="$ARCH_FLAGS -O3"
@@ -51,10 +61,10 @@ fi
if [ "$1" != "" ]; then shift; fi
if [ "$TARGET" = "appimage" ]; then
- export EXTRA_CMAKE_FLAGS=(-DCMAKE_INSTALL_PREFIX=/usr -DYUZU_ROOM=ON -DYUZU_ROOM_STANDALONE=OFF -DYUZU_CMD=OFF)
+ export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DCMAKE_INSTALL_PREFIX=/usr -DYUZU_ROOM=ON -DYUZU_ROOM_STANDALONE=OFF -DYUZU_CMD=OFF)
else
# For the linux-fresh verification target, verify compilation without PCH as well.
- export EXTRA_CMAKE_FLAGS=(-DYUZU_USE_PRECOMPILED_HEADERS=OFF)
+ export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" -DYUZU_USE_PRECOMPILED_HEADERS=OFF)
fi
if [ "$DEVEL" != "true" ]; then
@@ -82,7 +92,7 @@ export EXTRA_CMAKE_FLAGS=("${EXTRA_CMAKE_FLAGS[@]}" $@)
mkdir -p build && cd build
cmake .. -G Ninja \
-DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
- -DENABLE_QT_TRANSLATION=ON \
+ -DENABLE_QT_TRANSLATION=ON \
-DUSE_DISCORD_PRESENCE=ON \
-DCMAKE_CXX_FLAGS="$ARCH_FLAGS" \
-DCMAKE_C_FLAGS="$ARCH_FLAGS" \
@@ -95,12 +105,12 @@ cmake .. -G Ninja \
-DYUZU_USE_QT_WEB_ENGINE=$WEBENGINE \
-DYUZU_USE_FASTER_LD=ON \
-DYUZU_ENABLE_LTO=ON \
- "${EXTRA_CMAKE_FLAGS[@]}"
+ "${EXTRA_CMAKE_FLAGS[@]}"
ninja -j${NPROC}
if [ -d "bin/Release" ]; then
- strip -s bin/Release/*
+ strip -s bin/Release/*
else
- strip -s bin/*
+ strip -s bin/*
fi
diff --git a/.ci/linux/package.sh b/.ci/linux/package.sh
index 21fd72cb08..911fea2f7b 100755
--- a/.ci/linux/package.sh
+++ b/.ci/linux/package.sh
@@ -16,11 +16,11 @@ case "$1" in
echo "Packaging amd64-v3 optimized build of Eden"
ARCH="amd64_v3"
;;
- steamdeck)
+ steamdeck|zen2)
echo "Packaging Steam Deck (Zen 2) optimized build of Eden"
ARCH="steamdeck"
;;
- rog-ally|allyx)
+ rog-ally|allyx|zen4)
echo "Packaging ROG Ally X (Zen 4) optimized build of Eden"
ARCH="rog-ally-x"
;;
@@ -36,6 +36,11 @@ case "$1" in
echo "Packaging armv9-a build of Eden"
ARCH=armv9
;;
+ native)
+ echo "Packaging native build of Eden"
+ ARCH="$BASE_ARCH"
+ ;;
+
esac
export BUILDDIR="$2"
@@ -87,7 +92,6 @@ chmod +x ./sharun-aio
xvfb-run -a ./sharun-aio l -p -v -e -s -k \
../$BUILDDIR/bin/eden* \
$LIBDIR/lib*GL*.so* \
- $LIBDIR/libSDL2*.so* \
$LIBDIR/dri/* \
$LIBDIR/vdpau/* \
$LIBDIR/libvulkan* \
diff --git a/.ci/windows/cygwin.bat b/.ci/windows/cygwin.bat
deleted file mode 100755
index e772780fac..0000000000
--- a/.ci/windows/cygwin.bat
+++ /dev/null
@@ -1,19 +0,0 @@
-echo off
-
-call C:\tools\cygwin\cygwinsetup.exe -q -P autoconf,automake,libtool,make,pkg-config
-
-REM Create wrapper batch files for Cygwin tools in a directory that will be in PATH
-REM uncomment this for first-run only
-REM call mkdir C:\cygwin-wrappers
-
-REM Create autoconf.bat wrapper
-call echo @echo off > C:\cygwin-wrappers\autoconf.bat
-call echo C:\tools\cygwin\bin\bash.exe -l -c "autoconf %%*" >> C:\cygwin-wrappers\autoconf.bat
-
-REM Add other wrappers if needed for other Cygwin tools
-call echo @echo off > C:\cygwin-wrappers\automake.bat
-call echo C:\tools\cygwin\bin\bash.exe -l -c "automake %%*" >> C:\cygwin-wrappers\automake.bat
-
-REM Add the wrappers directory to PATH
-call echo C:\cygwin-wrappers>>"%GITHUB_PATH%"
-call echo C:\tools\cygwin\bin>>"%GITHUB_PATH%"
diff --git a/.ci/windows/install-vulkan-sdk.ps1 b/.ci/windows/install-vulkan-sdk.ps1
index de218d90ad..ca8c64b5cd 100755
--- a/.ci/windows/install-vulkan-sdk.ps1
+++ b/.ci/windows/install-vulkan-sdk.ps1
@@ -3,7 +3,7 @@
$ErrorActionPreference = "Stop"
-$VulkanSDKVer = "1.3.250.1"
+$VulkanSDKVer = "1.4.321.1"
$ExeFile = "VulkanSDK-$VulkanSDKVer-Installer.exe"
$Uri = "https://sdk.lunarg.com/sdk/download/$VulkanSDKVer/windows/$ExeFile"
$Destination = "./$ExeFile"
diff --git a/.ci/windows/qt-envvars.sh b/.ci/windows/qt-envvars.sh
deleted file mode 100755
index ec314b863f..0000000000
--- a/.ci/windows/qt-envvars.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-# This is specific to the CI runner and is unlikely to work on your machine.
-QTDIR="/c/Qt/6.9.0/msvc2022_64"
-
-export QT_ROOT_DIR="$QTDIR"
-export QT_PLUGIN_PATH="$QTDIR/plugins"
-export QML2_IMPORT_PATH="$QTDIR/qml"
-export PATH="${PATH};$QTDIR/bin"
\ No newline at end of file
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 941f94ae26..ac67f73d00 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -2,9 +2,9 @@
# some stuff needs cleaned up etc
name: eden-build
-on:
- push:
- branches: [ "master" ]
+#on:
+# push:
+# branches: [ "master" ]
# TODO: combine build.yml into trigger_release.yml
jobs:
diff --git a/.github/workflows/trigger_release.yml b/.github/workflows/trigger_release.yml
index 638ab3424b..645b21e25a 100644
--- a/.github/workflows/trigger_release.yml
+++ b/.github/workflows/trigger_release.yml
@@ -1,8 +1,8 @@
name: Build Application and Make Release
-on:
- push:
- tags: [ "*" ]
+#on:
+# push:
+# tags: [ "*" ]
permissions:
contents: write
diff --git a/.gitignore b/.gitignore
index 4417d3f132..83881117ac 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,7 +5,7 @@
# SPDX-License-Identifier: GPL-3.0-or-later
# Build directory
-[Bb]uild*/
+/[Bb]uild*/
doc-build/
AppDir/
uruntime
diff --git a/.gitmodules b/.gitmodules
index 1a6e6574a3..c8fcad98ec 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -12,13 +12,10 @@
url = https://github.com/KhronosGroup/Vulkan-Headers.git
[submodule "xbyak"]
path = externals/xbyak
- url = https://github.com/herumi/xbyak.git
+ url = https://github.com/Lizzie841/xbyak.git
[submodule "opus"]
path = externals/opus
url = https://github.com/xiph/opus.git
-[submodule "SDL"]
- path = externals/SDL
- url = https://github.com/libsdl-org/SDL.git
[submodule "cpp-httplib"]
path = externals/cpp-httplib
url = https://github.com/yhirose/cpp-httplib.git
@@ -49,9 +46,6 @@
[submodule "externals/dynarmic/externals/unordered_dense"]
path = externals/dynarmic/externals/unordered_dense
url = https://github.com/Lizzie841/unordered_dense.git
-[submodule "externals/dynarmic/externals/xbyak"]
- path = externals/dynarmic/externals/xbyak
- url = https://github.com/herumi/xbyak.git
[submodule "externals/dynarmic/externals/zycore-c"]
path = externals/dynarmic/externals/zycore-c
url = https://github.com/zyantific/zycore-c.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index cf6b1a9cfe..ebe363c3f0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,9 +33,9 @@ endif()
option(ENABLE_SDL2 "Enable the SDL2 frontend" ON)
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" ON "ENABLE_SDL2;MSVC" OFF)
if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
- CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "ENABLE_SDL2;NOT MSVC" OFF)
+ CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "ENABLE_SDL2;NOT MSVC" OFF)
else()
- CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ON "ENABLE_SDL2;NOT MSVC" OFF)
+ CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" ON "ENABLE_SDL2;NOT MSVC" OFF)
endif()
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF)
@@ -50,6 +50,7 @@ option(ENABLE_QT_UPDATE_CHECKER "Enable update checker for the Qt frontend" OFF)
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
+option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF)
if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
option(YUZU_USE_BUNDLED_FFMPEG "Download/Build bundled FFmpeg" OFF)
@@ -60,7 +61,7 @@ endif()
if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" OFF)
else()
- option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" ON)
+ option(YUZU_USE_EXTERNAL_VULKAN_HEADERS "Use Vulkan-Headers from externals" ON)
endif()
if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
@@ -122,7 +123,7 @@ CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available
CMAKE_DEPENDENT_OPTION(USE_SYSTEM_MOLTENVK "Use the system MoltenVK lib (instead of the bundled one)" OFF "APPLE" ON)
set(DEFAULT_ENABLE_OPENSSL ON)
-if (ANDROID OR WIN32 OR APPLE)
+if (ANDROID OR WIN32 OR APPLE OR ${CMAKE_SYSTEM_NAME} STREQUAL "SunOS")
set(DEFAULT_ENABLE_OPENSSL OFF)
endif()
option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL})
@@ -331,6 +332,41 @@ if (YUZU_ROOM)
add_definitions(-DYUZU_ROOM)
endif()
+# Build/optimization presets
+if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
+ if (ARCHITECTURE_x86_64)
+ set(YUZU_BUILD_PRESET "generic" CACHE STRING "Build preset to use. One of: generic, v3, zen2, zen4, native")
+ if (${YUZU_BUILD_PRESET} STREQUAL "generic")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64 -mtune=generic")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64 -mtune=generic")
+ elseif (${YUZU_BUILD_PRESET} STREQUAL "v3")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=x86-64-v3 -mtune=generic")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=x86-64-v3 -mtune=generic")
+ elseif (${YUZU_BUILD_PRESET} STREQUAL "zen2")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=znver2 -mtune=znver2")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=znver2 -mtune=znver2")
+ elseif (${YUZU_BUILD_PRESET} STREQUAL "zen4")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=znver4 -mtune=znver4")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=znver4 -mtune=znver4")
+ elseif (${YUZU_BUILD_PRESET} STREQUAL "native")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native -mtune=native")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=native -mtune=native")
+ endif()
+ elseif(ARCHITECTURE_arm64)
+ set(YUZU_BUILD_PRESET "generic" CACHE STRING "Build preset to use. One of: generic, armv9")
+ if (${YUZU_BUILD_PRESET} STREQUAL "generic")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv8-a -mtune=generic")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv8-a -mtune=generic")
+ elseif (${YUZU_BUILD_PRESET} STREQUAL "armv9")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv9-a -mtune=generic")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv9-a -mtune=generic")
+ endif()
+ endif()
+endif()
+
+# Other presets, e.g. steamdeck
+set(YUZU_SYSTEM_PROFILE "generic" CACHE STRING "CMake and Externals profile to use. One of: generic, steamdeck")
+
# Configure C++ standard
# ===========================
@@ -346,7 +382,7 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
# Enforce the search mode of non-required packages for better and shorter failure messages
find_package(enet 1.3 MODULE)
find_package(fmt 8 REQUIRED)
-find_package(LLVM 17.0.2 MODULE COMPONENTS Demangle)
+find_package(LLVM MODULE COMPONENTS Demangle)
find_package(lz4 REQUIRED)
find_package(nlohmann_json 3.8 REQUIRED)
find_package(Opus 1.3 MODULE)
@@ -414,11 +450,12 @@ if(ENABLE_OPENSSL)
find_package(OpenSSL 1.1.1 REQUIRED)
endif()
-if (UNIX AND NOT APPLE)
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID)
find_package(gamemode 1.7 MODULE)
endif()
# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package
+# TODO(crueter): combine this all with CPM.
if (ENABLE_SDL2)
if (YUZU_USE_BUNDLED_SDL2)
# Detect toolchain and platform
diff --git a/README.md b/README.md
index 3cf94390fb..8e8c769070 100644
--- a/README.md
+++ b/README.md
@@ -9,14 +9,13 @@
-
+
Eden
-Eden is the world's most popular open-source Nintendo Switch emulator, forked from the Yuzu emulator — started by former Citron developer Camille LaVey and the Eden team.
-
+Eden is an open-source Nintendo Switch emulator, forked from the Yuzu emulator — started by former Citron developer Camille LaVey and the Eden team.
It is written in C++ with portability in mind, and we actively maintain builds for Windows, Linux and Android.
@@ -54,13 +53,16 @@ You can also contact any of the developers on Discord to learn more about the cu
## Building
-* **Windows**: [Windows Building Guide](https://git.eden-emu.dev/eden-emu/eden/wiki/Building-for-Windows.-)
-* **Linux**: [Linux Building Guide](https://git.eden-emu.dev/eden-emu/eden/wiki/Building-for-Linux.-)
-* **Android**: [Android Building Guide](https://git.eden-emu.dev/eden-emu/eden/wiki/Building-for-Android.-)
+* **Windows**: [Windows Building Guide](./docs/build/Windows.md)
+* **Linux**: [Linux Building Guide](./docs/build/Linux.md)
+* **Android**: [Android Building Guide](./docs/build/Android.md)
+* **Solaris**: [Solaris Building Guide](./docs/build/Solaris.md)
+* **FreeBSD**: [FreeBSD Building Guide](./docs/build/FreeBSD.md)
+* **macOS**: [macOS Building Guide](./docs/build/macOS.md)
## Download
-You will be able to download the latest releases from [here](https://github.com/eden-emulator/Releases/releases).
+You can download the latest releases from [here](https://github.com/eden-emulator/Releases/releases).
## Support
@@ -73,7 +75,7 @@ Any donations received will go towards things such as:
* Additional hardware (e.g. GPUs as needed to improve rendering support, other peripherals to add support for, etc.)
* CI Infrastructure
-If you would prefer to support us in a different way, please join our [Discord](https://discord.gg/edenemu), once public, and talk to Camille or any of our other developers.
+If you would prefer to support us in a different way, please join our [Discord](https://discord.gg/edenemu) and talk to Camille or any of our other developers.
## License
diff --git a/docs/Development.md b/docs/Development.md
new file mode 100644
index 0000000000..4f17bf6977
--- /dev/null
+++ b/docs/Development.md
@@ -0,0 +1,174 @@
+# Development
+
+* **Windows**: [Windows Building Guide](./docs/build/Windows.md)
+* **Linux**: [Linux Building Guide](./docs/build/Linux.md)
+* **Android**: [Android Building Guide](./docs/build/Android.md)
+* **Solaris**: [Solaris Building Guide](./docs/build/Solaris.md)
+* **FreeBSD**: [FreeBSD Building Guide](./docs/build/FreeBSD.md)
+* **macOS**: [macOS Building Guide](./docs/build/macOS.md)
+
+# Building speedup
+
+If you have an HDD, use ramdisk (build in RAM):
+```sh
+sudo mkdir /tmp/ramdisk
+sudo chmod 777 /tmp/ramdisk
+# about 10GB needed
+sudo mount -t tmpfs -o size=10G myramdisk /tmp/ramdisk
+cmake -B /tmp/ramdisk
+cmake --build /tmp/ramdisk -- -j32
+sudo umount /tmp/ramdisk
+```
+
+# How to test JIT
+
+## gdb
+
+Run `./build/bin/eden-cli -c -d -g `
+
+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
+
+- `mo `: Monitor commands, `get info`, `get fastmem` and `get mappings` are available.
+- `detach`: Detach from remote (i.e restarting the emulator).
+- `c`: Continue
+- `p `: Print variable, `p/x ` for hexadecimal.
+- `r`: Run
+- `bt`: Print backtrace
+- `info threads`: Print all active threads
+- `thread `: Switch to the given thread (see `info threads`)
+- `layout asm`: Display in assembly mode (TUI)
+- `si`: Step assembly instruction
+- `s` or `step`: Step over LINE OF CODE (not assembly)
+- `display `: Display variable each step.
+- `n`: Next (skips over call frame of a function)
+- `frame `: Switches to the given frame (from `bt`)
+- `br `: Set breakpoint at ``.
+- `delete`: Deletes all breakpoints.
+- `catch throw`: Breakpoint at throw. Can also use `br __cxa_throw`
+
+Expressions can be `variable_names` or `1234` (numbers) or `*var` (dereference of a pointer) or `*(1 + var)` (computed expression).
+
+For more information type `info gdb` and read [the man page](https://man7.org/linux/man-pages/man1/gdb.1.html).
+
+## Bisecting older commits
+
+Since going into the past can be tricky (especially due to the dependencies from the project being lost thru time). This should "restore" the URLs for the respective submodules.
+
+```sh
+#!/bin/sh
+cat > .gitmodules < externals/dynarmic/src/dynarmic/common/x64_disassemble.cpp <
+#include
+#include
+namespace Dynarmic::Common {
+void DumpDisassembledX64(const void* ptr, size_t size) {}
+std::vector DisassembleX64(const void* ptr, size_t size) { return {}; }
+}
+EOF
+```
+
+If having issues with older artifacts, then run `rm -r externals/dynarmic/build externals/dynarmic/externals externals/nx_tzdb/tzdb_to_nx/externals externals/sirit/externals`.
+
+Configuring CMake with `-DSIRIT_USE_SYSTEM_SPIRV_HEADERS=1 -DCMAKE_CXX_FLAGS="-Wno-error" -DCMAKE_C_FLAGS="-Wno-error -Wno-array-parameter -Wno-stringop-overflow"` is also recommended.
+
diff --git a/docs/build/Android.md b/docs/build/Android.md
new file mode 100644
index 0000000000..4bb1c868b6
--- /dev/null
+++ b/docs/build/Android.md
@@ -0,0 +1,42 @@
+# Note: These build instructions are a work-in-progress.
+
+## Dependencies
+* [Android Studio](https://developer.android.com/studio)
+* [NDK 25.2.9519653 and CMake 3.22.1](https://developer.android.com/studio/projects/install-ndk#default-version)
+* [Git](https://git-scm.com/download)
+
+### WINDOWS ONLY - Additional Dependencies
+ * **[Visual Studio 2022 Community](https://visualstudio.microsoft.com/downloads/)** - **Make sure to select "Desktop development with C++" support in the installer. Make sure to update to the latest version if already installed.**
+ * **[Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows)** - **Make sure to select Latest SDK.**
+ - A convenience script to install the latest SDK is provided in `.ci\windows\install-vulkan-sdk.ps1`.
+
+## Cloning Eden with Git
+```
+git clone --recursive https://git.eden-emu.dev/eden-emu/eden.git
+```
+Eden by default will be cloned into -
+* `C:\Users\\eden` on Windows
+* `~/eden` on Linux
+* And wherever on macOS
+
+## Building
+1. Start Android Studio, on the startup dialog select `Open`.
+2. Navigate to the `eden/src/android` directory and click on `OK`.
+3. In `Build > Select Build Variant`, select `release` or `relWithDebInfo` as the "Active build variant".
+4. Build the project with `Build > Make Project` or run it on an Android device with `Run > Run 'app'`.
+
+## Building with Terminal
+1. Download the SDK and NDK from Android Studio.
+2. Navigate to SDK and NDK paths.
+3. Then set ANDROID_SDK_ROOT and ANDROID_NDK_ROOT in terminal via
+`export ANDROID_SDK_ROOT=path/to/sdk`
+`export ANDROID_NDK_ROOT=path/to/ndk`.
+4. Navigate to `eden/src/android`.
+5. Then Build with `./gradlew assemblerelWithDebInfo`.
+6. To build the optimised build use `./gradlew assembleGenshinSpoofRelWithDebInfo`.
+
+### Script
+A convenience script for building is provided in `.ci/android/build.sh`. The built APK can be put into an `artifacts` directory via `.ci/android/package.sh`. On Windows, these must be done in the Git Bash or MinGW terminal.
+
+### Additional Resources
+https://developer.android.com/studio/intro
diff --git a/docs/build/FreeBSD.md b/docs/build/FreeBSD.md
new file mode 100644
index 0000000000..9e95a6d143
--- /dev/null
+++ b/docs/build/FreeBSD.md
@@ -0,0 +1,81 @@
+## One word of caution before proceeding.
+This is not the usual or preferred way to build programs on FreeBSD.
+As of writing there is no official fresh port available for eden-emu, but it is in the works.
+After it is available you can find a link to the eden-emu fresh port here and on Escarys github repo.
+See this build as an App Image alternative for FreeBSD.
+
+## Dependencies.
+Before we start we need some dependencies.
+These dependencies are generally needed to build eden-emu on FreeBSD.
+
+```
+devel/cmake
+devel/sdl20
+devel/boost-libs
+devel/catch2
+devel/libfmt
+devel/nlohmann-json
+devel/ninja
+devel/nasm
+devel/autoconf
+devel/pkg-config
+devel/qt6-base
+
+multimedia/ffnvcodec-headers
+multimedia/ffmpeg
+
+audio/opus
+
+archivers/liblz4
+
+lang/gcc12
+
+graphics/glslang
+graphics/vulkan-utility-libraries
+```
+
+---
+
+### Build preparations:
+Run the following command to clone eden with git:
+```sh
+git clone --recursive https://git.eden-emu.dev/eden-emu/eden
+```
+You usually want to add the `--recursive` parameter as it also takes care of the external dependencies for you.
+
+Now change into the eden directory and create a build directory there:
+```sh
+cd eden
+mkdir build
+```
+
+Change into that build directory:
+```sh
+cd build
+```
+
+Now choose one option either 1 or 2, but not both as one option overwrites the other.
+
+#### 1. Building in Release Mode (usually preferred and the most performant choice):
+```sh
+cmake .. -GNinja -DYUZU_TESTS=OFF
+```
+
+#### 2. Building in Release Mode with debugging symbols (useful if you want to debug errors for a eventual fix):
+```sh
+cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_TESTS=ON
+```
+
+Build the emulator locally:
+```sh
+ninja
+```
+
+Optional: If you wish to install eden globally onto your system issue the following command:
+```sh
+sudo ninja install
+```
+OR
+```sh
+doas -- ninja install
+```
diff --git a/docs/build/Linux.md b/docs/build/Linux.md
new file mode 100644
index 0000000000..4aad874ac2
--- /dev/null
+++ b/docs/build/Linux.md
@@ -0,0 +1,135 @@
+### Dependencies
+
+You'll need to download and install the following to build Eden:
+
+ * [GCC](https://gcc.gnu.org/) v11+ (for C++20 support) & misc
+ * If GCC 12 is installed, [Clang](https://clang.llvm.org/) v14+ is required for compiling
+ * [CMake](https://www.cmake.org/) 3.22+
+
+The following are handled by Eden's externals:
+
+ * [FFmpeg](https://ffmpeg.org/)
+ * [SDL2](https://www.libsdl.org/download-2.0.php) 2.0.18+
+ * [opus](https://opus-codec.org/downloads/)
+
+All other dependencies will be downloaded by [vcpkg](https://vcpkg.io/) if needed:
+
+ * [Boost](https://www.boost.org/users/download/) 1.79.0+
+ * [Catch2](https://github.com/catchorg/Catch2) 2.13.7 - 2.13.9
+ * [fmt](https://fmt.dev/) 8.0.1+
+ * [lz4](http://www.lz4.org) 1.8+
+ * [nlohmann_json](https://github.com/nlohmann/json) 3.8+
+ * [OpenSSL](https://www.openssl.org/source/)
+ * [ZLIB](https://www.zlib.net/) 1.2+
+ * [zstd](https://facebook.github.io/zstd/) 1.5+
+
+If an ARM64 build is intended, export `VCPKG_FORCE_SYSTEM_BINARIES=1`.
+
+Dependencies are listed here as commands that can be copied/pasted. Of course, they should be inspected before being run.
+
+- Arch / Manjaro:
+ - `sudo pacman -Syu --needed base-devel boost catch2 cmake ffmpeg fmt git glslang libzip lz4 mbedtls ninja nlohmann-json openssl opus qt6-base qt6-multimedia sdl2 zlib zstd zip unzip`
+ - Building with QT Web Engine requires `qt6-webengine` as well.
+ - Proper wayland support requires `qt6-wayland`
+ - GCC 11 or later is required.
+- Ubuntu / Linux Mint / Debian:
+ - `sudo apt-get install autoconf cmake g++-11 gcc-11 git glslang-tools libasound2 libboost-context-dev 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 qtbase6-dev qtbase6-private-dev qtwebengine6-dev qtmultimedia6-dev libmbedtls-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev`
+ - Ubuntu 22.04, Linux Mint 20, or Debian 12 or later is required.
+ - Users need to manually specify building with QT Web Engine enabled. This is done using the parameter `-DYUZU_USE_QT_WEB_ENGINE=ON` when running CMake.
+ - Users need to manually specify building with GCC 11. This can be done by adding the parameters `-DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11` when running CMake. i.e.
+ - Users need to manually disable building SDL2 from externals if they intend to use the version provided by their system by adding the parameters `-DYUZU_USE_EXTERNAL_SDL2=OFF`
+
+```
+git submodule update --init --recursive
+cmake .. -GNinja -DCMAKE_C_COMPILER=gcc-11 -DCMAKE_CXX_COMPILER=g++-11
+```
+
+- Fedora:
+ - `sudo dnf install autoconf ccache 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 qt5-linguist qt5-qtbase{-private,}-devel qt5-qtwebengine-devel qt5-qtmultimedia-devel speexdsp-devel wayland-devel zlib-devel ffmpeg-devel libXext-devel`
+ - Fedora 32 or later is required.
+ - Due to GCC 12, Fedora 36 or later users need to install `clang`, and configure CMake to use it via `-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang`
+ - CMake arguments to force system libraries:
+ - SDL2: `-DYUZU_USE_BUNDLED_SDL2=OFF -DYUZU_USE_EXTERNAL_SDL2=OFF`
+ - FFmpeg: `-DYUZU_USE_EXTERNAL_FFMPEG=OFF`
+ - [RPM Fusion](https://rpmfusion.org/) (free) is required to install `ffmpeg-devel`
+
+### Cloning Eden with Git
+
+**Master:**
+
+ ```bash
+ git clone --recursive https://git.eden-emu.dev/eden-emu/eden
+ cd eden
+ ```
+
+The `--recursive` option automatically clones the required Git submodules.
+
+### Building Eden in Release Mode (Optimised)
+
+If you need to run ctests, you can disable `-DYUZU_TESTS=OFF` and install Catch2.
+
+```bash
+mkdir build && cd build
+cmake .. -GNinja -DYUZU_TESTS=OFF
+ninja
+sudo ninja install
+```
+You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON` after `cmake ..`
+
+`-DYUZU_USE_EXTERNAL_VULKAN_SPIRV_TOOLS=OFF` might be needed if ninja command failed with `undefined reference to symbol 'spvOptimizerOptionsCreate`, reason currently unknown
+
+Optionally, you can use `cmake-gui ..` to adjust various options (e.g. disable the Qt GUI).
+
+### Building Eden in Debug Mode (Slow)
+
+```bash
+mkdir build && cd build
+cmake .. -GNinja -DCMAKE_BUILD_TYPE=Debug -DYUZU_TESTS=OFF
+ninja
+```
+
+### Building with debug symbols
+
+```bash
+mkdir build && cd build
+cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU -DYUZU_TESTS=OFF
+ninja
+```
+
+### Building with Scripts
+A convenience script for building is provided in `.ci/linux/build.sh`. You must provide an arch target for optimization, e.g. `.ci/linux/build.sh amd64`. Valid targets:
+- `legacy`: x86_64 generic, only needed for CPUs older than 2013 or so
+- `amd64`: x86_64-v3, for CPUs newer than 2013 or so
+- `steamdeck` / `zen2`: For Steam Deck or Zen >= 2 AMD CPUs (untested on Intel)
+- `rog-ally` / `allyx` / `zen4`: For ROG Ally X or Zen >= 4 AMD CPUs (untested on Intel)
+- `aarch64`: For armv8-a CPUs, older than mid-2021 or so
+- `armv9`: For armv9-a CPUs, newer than mid-2021 or so
+- `native`: Optimize to your native host architecture
+
+Extra flags to pass to CMake should be passed after the arch target.
+
+Additional environment variables can be used to control building:
+- `NPROC`: Number of threads to use for compilation (defaults to all)
+- `TARGET`: Set to `appimage` to disable standalone `eden-cli` and `eden-room` executables
+- `BUILD_TYPE`: Sets the build type to use. Defaults to `Release`
+
+The following environment variables are boolean flags. Set to `true` to enable or `false` to disable:
+- `DEVEL` (default FALSE): Disable Qt update checker
+- `USE_WEBENGINE` (default FALSE): Enable Qt WebEngine
+- `USE_MULTIMEDIA` (default TRUE): Enable Qt Multimedia
+
+After building, an AppImage can be packaged via `.ci/linux/package.sh`. This script takes the same arch targets as the build script. If the build was created in a different directory, you can specify its path relative to the source directory, e.g. `.ci/linux/package.sh amd64 build-appimage`. Additionally, set the `DEVEL` environment variable to `true` to change the app name to `Eden Nightly`.
+
+### Running without installing
+
+After building, the binaries `eden` and `eden-cmd` (depending on your build options) will end up in `build/bin/`.
+
+ ```bash
+ # SDL
+ cd build/bin/
+ ./eden-cmd
+
+ # Qt
+ cd build/bin/
+ ./eden
+ ```
diff --git a/docs/build/Solaris.md b/docs/build/Solaris.md
new file mode 100644
index 0000000000..c7daa2279b
--- /dev/null
+++ b/docs/build/Solaris.md
@@ -0,0 +1,94 @@
+# Building for Solaris
+
+## Dependencies.
+Always consult [the OpenIndiana package list](https://pkg.openindiana.org/hipster/en/index.shtml) to cross-verify availability.
+
+Run the usual update + install of essential toolings: `sudo pkg update && sudo pkg install git cmake`.
+
+- **gcc**: `sudo pkg install developer/gcc-14`.
+- **clang**: Version 20 is broken, use `sudo pkg install developer/clang-19`.
+
+Then install the libraies: `sudo pkg install qt6 boost glslang libzip library/lz4 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm`.
+
+fmtlib is not available on repositories and has to be manually built:
+```sh
+git clone --recurisve --depth=1 https://github.com/fmtlib/fmt.git
+cd fmt
+cmake -DCMAKE_BUILD_TYPE=Release -B build
+cmake --build build
+sudo cmake --install build
+```
+
+pkg lz4 doesn't provide a proper CMakeFile to find the library, has to also be manually built:
+```sh
+git clone --depth=1 https://github.com/lz4/lz4.git
+cd lz4
+gmake
+sudo gmake install
+```
+
+Same goes for zstd:
+```sh
+git clone --depth=1 https://github.com/facebook/zstd.git
+cd zstd
+cmake -DCMAKE_BUILD_TYPE=Release -B build0 -S build/cmake
+cmake --build build0
+cd build0
+sudo gmake install
+```
+
+pkg SDL2 is also not nice to work with on CMake, save yourself some pain and compile it yourself:
+```sh
+git clone --depth=1 --branch=release-2.32.8 https://github.com/libsdl-org/SDL
+cmake -DCMAKE_BUILD_TYPE=Release -B build
+cmake --build build
+sudo cmake --install build
+```
+
+Audio is broken in OpenIndiana [see this issue](https://github.com/libsdl-org/SDL/issues/13405), go into `SDL/CMakeLists.txt` and comment out lines 1468:
+```diff
++# set(SDL_AUDIO_DRIVER_SUNAUDIO 1)
++# file(GLOB SUN_AUDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sun/*.c)
++# list(APPEND SOURCE_FILES ${SUN_AUDIO_SOURCES})
++# set(HAVE_SDL_AUDIO TRUE)
+```
+For Solaris this issue does not exist - however PulseAudio crashes on Solaris - so use a different backend.
+
+---
+
+### Build preparations:
+Run the following command to clone eden with git:
+```sh
+git clone --recursive https://git.eden-emu.dev/eden-emu/eden
+```
+You usually want to add the `--recursive` parameter as it also takes care of the external dependencies for you.
+
+Now change into the eden directory and create a build directory there:
+```sh
+cd eden
+mkdir build
+```
+
+Change into that build directory: `cd build`
+
+Now choose one option either 1 or 2, but not both as one option overwrites the other.
+
+### Building
+
+```sh
+# Needed for some dependencies that call cc directly (tz)
+echo '#!/bin/sh' >cc
+echo 'gcc $@' >>cc
+chmod +x cc
+export PATH="$PATH:$PWD"
+```
+
+- **Configure**: `cmake -B build -DYUZU_TESTS=OFF -DYUZU_USE_BUNDLED_SDL2=OFF -DYUZU_USE_EXTERNAL_SDL2=OFF -DYUZU_USE_LLVM_DEMANGLE=OFF -DYUZU_USE_QT_MULTIMEDIA=OFF -DYUZU_USE_QT_WEB_ENGINE=OFF -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_USE_BUNDLED_QT=OFF -DENABLE_QT=OFF -DSDL_AUDIO=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_QT_UPDATE_CHECKER=OFF`.
+- **Build**: `cmake --build build`.
+- **Installing**: `sudo cmake --install build`.
+
+### Notes
+
+- Modify the generated ffmpeg.make (in build dir) if using multiple threads (base system `make` doesn't use `-j4`, so change for `gmake`).
+- If using OpenIndiana, due to a bug in SDL2 cmake configuration; Audio driver defaults to SunOS ``, which does not exist on OpenIndiana.
+- Enabling OpenSSL requires compiling OpenSSL manually instead of using the provided one from repositores.
diff --git a/docs/build/Windows.md b/docs/build/Windows.md
new file mode 100644
index 0000000000..117398ea09
--- /dev/null
+++ b/docs/build/Windows.md
@@ -0,0 +1,195 @@
+# THIS GUIDE IS INTENDED FOR DEVELOPERS ONLY, SUPPORT WILL ONLY BE GIVEN IF YOU'RE A DEVELOPER.
+
+## Method I: MSVC Build for Windows
+
+### Minimal Dependencies
+
+On Windows, all library dependencies are automatically included within the `externals` folder, or can be downloaded on-demand. To build Eden, you need to install:
+
+ * **[Visual Studio 2022 Community](https://visualstudio.microsoft.com/downloads/)** - **Make sure to select C++ support in the installer. Make sure to update to the latest version if already installed.**
+ * **[CMake](https://cmake.org/download/)** - Used to generate Visual Studio project files. Does not matter if either 32-bit or 64-bit version is installed.
+ * **[Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows)** - **Make sure to select Latest SDK.**
+ - A convenience script to install the latest SDK is provided in `.ci\windows\install-vulkan-sdk.ps1`.
+
+ 
+
+ * **Git** - We recommend [Git for Windows](https://gitforwindows.org).
+
+ 
+
+ * While installing Git Bash, you should tell it to include Git in your system path. (Choose the "Git from the command line and also from 3rd-party software" option.) If you missed that, don't worry, you'll just have to manually tell CMake where your git.exe is, since it's used to include version info into the built executable.
+
+ 
+
+### Cloning Eden with Git
+
+**Master:**
+ ```cmd
+ git clone --recursive https://git.eden-emu.dev/eden-emu/eden
+ cd eden
+ ```
+
+ 
+
+* *(Note: eden by default downloads to `C:\Users\\eden` (Master)
+
+### Building
+
+* Open the CMake GUI application and point it to the `eden` (Master)
+
+ 
+
+* For the build directory, use a `/build` subdirectory inside the source directory or some other directory of your choice. (Tell CMake to create it.)
+
+* Click the "Configure" button and choose `Visual Studio 17 2022`, with `x64` for the optional platform.
+
+ 
+
+ * *(Note: If you used GitHub's own app to clone, run `git submodule update --init --recursive` to get the remaining dependencies)*
+
+* If you get an error about missing packages, enable `YUZU_USE_BUNDLED_VCPKG`, and then click Configure again.
+
+ * *(You may also want to disable `YUZU_TESTS` in this case since Catch2 is not yet supported with this.)*
+
+ 
+
+* Click "Generate" to create the project files.
+
+ 
+
+* Open the solution file `yuzu.sln` in Visual Studio 2022, which is located in the build folder.
+
+ 
+
+* Depending if you want a graphical user interface or not (`eden` has the graphical user interface, while `eden-cmd` doesn't), select `eden` or `eden-cmd` in the Solution Explorer, right-click and `Set as StartUp Project`.
+
+  
+
+* Select the appropriate build type, Debug for debug purposes or Release for performance (in case of doubt choose Release).
+
+ 
+
+* Right-click the project you want to build and press Build in the submenu or press F5.
+
+ 
+
+## Method II: MinGW-w64 Build with MSYS2
+
+### Prerequisites to install
+
+* [MSYS2](https://www.msys2.org)
+* [Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows) - **Make sure to select Latest SDK.**
+* Make sure to follow the instructions and update to the latest version by running `pacman -Syu` as many times as needed.
+
+### Install eden dependencies for MinGW-w64
+
+* Open the `MSYS2 MinGW 64-bit` (mingw64.exe) shell
+* Download and install all dependencies using: `pacman -Syu git make mingw-w64-x86_64-SDL2 mingw-w64-x86_64-cmake mingw-w64-x86_64-python-pip mingw-w64-x86_64-qt6 mingw-w64-x86_64-toolchain autoconf libtool automake-wrapper`
+* Add MinGW binaries to the PATH: `echo 'PATH=/mingw64/bin:$PATH' >> ~/.bashrc`
+* Add glslangValidator to the PATH: `echo 'PATH=$(readlink -e /c/VulkanSDK/*/Bin/):$PATH' >> ~/.bashrc`
+
+### Clone the eden repository with Git
+
+ ```bash
+ git clone --recursive https://git.eden-emu.dev/eden-emu/eden
+ cd eden
+ ```
+
+### Run the following commands to build eden (dynamically linked build)
+
+```bash
+mkdir build && cd build
+cmake -G "MSYS Makefiles" -DYUZU_USE_BUNDLED_VCPKG=ON -DYUZU_TESTS=OFF ..
+make -j$(nproc)
+# test eden out with
+./bin/eden.exe
+```
+
+* *(Note: This build is not a static build meaning that you need to include all of the DLLs with the .exe in order to use it!)*
+
+e.g.
+```Bash
+cp externals/ffmpeg-*/bin/*.dll bin/
+```
+
+Bonus Note: Running programs from inside `MSYS2 MinGW x64` shell has a different %PATH% than directly from explorer. This different %PATH% has the locations of the other DLLs required.
+
+
+
+### Building without Qt (Optional)
+
+Doesn't require the rather large Qt dependency, but you will lack a GUI frontend:
+
+ * Pass the `-DENABLE_QT=no` flag to cmake
+
+## Method III: CLion Environment Setup
+
+### Minimal Dependencies
+
+To build eden, you need to install the following:
+
+* [CLion](https://www.jetbrains.com/clion/) - This IDE is not free; for a free alternative, check Method I
+* [Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows) - Make sure to select the Latest SDK.
+
+### Cloning eden with CLion
+
+* Clone the Repository:
+
+
+
+
+
+
+
+### Building & Setup
+
+* Once Cloned, You will be taken to a prompt like the image below:
+
+
+
+* Set the settings to the image below:
+* Change `Build type: Release`
+* Change `Name: Release`
+* Change `Toolchain Visual Studio`
+* Change `Generator: Let CMake decide`
+* Change `Build directory: build`
+
+
+
+* Click OK; now Clion will build a directory and index your code to allow for IntelliSense. Please be patient.
+* Once this process has been completed (No loading bar bottom right), you can now build eden
+* In the top right, click on the drop-down menu, select all configurations, then select eden
+
+
+
+* Now run by clicking the play button or pressing Shift+F10, and eden will auto-launch once built.
+
+
+
+## Building from the command line with MSVC
+
+```cmd
+git clone --recursive https://git.eden-emu.dev/eden-emu/eden
+cd eden
+mkdir build
+cd build
+cmake .. -G "Visual Studio 17 2022" -A x64
+cmake --build . --config Release
+```
+
+### Building with Scripts
+A convenience script for building is provided in `.ci/windows/build.sh`. You must run this with Bash, e.g. Git Bash or MinGW TTY. To use this script, you must have windeployqt installed (usually bundled with Qt) and set the `WINDEPLOYQT` environment variable to its canonical Bash location, e.g. `WINDEPLOYQT="/c/Qt/6.9.1/msvc2022_64/bin/windeployqt6.exe" .ci/windows/build.sh`.
+
+Extra CMake flags should be placed in the arguments of the script.
+
+Additional environment variables can be used to control building:
+- `BUILD_TYPE`: Sets the build type to use. Defaults to `Release`
+
+The following environment variables are boolean flags. Set to `true` to enable or `false` to disable:
+- `DEVEL` (default FALSE): Disable Qt update checker
+- `USE_WEBENGINE` (default FALSE): Enable Qt WebEngine
+- `USE_MULTIMEDIA` (default TRUE): Enable Qt Multimedia
+- `BUNDLE_QT` (default FALSE): Use bundled Qt
+ * Note that using system Qt requires you to include the Qt CMake directory in `CMAKE_PREFIX_PATH`, e.g. `.ci/windows/build.sh -DCMAKE_PREFIX_PATH=C:/Qt/6.9.0/msvc2022_64/lib/cmake/Qt6`
+
+After building, a zip can be packaged via `.ci/windows/package.sh`. Note that you must have 7-zip installed and in your PATH. The resulting zip will be placed into `artifacts` in the source directory.
diff --git a/docs/build/macOS.md b/docs/build/macOS.md
new file mode 100644
index 0000000000..6cb62273cb
--- /dev/null
+++ b/docs/build/macOS.md
@@ -0,0 +1,105 @@
+Please note this article is intended for development, and eden on macOS is not currently ready for regular use.
+
+This article was written for developers. eden support for macOS is not ready for casual use.
+
+## Method I: ninja
+---
+If you are compiling on Intel Mac or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` to `/usr/local`.
+
+Install dependencies from Homebrew:
+```sh
+brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zlib zstd cmake Catch2 molten-vk vulkan-loader
+```
+
+Clone the repo
+```sh
+git clone --recursive https://git.eden-emu.dev/eden-emu/eden
+
+cd eden
+```
+
+Build for release
+```sh
+mkdir build && cd build
+
+export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
+
+export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib
+
+cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON
+
+ninja
+```
+
+You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON` after `cmake ..`
+
+Build with debug symbols (vcpkg is not currently used due to broken boost-context library):
+```sh
+mkdir build && cd build
+export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
+cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
+ninja
+```
+
+Run the output:
+```
+bin/eden.app/Contents/MacOS/eden
+```
+
+## Method II: Xcode
+
+---
+If you are compiling on Intel Mac or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` to `/usr/local`.
+
+Install dependencies from Homebrew:
+```sh
+brew install autoconf automake boost ccache ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zlib zstd cmake Catch2 molten-vk vulkan-loader
+```
+
+Clone the repo
+```sh
+git clone --recursive https://git.eden-emu.dev/eden-emu/eden
+
+cd eden
+```
+
+Build for release
+```sh
+mkdir build && cd build
+
+export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
+
+export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib
+
+cmake .. -GXcode -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=ON -DENABLE_LIBUSB=OFF -DCLANG_FORMAT=ON -DSDL2_DISABLE_INSTALL=ON -DSDL_ALTIVEC=ON
+
+xcodebuild build -project eden.xcodeproj -scheme "eden" -configuration "RelWithDebInfo"
+```
+
+You may also want to include support for Discord Rich Presence by adding `-DUSE_DISCORD_PRESENCE=ON` after `cmake ..`
+
+Build with debug symbols (vcpkg is not currently used due to broken boost-context library):
+```sh
+mkdir build && cd build
+export Qt6_DIR="/opt/homebrew/opt/qt@6/lib/cmake"
+cmake .. -GNinja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DYUZU_USE_BUNDLED_VCPKG=OFF -DYUZU_TESTS=OFF -DENABLE_WEB_SERVICE=OFF -DENABLE_LIBUSB=OFF
+ninja
+```
+
+Run the output:
+```
+bin/eden.app/Contents/MacOS/eden
+```
+
+---
+
+To run with MoltenVK, install additional dependencies:
+```sh
+brew install molten-vk vulkan-loader
+```
+
+Run with Vulkan loader path:
+```sh
+export LIBVULKAN_PATH=/opt/homebrew/lib/libvulkan.dylib
+bin/eden.app/Contents/MacOS/eden
+```
\ No newline at end of file
diff --git a/externals/CMakeLists.txt b/externals/CMakeLists.txt
index 7dacba23b6..cdb0c0bb5b 100644
--- a/externals/CMakeLists.txt
+++ b/externals/CMakeLists.txt
@@ -83,7 +83,18 @@ if (YUZU_USE_EXTERNAL_SDL2)
set(SDL_FILE ON)
endif()
- add_subdirectory(SDL)
+ include(CPM)
+ set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
+ set(CPM_USE_LOCAL_PACKAGES OFF)
+
+ if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck")
+ set(SDL_HASH cc016b0046)
+ set(SDL_PIPEWIRE OFF) # build errors out with this on
+ else()
+ set(SDL_HASH 2e4c12cd2c)
+ endif()
+
+ CPMAddPackage("gh:libsdl-org/SDL#${SDL_HASH}")
endif()
# ENet
@@ -211,7 +222,7 @@ if (ANDROID)
endif()
endif()
-if (UNIX AND NOT APPLE AND NOT TARGET gamemode::headers)
+if ((CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID) AND NOT TARGET gamemode::headers)
add_library(gamemode INTERFACE)
target_include_directories(gamemode INTERFACE gamemode)
add_library(gamemode::headers ALIAS gamemode)
diff --git a/externals/SDL b/externals/SDL
deleted file mode 160000
index 2e4c12cd2c..0000000000
--- a/externals/SDL
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 2e4c12cd2cb2c5d0b60ef2196b400339591e733c
diff --git a/externals/Vulkan-Headers b/externals/Vulkan-Headers
index 16cedde356..89268a6d17 160000
--- a/externals/Vulkan-Headers
+++ b/externals/Vulkan-Headers
@@ -1 +1 @@
-Subproject commit 16cedde3564629c43808401ad1eb3ca6ef24709a
+Subproject commit 89268a6d17fc87003b209a1422c17ab288be99a0
diff --git a/externals/Vulkan-Utility-Libraries b/externals/Vulkan-Utility-Libraries
index f216bb107b..df2e358152 160000
--- a/externals/Vulkan-Utility-Libraries
+++ b/externals/Vulkan-Utility-Libraries
@@ -1 +1 @@
-Subproject commit f216bb107bfc6d99a9605572963613e828b10880
+Subproject commit df2e3581520f36776cd42b9fec3ec4a51ab878ef
diff --git a/externals/VulkanMemoryAllocator b/externals/VulkanMemoryAllocator
index 6ec8481c8a..1076b348ab 160000
--- a/externals/VulkanMemoryAllocator
+++ b/externals/VulkanMemoryAllocator
@@ -1 +1 @@
-Subproject commit 6ec8481c8a13db586d7b3ba58f4eb9bbf017edf0
+Subproject commit 1076b348abd17859a116f4b111c43d58a588a086
diff --git a/externals/cubeb b/externals/cubeb
index 832fcf38e6..fa02160712 160000
--- a/externals/cubeb
+++ b/externals/cubeb
@@ -1 +1 @@
-Subproject commit 832fcf38e600bf80b4b728a3e0227403088d992c
+Subproject commit fa021607121360af7c171d881dc5bc8af7bb56eb
diff --git a/externals/dynarmic/externals/CMakeLists.txt b/externals/dynarmic/externals/CMakeLists.txt
index f96497db7a..67fb0f4190 100644
--- a/externals/dynarmic/externals/CMakeLists.txt
+++ b/externals/dynarmic/externals/CMakeLists.txt
@@ -64,12 +64,13 @@ if (NOT TARGET ankerl::unordered_dense)
endif()
# xbyak
+# uncomment if in an independent repo.
-if (NOT TARGET xbyak::xbyak)
- if ("x86_64" IN_LIST ARCHITECTURE)
- add_subdirectory(xbyak)
- endif()
-endif()
+# if (NOT TARGET xbyak::xbyak)
+# if ("x86_64" IN_LIST ARCHITECTURE)
+# add_subdirectory(xbyak)
+# endif()
+# endif()
# zydis
diff --git a/externals/dynarmic/externals/catch b/externals/dynarmic/externals/catch
index 74fcff6e5b..5aa8d11321 160000
--- a/externals/dynarmic/externals/catch
+++ b/externals/dynarmic/externals/catch
@@ -1 +1 @@
-Subproject commit 74fcff6e5b190fb833a231b7f7c1829e3c3ac54d
+Subproject commit 5aa8d113215bd9a97ecc1a2f3fc9506947a2fa57
diff --git a/externals/dynarmic/externals/fmt b/externals/dynarmic/externals/fmt
index 02de29e003..35dcc58263 160000
--- a/externals/dynarmic/externals/fmt
+++ b/externals/dynarmic/externals/fmt
@@ -1 +1 @@
-Subproject commit 02de29e00321787fa515ca60f0f5911e61892dc6
+Subproject commit 35dcc58263d6b55419a5932bd6b0b3029a0a8c00
diff --git a/externals/dynarmic/externals/xbyak b/externals/dynarmic/externals/xbyak
deleted file mode 160000
index 44a72f3692..0000000000
--- a/externals/dynarmic/externals/xbyak
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 44a72f369268f7d552650891b296693e91db86bb
diff --git a/externals/dynarmic/externals/zycore-c b/externals/dynarmic/externals/zycore-c
index 7ad36e5211..75a36c45ae 160000
--- a/externals/dynarmic/externals/zycore-c
+++ b/externals/dynarmic/externals/zycore-c
@@ -1 +1 @@
-Subproject commit 7ad36e52110b39cfb62b47bfdb6def94ac531309
+Subproject commit 75a36c45ae1ad382b0f4e0ede0af84c11ee69928
diff --git a/externals/dynarmic/externals/zydis b/externals/dynarmic/externals/zydis
index 6372690e30..c2d2bab025 160000
--- a/externals/dynarmic/externals/zydis
+++ b/externals/dynarmic/externals/zydis
@@ -1 +1 @@
-Subproject commit 6372690e30389a94db65ece2d8a1f0a2310475ed
+Subproject commit c2d2bab0255e53a7c3e9b615f4eb69449eb942df
diff --git a/externals/dynarmic/src/dynarmic/CMakeLists.txt b/externals/dynarmic/src/dynarmic/CMakeLists.txt
index a43c9eae10..ab2d653152 100644
--- a/externals/dynarmic/src/dynarmic/CMakeLists.txt
+++ b/externals/dynarmic/src/dynarmic/CMakeLists.txt
@@ -5,7 +5,10 @@ add_library(dynarmic
backend/block_range_information.h
backend/exception_handler.h
common/always_false.h
+ common/assert.cpp
+ common/assert.h
common/cast_util.h
+ common/common_types.h
common/crypto/aes.cpp
common/crypto/aes.h
common/crypto/crc32.cpp
diff --git a/externals/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp b/externals/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp
index 6b38c41093..a22f296e94 100644
--- a/externals/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp
+++ b/externals/dynarmic/src/dynarmic/backend/arm64/a32_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
/* This file is part of the dynarmic project.
* Copyright (c) 2021 MerryMage
* SPDX-License-Identifier: 0BSD
@@ -7,9 +10,9 @@
#include
#include
-#include
+#include "dynarmic/common/assert.h"
#include
-#include
+#include "dynarmic/common/common_types.h"
#include "dynarmic/backend/arm64/a32_address_space.h"
#include "dynarmic/backend/arm64/a32_core.h"
diff --git a/externals/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.cpp b/externals/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.cpp
index e24654c7db..67390a311d 100644
--- a/externals/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.cpp
+++ b/externals/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
/* This file is part of the dynarmic project.
* Copyright (c) 2016 MerryMage
* SPDX-License-Identifier: 0BSD
@@ -6,7 +9,7 @@
#include "dynarmic/backend/arm64/a32_jitstate.h"
#include
-#include
+#include "dynarmic/common/common_types.h"
namespace Dynarmic::Backend::Arm64 {
diff --git a/externals/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.h b/externals/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.h
index 978bf84ad2..b4fee9a4d0 100644
--- a/externals/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.h
+++ b/externals/dynarmic/src/dynarmic/backend/arm64/a32_jitstate.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
/* This file is part of the dynarmic project.
* Copyright (c) 2021 MerryMage
* SPDX-License-Identifier: 0BSD
@@ -7,7 +10,7 @@
#include
-#include
+#include "dynarmic/common/common_types.h"
#include "dynarmic/frontend/A32/a32_location_descriptor.h"
#include "dynarmic/ir/location_descriptor.h"
diff --git a/externals/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp b/externals/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp
index 7d7716783a..96170f08a8 100644
--- a/externals/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp
+++ b/externals/dynarmic/src/dynarmic/backend/arm64/a64_interface.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
/* This file is part of the dynarmic project.
* Copyright (c) 2022 MerryMage
* SPDX-License-Identifier: 0BSD
@@ -7,9 +10,9 @@
#include
#include
-#include
+#include "dynarmic/common/assert.h"
#include
-#include
+#include "dynarmic/common/common_types.h"
#include "dynarmic/backend/arm64/a64_address_space.h"
#include "dynarmic/backend/arm64/a64_core.h"
diff --git a/externals/dynarmic/src/dynarmic/backend/arm64/a64_jitstate.h b/externals/dynarmic/src/dynarmic/backend/arm64/a64_jitstate.h
index 215e6987f3..3dd422b6d4 100644
--- a/externals/dynarmic/src/dynarmic/backend/arm64/a64_jitstate.h
+++ b/externals/dynarmic/src/dynarmic/backend/arm64/a64_jitstate.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
/* This file is part of the dynarmic project.
* Copyright (c) 2022 MerryMage
* SPDX-License-Identifier: 0BSD
@@ -7,7 +10,7 @@
#include
-#include
+#include "dynarmic/common/common_types.h"
#include "dynarmic/frontend/A64/a64_location_descriptor.h"
diff --git a/externals/dynarmic/src/dynarmic/backend/arm64/abi.cpp b/externals/dynarmic/src/dynarmic/backend/arm64/abi.cpp
index 6d7b96379b..04d8ca2eaf 100644
--- a/externals/dynarmic/src/dynarmic/backend/arm64/abi.cpp
+++ b/externals/dynarmic/src/dynarmic/backend/arm64/abi.cpp
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
/* This file is part of the dynarmic project.
* Copyright (c) 2022 MerryMage
* SPDX-License-Identifier: 0BSD
@@ -8,7 +11,7 @@
#include
#include
-#include
+#include "dynarmic/common/common_types.h"
#include
namespace Dynarmic::Backend::Arm64 {
diff --git a/externals/dynarmic/src/dynarmic/backend/arm64/abi.h b/externals/dynarmic/src/dynarmic/backend/arm64/abi.h
index d3d5de963a..ca7c9187db 100644
--- a/externals/dynarmic/src/dynarmic/backend/arm64/abi.h
+++ b/externals/dynarmic/src/dynarmic/backend/arm64/abi.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
/* This file is part of the dynarmic project.
* Copyright (c) 2022 MerryMage
* SPDX-License-Identifier: 0BSD
@@ -10,7 +13,7 @@
#include
#include
-#include
+#include "dynarmic/common/common_types.h"
#include
#include "dynarmic/common/always_false.h"
diff --git a/externals/dynarmic/src/dynarmic/backend/arm64/address_space.h b/externals/dynarmic/src/dynarmic/backend/arm64/address_space.h
index 792ecf696b..25b1ab4b04 100644
--- a/externals/dynarmic/src/dynarmic/backend/arm64/address_space.h
+++ b/externals/dynarmic/src/dynarmic/backend/arm64/address_space.h
@@ -1,3 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
+// SPDX-License-Identifier: GPL-3.0-or-later
+
/* This file is part of the dynarmic project.
* Copyright (c) 2022 MerryMage
* SPDX-License-Identifier: 0BSD
@@ -8,7 +11,7 @@
#include