Compare commits
163 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c07cd11f3e | |||
| 1d629fe83c | |||
| ba3eda83d3 | |||
| e6850cbad5 | |||
| cfae726289 | |||
| bb94cff886 | |||
| 370997f42e | |||
| 5213cc5689 | |||
| bc9af86269 | |||
| 00ec67d65b | |||
| fbd28a9d34 | |||
| 3413fbd9da | |||
| bccc46a325 | |||
| f0fe283038 | |||
| b78390551c | |||
| 62ea689949 | |||
| 8c6a612062 | |||
| df3b9400a6 | |||
| c5bd7dc047 | |||
| 557876b222 | |||
| 22dfc560e0 | |||
| 1d869e8495 | |||
| 959f72297d | |||
| 057d566ff4 | |||
| be592f0ab3 | |||
| bf68eede05 | |||
| 1eed7efd09 | |||
| 50f8d4130d | |||
| e4dccd5a5c | |||
| b9530ae80f | |||
| 5130185d12 | |||
| db1dfc9755 | |||
| d7de298948 | |||
| 363d861011 | |||
| 30d75d4e52 | |||
| 06b83a58a6 | |||
| 1e06c6f752 | |||
| adc41bff70 | |||
| 4edb70c8f0 | |||
| 9da38715fe | |||
| 7157d5167e | |||
| 77d83b008a | |||
| 69a84ee0a6 | |||
| 5b019a81a7 | |||
| 83332316aa | |||
| 3141019fcd | |||
| 4cc9aa691d | |||
| d96ab0df6a | |||
| c03f7cf284 | |||
| 750fecda18 | |||
| 1f422a8f70 | |||
| 90877dfc85 | |||
| f882ff72eb | |||
| 55cc4d5ede | |||
| 09f03f5640 | |||
| 7a98ee4ead | |||
| dfd042c809 | |||
| 16ca7851c5 | |||
| 0eed5100f9 | |||
| 8d3b33c3aa | |||
| e3c942b209 | |||
| 1b1e186a58 | |||
| e75ecfd4a0 | |||
| 18135424df | |||
| 1d2b9de496 | |||
| fe8017734b | |||
| 33ee9de85a | |||
| e22756160c | |||
| a33956f738 | |||
| 4642e82ca7 | |||
| 97054357d2 | |||
| 941caf31ce | |||
| c72144abad | |||
| d656e347c8 | |||
| 8859809ebd | |||
| 318998cbb5 | |||
| f58097e814 | |||
| 1efef85352 | |||
| ea0e5d630c | |||
| 9e610ea098 | |||
| 41af6ea645 | |||
| 91b0432591 | |||
| 46239dafa1 | |||
| bf23921f07 | |||
| e63f71c787 | |||
| 027085e5ba | |||
| f40025fd9b | |||
| ed39ec4738 | |||
| fe13539d72 | |||
| be218cc020 | |||
| c3cbe2d4d0 | |||
| 79b162a37c | |||
| f3fbb3812f | |||
| d8caa74233 | |||
| 17fe74ef11 | |||
| 73713737c6 | |||
| 61f3ce643c | |||
| f7f6a4cde4 | |||
| 65fa1a37e2 | |||
| 41192e6e3d | |||
| d8f2e22bf8 | |||
| 51506ef836 | |||
| 0d3cef65ad | |||
| c2794985b2 | |||
| 2e1af92852 | |||
| b9655669b3 | |||
| 6b01977005 | |||
| 91d41d1c34 | |||
| 2e4ee8d9a4 | |||
| 92274ff280 | |||
| d1ac5b2e50 | |||
| c160d6b752 | |||
| eb2d9ea574 | |||
| 4f389338bd | |||
| 227a007413 | |||
| 74d6eaf721 | |||
| 9807fa02ed | |||
| 7d239df065 | |||
| b690813196 | |||
| b9f54f4979 | |||
| 7e730a121b | |||
| 680384f7b8 | |||
| a27914f0f4 | |||
| 3f226678dd | |||
| e9d84d098d | |||
| 32db6c1877 | |||
| 8eaa7c28ce | |||
| 3edfcabdea | |||
| 450c483de0 | |||
| 66db2613b5 | |||
| 9a046190c7 | |||
| cfbef5c487 | |||
| f51d61e4a4 | |||
| ba9e03a612 | |||
| 7832afc5dd | |||
| 028765867f | |||
| d89df63a28 | |||
| 87c4f658ce | |||
| b7584cb2c3 | |||
| f32f356c40 | |||
| 7ca657d22f | |||
| 7764cdd57e | |||
| 42863027e2 | |||
| 08f3639c80 | |||
| e13c7ef3f8 | |||
| 89dd133a2f | |||
| 86e9c32800 | |||
| f1cf30bc2a | |||
| 5af5214451 | |||
| 312c1cc0f6 | |||
| 576c4e5f77 | |||
| 84cf3e8c84 | |||
| 45a2008aa6 | |||
| 8f6e0aa2cb | |||
| ca0bc65531 | |||
| a1930d1063 | |||
| 48843306e2 | |||
| 159482a7a9 | |||
| 0510f0bdbc | |||
| 569dbfe8c0 | |||
| 8412e64bb0 | |||
| 1c4dae066b | |||
| 9406438d51 |
@@ -1,21 +1,121 @@
|
||||
#!/bin/bash -e
|
||||
#!/bin/sh -e
|
||||
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
export NDK_CCACHE=$(which ccache)
|
||||
NUM_JOBS=$(nproc 2>/dev/null || getconf _NPROCESSORS_ONLN 2>/dev/null || echo 2)
|
||||
export CMAKE_BUILD_PARALLEL_LEVEL="${NUM_JOBS}"
|
||||
ARTIFACTS_DIR="$PWD/artifacts"
|
||||
|
||||
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
|
||||
: "${CCACHE:=false}"
|
||||
RETURN=0
|
||||
|
||||
usage() {
|
||||
cat <<EOF
|
||||
Usage: $0 [-t|--target FLAVOR] [-b|--build-type BUILD_TYPE]
|
||||
[-h|--help] [-r|--release] [extra options]
|
||||
|
||||
Build script for Android.
|
||||
Associated variables can be set outside the script,
|
||||
and will apply both to this script and the packaging script.
|
||||
bool values are "true" or "false"
|
||||
|
||||
Options:
|
||||
-r, --release Enable update checker. If set, sets the DEVEL bool variable to false.
|
||||
By default, DEVEL is true.
|
||||
-t, --target <FLAVOR> Build flavor (variable: TARGET)
|
||||
Valid values are: legacy, optimized, standard, chromeos
|
||||
Default: standard
|
||||
-b, --build-type <TYPE> Build type (variable: TYPE)
|
||||
Valid values are: Release, RelWithDebInfo, Debug
|
||||
Default: Debug
|
||||
|
||||
Extra arguments are passed to CMake (e.g. -DCMAKE_OPTION_NAME=VALUE)
|
||||
Set the CCACHE variable to "true" to enable build caching.
|
||||
The APK and AAB will be output into "artifacts".
|
||||
|
||||
EOF
|
||||
|
||||
exit "$RETURN"
|
||||
}
|
||||
|
||||
die() {
|
||||
echo "-- ! $*" >&2
|
||||
RETURN=1 usage
|
||||
}
|
||||
|
||||
target() {
|
||||
[ -z "$1" ] && die "You must specify a valid target."
|
||||
|
||||
TARGET="$1"
|
||||
}
|
||||
|
||||
type() {
|
||||
[ -z "$1" ] && die "You must specify a valid type."
|
||||
|
||||
TYPE="$1"
|
||||
}
|
||||
|
||||
while true; do
|
||||
case "$1" in
|
||||
-r|--release) DEVEL=false ;;
|
||||
-t|--target) target "$2"; shift ;;
|
||||
-b|--build-type) type "$2"; shift ;;
|
||||
-h|--help) usage ;;
|
||||
*) break ;;
|
||||
esac
|
||||
|
||||
shift
|
||||
done
|
||||
|
||||
: "${TARGET:=standard}"
|
||||
: "${TYPE:=Release}"
|
||||
: "${DEVEL:=true}"
|
||||
|
||||
TARGET_LOWER=$(echo "$TARGET" | tr '[:upper:]' '[:lower:]')
|
||||
|
||||
case "$TARGET_LOWER" in
|
||||
legacy) FLAVOR=Legacy ;;
|
||||
optimized) FLAVOR=GenshinSpoof ;;
|
||||
standard) FLAVOR=Mainline ;;
|
||||
chromeos) FLAVOR=ChromeOS ;;
|
||||
*) die "Invalid build flavor $TARGET."
|
||||
esac
|
||||
|
||||
case "$TYPE" in
|
||||
RelWithDebInfo|Release|Debug) ;;
|
||||
*) die "Invalid build type $TYPE."
|
||||
esac
|
||||
|
||||
LOWER_FLAVOR=$(echo "$FLAVOR" | sed 's/./\L&/')
|
||||
LOWER_TYPE=$(echo "$TYPE" | sed 's/./\L&/')
|
||||
|
||||
if [ -n "${ANDROID_KEYSTORE_B64}" ]; then
|
||||
export ANDROID_KEYSTORE_FILE="${GITHUB_WORKSPACE}/ks.jks"
|
||||
base64 --decode <<< "${ANDROID_KEYSTORE_B64}" > "${ANDROID_KEYSTORE_FILE}"
|
||||
echo "${ANDROID_KEYSTORE_B64}" | base64 --decode > "${ANDROID_KEYSTORE_FILE}"
|
||||
SHA1SUM=$(keytool -list -v -storepass "${ANDROID_KEYSTORE_PASS}" -keystore "${ANDROID_KEYSTORE_FILE}" | grep SHA1 | cut -d " " -f3)
|
||||
echo "-- Keystore SHA1 is ${SHA1SUM}"
|
||||
fi
|
||||
|
||||
cd src/android
|
||||
chmod +x ./gradlew
|
||||
|
||||
./gradlew assembleMainlineRelease
|
||||
./gradlew bundleMainlineRelease
|
||||
set -- "$@" -DUSE_CCACHE="${CCACHE}"
|
||||
[ "$DEVEL" != "true" ] && set -- "$@" -DENABLE_UPDATE_CHECKER=ON
|
||||
|
||||
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
|
||||
echo "-- building..."
|
||||
|
||||
./gradlew "copy${FLAVOR}${TYPE}Outputs" \
|
||||
-Dorg.gradle.caching="${CCACHE}" \
|
||||
-Dorg.gradle.parallel="${CCACHE}" \
|
||||
-Dorg.gradle.workers.max="${NUM_JOBS}" \
|
||||
-PYUZU_ANDROID_ARGS="$*" \
|
||||
--info
|
||||
|
||||
if [ -n "${ANDROID_KEYSTORE_B64}" ]; then
|
||||
rm "${ANDROID_KEYSTORE_FILE}"
|
||||
fi
|
||||
|
||||
echo "-- Done! APK and AAB artifacts are in ${ARTIFACTS_DIR}"
|
||||
|
||||
ls -l "${ARTIFACTS_DIR}/"
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
GITDATE="$(git show -s --date=short --format='%ad' | sed 's/-//g')"
|
||||
GITREV="$(git show -s --format='%h')"
|
||||
ARTIFACTS_DIR="$PWD/artifacts"
|
||||
mkdir -p "${ARTIFACTS_DIR}/"
|
||||
|
||||
REV_NAME="eden-android-${GITDATE}-${GITREV}"
|
||||
BUILD_FLAVOR="mainline"
|
||||
BUILD_TYPE_LOWER="release"
|
||||
BUILD_TYPE_UPPER="Release"
|
||||
|
||||
cp src/android/app/build/outputs/apk/"${BUILD_FLAVOR}/${BUILD_TYPE_LOWER}/app-${BUILD_FLAVOR}-${BUILD_TYPE_LOWER}.apk" \
|
||||
"${ARTIFACTS_DIR}/${REV_NAME}.apk" || echo "APK not found"
|
||||
|
||||
cp src/android/app/build/outputs/bundle/"${BUILD_FLAVOR}${BUILD_TYPE_UPPER}"/"app-${BUILD_FLAVOR}-${BUILD_TYPE_LOWER}.aab" \
|
||||
"${ARTIFACTS_DIR}/${REV_NAME}.aab" || echo "AAB not found"
|
||||
|
||||
ls -la "${ARTIFACTS_DIR}/"
|
||||
@@ -4,7 +4,7 @@
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# specify full path if dupes may exist
|
||||
EXCLUDE_FILES="CPM.cmake CPMUtil.cmake GetSCMRev.cmake renderdoc_app.h tools/cpm tools/shellcheck.sh tools/update-cpm.sh externals/stb externals/glad externals/getopt externals/gamemode externals/FidelityFX-FSR externals/demangle externals/bc_decoder"
|
||||
EXCLUDE_FILES="CPM.cmake CPMUtil.cmake GetSCMRev.cmake renderdoc_app.h tools/cpm tools/shellcheck.sh tools/update-cpm.sh tools/windows/vcvarsall.sh externals/stb externals/glad externals/getopt externals/gamemode externals/FidelityFX-FSR externals/demangle externals/bc_decoder externals/cmake-modules"
|
||||
|
||||
# license header constants, please change when needed :))))
|
||||
YEAR=2025
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: yuzu Discord
|
||||
url: https://discord.com/invite/u77vRWY
|
||||
about: If you are experiencing an issue with yuzu, and you need tech support, or if you have a general question, try asking in the official yuzu Discord linked here. Piracy is not allowed.
|
||||
- name: Community forums
|
||||
url: https://community.citra-emu.org
|
||||
about: This is an alternative place for tech support, however helpers there are not as active.
|
||||
- name: Eden Discord
|
||||
url: https://discord.gg/HstXbPch7X
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
name: tx-src
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
sources:
|
||||
runs-on: source
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Push New Sources
|
||||
run: |
|
||||
export PATH=/usr/lib/qt6/bin:$PATH
|
||||
./tools/translations/qt-source.sh
|
||||
tx-cli push -s
|
||||
@@ -0,0 +1,22 @@
|
||||
name: Check Strings
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
check-strings:
|
||||
runs-on: source
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Find Unused Strings
|
||||
run: ./tools/find-unused-strings.sh
|
||||
|
||||
- name: Find Stale Translations
|
||||
run: ./tools/stale-translations.sh
|
||||
|
||||
- name: Diff
|
||||
run: git --no-pager diff --exit-code HEAD
|
||||
@@ -0,0 +1,62 @@
|
||||
name: tx-pull
|
||||
|
||||
on:
|
||||
# monday, wednesday, saturday at 2pm
|
||||
schedule:
|
||||
cron:
|
||||
- '0 14 * * 1,3,6'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
tx-update:
|
||||
runs-on: source
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Get New Translations
|
||||
run: tx-cli pull -t -f
|
||||
|
||||
- name: Push branch
|
||||
run: |
|
||||
git config --local user.name "Eden CI"
|
||||
git config --local user.email "ci@eden-emu.dev"
|
||||
git config --local user.signingkey "D57652791BB25D2A"
|
||||
git config --local push.autoSetupRemote true
|
||||
|
||||
git remote set-url origin ci:eden-emu/eden.git
|
||||
|
||||
TIMESTAMP=$(date +"%s")
|
||||
echo "TIMESTAMP=$TIMESTAMP" >> "$GITHUB_ENV"
|
||||
|
||||
git switch -c update-translations-$TIMESTAMP
|
||||
git add dist src/android/app/src/main/res
|
||||
|
||||
git commit -sS -m "[dist, android] Update translations from Transifex"
|
||||
git push
|
||||
|
||||
- name: Create PR
|
||||
run: |
|
||||
DATE=$(date +"%b %d")
|
||||
TITLE="[dist, android] Update translations from Transifex for $DATE"
|
||||
BODY="Automatic translation update for $DATE"
|
||||
BASE=master
|
||||
HEAD=update-translations-$TIMESTAMP
|
||||
|
||||
cat << EOF > data.json
|
||||
{
|
||||
"base": "$BASE",
|
||||
"body": "$BODY",
|
||||
"head": "$HEAD",
|
||||
"title": "$TITLE"
|
||||
}
|
||||
EOF
|
||||
|
||||
curl -X 'POST' \
|
||||
'https://git.eden-emu.dev/api/v1/repos/eden-emu/eden/pulls' \
|
||||
-H 'accept: application/json' \
|
||||
-H 'Authorization: Bearer ${{ secrets.CI_FJ_TOKEN }}' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d "@data.json" --fail
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
# Build directory
|
||||
/[Bb]uild*/
|
||||
doc-build/
|
||||
out/
|
||||
AppDir/
|
||||
uruntime
|
||||
|
||||
@@ -36,6 +37,8 @@ CMakeLists.txt.user*
|
||||
# *nix related
|
||||
# Common convention for backup or temporary files
|
||||
*~
|
||||
*.core
|
||||
dtrace-out/
|
||||
|
||||
# Visual Studio CMake settings
|
||||
CMakeSettings.json
|
||||
@@ -59,3 +62,4 @@ eden-windows-msvc
|
||||
artifacts
|
||||
*.AppImage*
|
||||
/install*
|
||||
vulkansdk*.exe
|
||||
|
||||
@@ -1,3 +1,16 @@
|
||||
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
|
||||
@@ -1,10 +0,0 @@
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 1811c42..bac9098 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -1,4 +1,4 @@
|
||||
-cmake_minimum_required(VERSION 2.6)
|
||||
+cmake_minimum_required(VERSION 3.5)
|
||||
if(TEST_CPP)
|
||||
project("mbed TLS" C CXX)
|
||||
else()
|
||||
@@ -1,13 +0,0 @@
|
||||
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 */
|
||||
@@ -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 <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
-#if defined(__ARM_NEON)
|
||||
-#include <arm_neon.h>
|
||||
+#if defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
|
||||
+#include <arm64_neon.h.h>
|
||||
#define MBEDTLS_HAVE_NEON_INTRINSICS
|
||||
-#elif defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64)
|
||||
-#include <arm64_neon.h>
|
||||
+#elif defined(__ANDROID__) || defined(__ARM_NEON)
|
||||
+#include <arm_neon.h>
|
||||
#define MBEDTLS_HAVE_NEON_INTRINSICS
|
||||
#endif
|
||||
|
||||
@@ -13,7 +13,6 @@ Copyright: yuzu Emulator Project
|
||||
License: GPL-2.0-or-later
|
||||
|
||||
Files: dist/qt_themes/default/icons/256x256/eden.png
|
||||
dist/qt_themes/default/icons/256x256/eden_named.png
|
||||
dist/yuzu.bmp
|
||||
dist/eden.icns
|
||||
dist/eden.ico
|
||||
|
||||
@@ -5,72 +5,30 @@ cmake_minimum_required(VERSION 3.22)
|
||||
|
||||
project(yuzu)
|
||||
|
||||
if (${CMAKE_SYSTEM_NAME} STREQUAL "SunOS")
|
||||
set(PLATFORM_SUN ON)
|
||||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
|
||||
set(PLATFORM_FREEBSD ON)
|
||||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD")
|
||||
set(PLATFORM_OPENBSD ON)
|
||||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "NetBSD")
|
||||
set(PLATFORM_NETBSD ON)
|
||||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Haiku")
|
||||
set(PLATFORM_HAIKU ON)
|
||||
elseif (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
|
||||
set(PLATFORM_LINUX ON)
|
||||
endif()
|
||||
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
set(CXX_CLANG ON)
|
||||
if (MSVC)
|
||||
set(CXX_CLANG_CL ON)
|
||||
endif()
|
||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
|
||||
set(CXX_GCC ON)
|
||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
||||
set(CXX_CL ON)
|
||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
|
||||
set(CXX_ICC ON)
|
||||
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
||||
set(CXX_APPLE ON)
|
||||
endif()
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
||||
|
||||
# https://gitlab.kitware.com/cmake/cmake/-/merge_requests/11112
|
||||
# This works totally fine on MinGW64, but not CLANG{,ARM}64
|
||||
if(MINGW AND CXX_CLANG)
|
||||
set(CMAKE_SYSTEM_VERSION 10.0.0)
|
||||
endif()
|
||||
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
|
||||
|
||||
# NB: this does not account for SPARC
|
||||
# If you get Eden working on SPARC, please shoot crueter@crueter.xyz multiple emails
|
||||
# and you will be hailed for eternity
|
||||
if (PLATFORM_SUN)
|
||||
# Terrific Solaris pkg shenanigans
|
||||
list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SYSROOT}/usr/lib/qt/6.6/lib/amd64/cmake")
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SYSROOT}/usr/lib/qt/6.6/lib/amd64/cmake")
|
||||
include(DetectPlatform)
|
||||
include(DetectArchitecture)
|
||||
include(DefaultConfig)
|
||||
include(DownloadExternals)
|
||||
include(CMakeDependentOption)
|
||||
include(CTest)
|
||||
include(CPMUtil)
|
||||
|
||||
# Amazing - absolutely incredible
|
||||
list(APPEND CMAKE_PREFIX_PATH "${CMAKE_SYSROOT}/usr/lib/amd64/cmake")
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SYSROOT}/usr/lib/amd64/cmake")
|
||||
DetectArchitecture()
|
||||
|
||||
# For some mighty reason, doing a normal release build sometimes may not trigger
|
||||
# the proper -O3 switch to materialize
|
||||
if (CMAKE_BUILD_TYPE MATCHES "Release")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
|
||||
endif()
|
||||
if (CMAKE_BUILD_TYPE MATCHES "RelWithDebInfo")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2")
|
||||
endif()
|
||||
if (NOT DEFINED ARCHITECTURE)
|
||||
message(FATAL_ERROR "Architecture didn't make it out of scope, did you delete DetectArchitecture.cmake?")
|
||||
endif()
|
||||
|
||||
# Needed for FFmpeg w/ VAAPI and DRM
|
||||
if (PLATFORM_OPENBSD)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include")
|
||||
# OpenBSD 7.8 broke libcxx when upgrading, so we must define the PSTL backend manually
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1")
|
||||
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")
|
||||
@@ -83,92 +41,69 @@ if (PLATFORM_NETBSD)
|
||||
set(ENV{PKG_CONFIG_PATH} "${PKG_CONFIG_PATH}:${CMAKE_SYSROOT}/usr/pkg/lib/ffmpeg7/pkgconfig")
|
||||
endif()
|
||||
|
||||
# Detect current compilation architecture and create standard definitions
|
||||
# =======================================================================
|
||||
# static stuff
|
||||
option(YUZU_STATIC_BUILD "Use static libraries and executables if available" OFF)
|
||||
|
||||
include(CheckSymbolExists)
|
||||
function(detect_architecture symbol arch)
|
||||
if (NOT DEFINED ARCHITECTURE)
|
||||
set(CMAKE_REQUIRED_QUIET 1)
|
||||
check_symbol_exists("${symbol}" "" ARCHITECTURE_${arch})
|
||||
unset(CMAKE_REQUIRED_QUIET)
|
||||
# TODO: StaticBuild.cmake
|
||||
if (YUZU_STATIC_BUILD)
|
||||
include(StaticQtLibs)
|
||||
|
||||
# The output variable needs to be unique across invocations otherwise
|
||||
# CMake's crazy scope rules will keep it defined
|
||||
if (ARCHITECTURE_${arch})
|
||||
set(ARCHITECTURE "${arch}" PARENT_SCOPE)
|
||||
set(ARCHITECTURE_${arch} 1 PARENT_SCOPE)
|
||||
add_definitions("-DARCHITECTURE_${arch}=1")
|
||||
endif()
|
||||
# lol
|
||||
set(Boost_USE_STATIC_LIBS ON)
|
||||
set(BUILD_SHARED_LIBS OFF)
|
||||
|
||||
## find .a libs first (static, usually)
|
||||
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||
|
||||
## some libraries use CMAKE_IMPORT_LIBRARY_SUFFIX e.g. Harfbuzz ##
|
||||
set(CMAKE_IMPORT_LIBRARY_SUFFIX ".a")
|
||||
|
||||
if (MINGW)
|
||||
# simple hook to reject dynamic libs
|
||||
function(find_library var)
|
||||
# also skip previously-found libraries cuz... yaknow
|
||||
# UNLESS they are dll.a :{
|
||||
if (${var} AND NOT ${var} MATCHES "dll\\.a$")
|
||||
return()
|
||||
endif()
|
||||
|
||||
_find_library(${var} ${ARGN})
|
||||
if (${var})
|
||||
get_filename_component(lib_name "${${var}}" NAME)
|
||||
if (lib_name MATCHES "dll\\.a$")
|
||||
unset(${var} CACHE)
|
||||
set(${var} "${var}-NOTFOUND" CACHE INTERNAL "" FORCE)
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# msys2 quazip does not build a static lib
|
||||
set(QuaZip-Qt6_FORCE_BUNDLED ON)
|
||||
|
||||
set(YUZU_USE_BUNDLED_FFMPEG ON)
|
||||
set(YUZU_USE_BUNDLED_SDL2 ON)
|
||||
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)
|
||||
|
||||
# these libs do not properly provide static libs/let you do it with cmake
|
||||
set(fmt_FORCE_BUNDLED ON)
|
||||
set(SPIRV-Tools_FORCE_BUNDLED ON)
|
||||
set(SPIRV-Headers_FORCE_BUNDLED ON)
|
||||
set(zstd_FORCE_BUNDLED ON)
|
||||
set(MbedTLS_FORCE_BUNDLED ON)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
if (NOT ENABLE_GENERIC)
|
||||
# https://sourceforge.net/p/predef/wiki/Architectures/
|
||||
# TODO: THIS IS FUCKING FLAWED ONLY THE FIRST SYMBOL THAT APPEARS WILL BE CONSIDERED :(
|
||||
if (MSVC)
|
||||
detect_architecture("_M_AMD64" x86_64)
|
||||
detect_architecture("_M_IX86" x86)
|
||||
detect_architecture("_M_ARM" arm)
|
||||
detect_architecture("_M_ARM64" arm64)
|
||||
else()
|
||||
detect_architecture("__x86_64__" x86_64)
|
||||
detect_architecture("__i386__" x86)
|
||||
detect_architecture("__arm__" arm)
|
||||
detect_architecture("__aarch64__" arm64)
|
||||
endif()
|
||||
detect_architecture("__ARM64__" arm64)
|
||||
detect_architecture("__aarch64__" arm64)
|
||||
detect_architecture("_M_ARM64" arm64)
|
||||
|
||||
detect_architecture("__arm__" arm)
|
||||
detect_architecture("__TARGET_ARCH_ARM" arm)
|
||||
detect_architecture("_M_ARM" arm)
|
||||
|
||||
detect_architecture("__x86_64" x86_64)
|
||||
detect_architecture("__x86_64__" x86_64)
|
||||
detect_architecture("__amd64" x86_64)
|
||||
detect_architecture("_M_X64" x86_64)
|
||||
|
||||
detect_architecture("__i386" x86)
|
||||
detect_architecture("__i386__" x86)
|
||||
detect_architecture("_M_IX86" x86)
|
||||
|
||||
detect_architecture("__ia64" ia64)
|
||||
detect_architecture("__ia64__" ia64)
|
||||
detect_architecture("_M_IA64" ia64)
|
||||
|
||||
detect_architecture("__mips" mips)
|
||||
detect_architecture("__mips__" mips)
|
||||
detect_architecture("_M_MRX000" mips)
|
||||
|
||||
detect_architecture("__powerpc64__" ppc64)
|
||||
detect_architecture("__ppc64__" ppc64)
|
||||
detect_architecture("__PPC64__" ppc64)
|
||||
detect_architecture("_ARCH_PPC64" ppc64)
|
||||
|
||||
detect_architecture("__ppc__" ppc)
|
||||
detect_architecture("__ppc" ppc)
|
||||
detect_architecture("__powerpc__" ppc)
|
||||
detect_architecture("_ARCH_COM" ppc)
|
||||
detect_architecture("_ARCH_PWR" ppc)
|
||||
detect_architecture("_ARCH_PPC" ppc)
|
||||
detect_architecture("_M_MPPC" ppc)
|
||||
detect_architecture("_M_PPC" ppc)
|
||||
|
||||
detect_architecture("__riscv" riscv)
|
||||
|
||||
detect_architecture("__EMSCRIPTEN__" wasm)
|
||||
endif()
|
||||
|
||||
if (NOT DEFINED ARCHITECTURE)
|
||||
set(ARCHITECTURE "GENERIC")
|
||||
set(ARCHITECTURE_GENERIC 1)
|
||||
add_definitions(-DARCHITECTURE_GENERIC=1)
|
||||
endif()
|
||||
|
||||
message(STATUS "Target architecture: ${ARCHITECTURE}")
|
||||
|
||||
if (MSVC AND ARCHITECTURE_x86)
|
||||
message(FATAL_ERROR "Attempting to build with the x86 environment is not supported. \
|
||||
This can typically happen if you used the Developer Command Prompt from the start menu; \
|
||||
@@ -189,40 +124,27 @@ if (CXX_CLANG_CL)
|
||||
$<$<COMPILE_LANGUAGE:C,CXX>:/EHsc> # thanks microsoft
|
||||
)
|
||||
|
||||
# REQUIRED CPU features IN Windows-amd64
|
||||
if (ARCHITECTURE_x86_64)
|
||||
add_compile_options(
|
||||
# Required CPU features for amd64
|
||||
$<$<COMPILE_LANGUAGE:C,CXX>:-msse4.1>
|
||||
$<$<COMPILE_LANGUAGE:C,CXX>:-mcx16>
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
|
||||
|
||||
include(DownloadExternals)
|
||||
include(CMakeDependentOption)
|
||||
include(CTest)
|
||||
|
||||
# Disable Warnings as Errors for MSVC
|
||||
if (MSVC AND NOT CXX_CLANG)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3 /WX-")
|
||||
endif()
|
||||
|
||||
if (PLATFORM_FREEBSD)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/local/lib")
|
||||
|
||||
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)
|
||||
|
||||
if (ENABLE_SDL2)
|
||||
# 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 "Compile external SDL2" OFF "NOT MSVC" OFF)
|
||||
option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}")
|
||||
endif()
|
||||
# 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 "ENABLE_SDL2;NOT MSVC" OFF)
|
||||
cmake_dependent_option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}" "ENABLE_SDL2" OFF)
|
||||
|
||||
# qt stuff
|
||||
option(ENABLE_QT "Enable the Qt frontend" ON)
|
||||
@@ -243,10 +165,14 @@ option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if n
|
||||
|
||||
# ffmpeg
|
||||
option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT})
|
||||
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF)
|
||||
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from external source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF)
|
||||
|
||||
# sirit
|
||||
option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${EXT_DEFAULT})
|
||||
set(BUNDLED_SIRIT_DEFAULT OFF)
|
||||
if ((MSVC AND NOT (CMAKE_BUILD_TYPE MATCHES "Debug|RelWithDebInfo") OR ANDROID))
|
||||
set(BUNDLED_SIRIT_DEFAULT ON)
|
||||
endif()
|
||||
option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${BUNDLED_SIRIT_DEFAULT})
|
||||
|
||||
# Re-allow on FreeBSD once its on mainline ports
|
||||
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "WIN32 OR PLATFORM_LINUX OR APPLE" OFF)
|
||||
@@ -263,13 +189,7 @@ option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
|
||||
|
||||
option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF)
|
||||
if(YUZU_ENABLE_LTO)
|
||||
include(CheckIPOSupported)
|
||||
check_ipo_supported(RESULT COMPILER_SUPPORTS_LTO)
|
||||
if(NOT COMPILER_SUPPORTS_LTO)
|
||||
message(FATAL_ERROR "Your compiler does not support interprocedural optimization (IPO). Re-run CMake with -DYUZU_ENABLE_LTO=OFF.")
|
||||
endif()
|
||||
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
|
||||
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ${COMPILER_SUPPORTS_LTO})
|
||||
include(UseLTO)
|
||||
endif()
|
||||
|
||||
option(USE_CCACHE "Use ccache for compilation" OFF)
|
||||
@@ -283,9 +203,19 @@ if(USE_CCACHE)
|
||||
else()
|
||||
message(FATAL_ERROR "USE_CCACHE enabled, but no executable found at: ${CCACHE_PATH}")
|
||||
endif()
|
||||
# Follow SCCache recommendations:
|
||||
# <https://github.com/mozilla/sccache/blob/main/README.md?plain=1#L144>
|
||||
if(WIN32)
|
||||
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
|
||||
elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo")
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# TODO(crueter): CI this?
|
||||
option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON)
|
||||
|
||||
option(YUZU_LEGACY "Apply patches that improve compatibility with older GPUs (e.g. Snapdragon 865) at the cost of performance" OFF)
|
||||
@@ -295,12 +225,12 @@ cmake_dependent_option(YUZU_ROOM_STANDALONE "Enable standalone room executable"
|
||||
|
||||
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 LINUX" OFF)
|
||||
cmake_dependent_option(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR PLATFORM_LINUX" OFF)
|
||||
|
||||
option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON)
|
||||
set(YUZU_TZDB_PATH "" CACHE STRING "Path to a pre-downloaded timezone database")
|
||||
|
||||
cmake_dependent_option(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "LINUX" OFF)
|
||||
cmake_dependent_option(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "PLATFORM_LINUX" OFF)
|
||||
|
||||
cmake_dependent_option(YUZU_USE_BUNDLED_MOLTENVK "Download bundled MoltenVK lib" ON "APPLE" OFF)
|
||||
|
||||
@@ -317,7 +247,7 @@ if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN)
|
||||
set(DEFAULT_ENABLE_OPENSSL OFF)
|
||||
endif()
|
||||
|
||||
if (ENABLE_WEB_SERVICE)
|
||||
if (ENABLE_WEB_SERVICE OR USE_DISCORD_PRESENCE)
|
||||
set(DEFAULT_ENABLE_OPENSSL ON)
|
||||
endif()
|
||||
|
||||
@@ -330,44 +260,17 @@ if (ENABLE_OPENSSL)
|
||||
option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" ${DEFAULT_YUZU_USE_BUNDLED_OPENSSL})
|
||||
endif()
|
||||
|
||||
# TODO(crueter): CPM this
|
||||
if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL)
|
||||
# TODO(crueter): CPM this
|
||||
set(vvl_version "1.4.321.0")
|
||||
set(vvl_zip_file "${CMAKE_BINARY_DIR}/externals/vvl-android.zip")
|
||||
if (NOT EXISTS "${vvl_zip_file}")
|
||||
# Download and extract validation layer release to externals directory
|
||||
set(vvl_base_url "https://github.com/KhronosGroup/Vulkan-ValidationLayers/releases/download")
|
||||
file(DOWNLOAD "${vvl_base_url}/vulkan-sdk-${vvl_version}/android-binaries-${vvl_version}.zip"
|
||||
"${vvl_zip_file}" SHOW_PROGRESS)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${vvl_zip_file}"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
|
||||
endif()
|
||||
AddJsonPackage(vulkan-validation-layers)
|
||||
|
||||
# Copy the arm64 binary to src/android/app/main/jniLibs
|
||||
set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/arm64-v8a/")
|
||||
file(COPY "${CMAKE_BINARY_DIR}/externals/android-binaries-${vvl_version}/arm64-v8a/libVkLayer_khronos_validation.so"
|
||||
set(abi ${CMAKE_ANDROID_ARCH_ABI})
|
||||
|
||||
set(vvl_lib_path "${CMAKE_CURRENT_SOURCE_DIR}/src/android/app/src/main/jniLibs/${abi}/")
|
||||
file(COPY "${VVL_SOURCE_DIR}/${abi}/libVkLayer_khronos_validation.so"
|
||||
DESTINATION "${vvl_lib_path}")
|
||||
endif()
|
||||
|
||||
if (ANDROID)
|
||||
set(CMAKE_SKIP_INSTALL_RULES ON)
|
||||
set(CMAKE_POLICY_VERSION_MINIMUM 3.5) # Workaround for Oboe
|
||||
endif()
|
||||
|
||||
# We need to downgrade debug info (/Zi -> /Z7) to use an older but more cacheable format
|
||||
# See https://github.com/nanoant/CMakePCHCompiler/issues/21
|
||||
if(WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"))
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
|
||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
||||
endif()
|
||||
|
||||
# Default to a Release build
|
||||
get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if (NOT IS_MULTI_CONFIG AND NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE)
|
||||
message(STATUS "Defaulting to a Release build")
|
||||
endif()
|
||||
|
||||
if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit)
|
||||
if (EXISTS ${PROJECT_SOURCE_DIR}/.git/)
|
||||
message(STATUS "Copying pre-commit hook")
|
||||
@@ -375,25 +278,23 @@ if(EXISTS ${PROJECT_SOURCE_DIR}/hooks/pre-commit AND NOT EXISTS ${PROJECT_SOURCE
|
||||
endif()
|
||||
endif()
|
||||
|
||||
configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc
|
||||
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc
|
||||
set(compat_base dist/compatibility_list/compatibility_list)
|
||||
set(compat_qrc ${compat_base}.qrc)
|
||||
set(compat_json ${compat_base}.json)
|
||||
|
||||
configure_file(${PROJECT_SOURCE_DIR}/${compat_qrc}
|
||||
${PROJECT_BINARY_DIR}/${compat_qrc}
|
||||
COPYONLY)
|
||||
|
||||
if (EXISTS ${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json)
|
||||
configure_file("${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json"
|
||||
"${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json"
|
||||
if (EXISTS ${PROJECT_SOURCE_DIR}/${compat_json})
|
||||
configure_file("${PROJECT_SOURCE_DIR}/${compat_json}"
|
||||
"${PROJECT_BINARY_DIR}/${compat_json}"
|
||||
COPYONLY)
|
||||
endif()
|
||||
|
||||
if (ENABLE_COMPATIBILITY_LIST_DOWNLOAD AND NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json)
|
||||
message(STATUS "Downloading compatibility list for yuzu...")
|
||||
file(DOWNLOAD
|
||||
https://api.yuzu-emu.org/gamedb/
|
||||
"${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" SHOW_PROGRESS)
|
||||
endif()
|
||||
|
||||
if (NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json)
|
||||
file(WRITE ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json "")
|
||||
# TODO: Compat list download
|
||||
if (NOT EXISTS ${PROJECT_BINARY_DIR}/${compat_json})
|
||||
file(WRITE ${PROJECT_BINARY_DIR}/${compat_json} "")
|
||||
endif()
|
||||
|
||||
if (YUZU_LEGACY)
|
||||
@@ -475,8 +376,6 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
||||
# System imported libraries
|
||||
# =======================================================================
|
||||
|
||||
include(CPMUtil)
|
||||
|
||||
# openssl funniness
|
||||
if (ENABLE_OPENSSL)
|
||||
if (YUZU_USE_BUNDLED_OPENSSL)
|
||||
@@ -568,6 +467,7 @@ if (YUZU_USE_CPM)
|
||||
add_library(Opus::opus ALIAS opus)
|
||||
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)
|
||||
|
||||
@@ -581,15 +481,12 @@ else()
|
||||
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)
|
||||
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID)
|
||||
find_package(gamemode 1.7 MODULE)
|
||||
endif()
|
||||
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)
|
||||
@@ -631,17 +528,16 @@ endfunction()
|
||||
|
||||
if (APPLE)
|
||||
# Umbrella framework for everything GUI-related
|
||||
find_library(COCOA_LIBRARY Cocoa)
|
||||
find_library(COCOA_LIBRARY Cocoa REQUIRED)
|
||||
find_library(IOKIT_LIBRARY IOKit REQUIRED)
|
||||
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
|
||||
find_library(ICONV_LIBRARY iconv REQUIRED)
|
||||
list(APPEND PLATFORM_LIBRARIES ${ICONV_LIBRARY})
|
||||
elseif (WIN32)
|
||||
# Target Windows 10
|
||||
add_compile_definitions(_WIN32_WINNT=0x0A00 WINVER=0x0A00)
|
||||
set(PLATFORM_LIBRARIES winmm ws2_32 iphlpapi)
|
||||
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} winmm iphlpapi ws2_32 wlanapi)
|
||||
if (MINGW)
|
||||
# PSAPI is the Process Status API
|
||||
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version)
|
||||
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version crypt32 rpcrt4 gdi32 wldap32 mswsock)
|
||||
endif()
|
||||
elseif (PLATFORM_HAIKU)
|
||||
# Haiku is so special :)
|
||||
@@ -654,6 +550,8 @@ elseif (CMAKE_SYSTEM_NAME MATCHES "^(Linux|kFreeBSD|GNU|SunOS)$")
|
||||
set(PLATFORM_LIBRARIES rt)
|
||||
endif()
|
||||
|
||||
message(STATUS "Platform Libraries: ${PLATFORM_LIBRARIES}")
|
||||
|
||||
add_subdirectory(externals)
|
||||
|
||||
# pass targets from externals
|
||||
@@ -665,6 +563,7 @@ find_package(VulkanUtilityLibraries)
|
||||
find_package(SimpleIni)
|
||||
find_package(SPIRV-Tools)
|
||||
find_package(sirit)
|
||||
find_package(gamemode)
|
||||
|
||||
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
||||
find_package(xbyak)
|
||||
@@ -773,11 +672,6 @@ if(ENABLE_QT)
|
||||
set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "")
|
||||
endif()
|
||||
|
||||
if (UNIX AND NOT APPLE AND NOT ANDROID)
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(LIBVA libva)
|
||||
endif()
|
||||
|
||||
if (NOT (YUZU_USE_BUNDLED_FFMPEG OR YUZU_USE_EXTERNAL_FFMPEG))
|
||||
# Use system installed FFmpeg
|
||||
find_package(FFmpeg REQUIRED QUIET COMPONENTS ${FFmpeg_COMPONENTS})
|
||||
@@ -804,54 +698,6 @@ endif()
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
# Setup a custom clang-format target (if clang-format can be found) that will run
|
||||
# against all the src files. This should be used before making a pull request.
|
||||
# =======================================================================
|
||||
|
||||
set(CLANG_FORMAT_POSTFIX "-15")
|
||||
find_program(CLANG_FORMAT
|
||||
NAMES clang-format${CLANG_FORMAT_POSTFIX}
|
||||
clang-format
|
||||
PATHS ${PROJECT_BINARY_DIR}/externals)
|
||||
# if find_program doesn't find it, try to download from externals
|
||||
if (NOT CLANG_FORMAT)
|
||||
if (WIN32 AND NOT CMAKE_CROSSCOMPILING)
|
||||
message(STATUS "Clang format not found! Downloading...")
|
||||
set(CLANG_FORMAT "${PROJECT_BINARY_DIR}/externals/clang-format${CLANG_FORMAT_POSTFIX}.exe")
|
||||
file(DOWNLOAD
|
||||
https://github.com/eden-emulator/ext-windows-bin/raw/master/clang-format${CLANG_FORMAT_POSTFIX}.exe
|
||||
"${CLANG_FORMAT}" SHOW_PROGRESS
|
||||
STATUS DOWNLOAD_SUCCESS)
|
||||
if (NOT DOWNLOAD_SUCCESS EQUAL 0)
|
||||
message(WARNING "Could not download clang format! Disabling the clang format target")
|
||||
file(REMOVE ${CLANG_FORMAT})
|
||||
unset(CLANG_FORMAT)
|
||||
endif()
|
||||
else()
|
||||
message(WARNING "Clang format not found! Disabling the clang format target")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (CLANG_FORMAT)
|
||||
set(SRCS ${PROJECT_SOURCE_DIR}/src)
|
||||
set(CCOMMENT "Running clang format against all the .h and .cpp files in src/")
|
||||
if (WIN32)
|
||||
add_custom_target(clang-format
|
||||
COMMAND powershell.exe -Command "Get-ChildItem '${SRCS}/*' -Include *.cpp,*.h -Recurse | Foreach {&'${CLANG_FORMAT}' -i $_.fullname}"
|
||||
COMMENT ${CCOMMENT})
|
||||
elseif(MINGW)
|
||||
add_custom_target(clang-format
|
||||
COMMAND find `cygpath -u ${SRCS}` -iname *.h -o -iname *.cpp | xargs `cygpath -u ${CLANG_FORMAT}` -i
|
||||
COMMENT ${CCOMMENT})
|
||||
else()
|
||||
add_custom_target(clang-format
|
||||
COMMAND find ${SRCS} -iname *.h -o -iname *.cpp | xargs ${CLANG_FORMAT} -i
|
||||
COMMENT ${CCOMMENT})
|
||||
endif()
|
||||
unset(SRCS)
|
||||
unset(CCOMMENT)
|
||||
endif()
|
||||
|
||||
# Include source code
|
||||
# ===================
|
||||
|
||||
@@ -885,47 +731,8 @@ if (MSVC AND CXX_CLANG)
|
||||
link_libraries(llvm-mingw-runtime)
|
||||
endif()
|
||||
|
||||
#[[
|
||||
search order:
|
||||
- gold (GCC only) - the best, generally, but unfortunately not packaged anymore
|
||||
- mold (GCC only) - generally does well on GCC
|
||||
- ldd - preferred on clang
|
||||
- bfd - the final fallback
|
||||
- If none are found (macOS uses ld.prime, etc) just use the default linker
|
||||
]]
|
||||
if (YUZU_USE_FASTER_LD)
|
||||
find_program(LINKER_BFD bfd)
|
||||
if (LINKER_BFD)
|
||||
set(LINKER bfd)
|
||||
endif()
|
||||
|
||||
find_program(LINKER_LLD lld)
|
||||
if (LINKER_LLD)
|
||||
set(LINKER lld)
|
||||
endif()
|
||||
|
||||
if (CXX_GCC)
|
||||
find_program(LINKER_MOLD mold)
|
||||
if (LINKER_MOLD AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1")
|
||||
set(LINKER mold)
|
||||
endif()
|
||||
|
||||
find_program(LINKER_GOLD gold)
|
||||
if (LINKER_GOLD)
|
||||
set(LINKER gold)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (LINKER)
|
||||
message(NOTICE "Selecting ${LINKER} as linker")
|
||||
add_link_options("-fuse-ld=${LINKER}")
|
||||
else()
|
||||
message(WARNING "No faster linker found--using default")
|
||||
endif()
|
||||
|
||||
if (LINKER STREQUAL "lld" AND CXX_GCC)
|
||||
message(WARNING "Using lld on GCC may cause issues with certain LTO settings. If the program fails to compile, disable YUZU_USE_FASTER_LD, or install mold or GNU gold.")
|
||||
endif()
|
||||
include(FasterLinker)
|
||||
endif()
|
||||
|
||||
# Set runtime library to MD/MDd for all configurations
|
||||
@@ -947,14 +754,6 @@ if(MSVC)
|
||||
)
|
||||
endif()
|
||||
|
||||
if (MINGW)
|
||||
# This saves a truly ridiculous amount of time during linking
|
||||
# In my tests, without this it takes 2 mins, with it takes 3-5 seconds
|
||||
# or on GitHub Actions, 10 minutes -> 3 seconds
|
||||
set(MINGW_FLAGS "-Wl,--strip-all -Wl,--gc-sections")
|
||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} ${MINGW_FLAGS}")
|
||||
endif()
|
||||
|
||||
add_subdirectory(src)
|
||||
|
||||
# Set yuzu project or yuzu-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not
|
||||
|
||||
@@ -542,10 +542,11 @@ function(AddCIPackage)
|
||||
PACKAGE
|
||||
EXTENSION
|
||||
MIN_VERSION
|
||||
DISABLED_PLATFORMS
|
||||
)
|
||||
|
||||
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "" ${ARGN})
|
||||
set(multiValueArgs DISABLED_PLATFORMS)
|
||||
|
||||
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
||||
|
||||
if(NOT DEFINED PKG_ARGS_VERSION)
|
||||
message(FATAL_ERROR "[CPMUtil] VERSION is required")
|
||||
@@ -602,8 +603,12 @@ function(AddCIPackage)
|
||||
add_ci_package(mingw-arm64)
|
||||
endif()
|
||||
|
||||
if (ANDROID AND NOT "android" IN_LIST DISABLED_PLATFORMS)
|
||||
add_ci_package(android)
|
||||
if((ANDROID AND ARCHITECTURE_x86_64) AND NOT "android-x86_64" IN_LIST DISABLED_PLATFORMS)
|
||||
add_ci_package(android-x86_64)
|
||||
endif()
|
||||
|
||||
if((ANDROID AND ARCHITECTURE_arm64) AND NOT "android-aarch64" IN_LIST DISABLED_PLATFORMS)
|
||||
add_ci_package(android-aarch64)
|
||||
endif()
|
||||
|
||||
if(PLATFORM_SUN AND NOT "solaris-amd64" IN_LIST DISABLED_PLATFORMS)
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -10,6 +13,10 @@ find_package_handle_standard_args(Opus
|
||||
VERSION_VAR OPUS_VERSION
|
||||
)
|
||||
|
||||
if (PLATFORM_MSYS)
|
||||
FixMsysPath(PkgConfig::OPUS)
|
||||
endif()
|
||||
|
||||
if (Opus_FOUND AND NOT TARGET Opus::opus)
|
||||
add_library(Opus::opus ALIAS PkgConfig::OPUS)
|
||||
endif()
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -10,6 +13,10 @@ find_package_handle_standard_args(SPIRV-Tools
|
||||
VERSION_VAR SPIRV-Tools_VERSION
|
||||
)
|
||||
|
||||
if (PLATFORM_MSYS)
|
||||
FixMsysPath(PkgConfig::SPIRV-Tools)
|
||||
endif()
|
||||
|
||||
if (SPIRV-Tools_FOUND AND NOT TARGET SPIRV-Tools::SPIRV-Tools)
|
||||
if (TARGET SPIRV-Tools)
|
||||
add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools)
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
@@ -11,6 +14,10 @@ find_package_handle_standard_args(enet
|
||||
VERSION_VAR ENET_VERSION
|
||||
)
|
||||
|
||||
if (PLATFORM_MSYS)
|
||||
FixMsysPath(PkgConfig::ENET)
|
||||
endif()
|
||||
|
||||
if (enet_FOUND AND NOT TARGET enet::enet)
|
||||
add_library(enet::enet ALIAS PkgConfig::ENET)
|
||||
endif()
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 Alexandre Bouvier <contact@amb.tf>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
@@ -11,6 +14,10 @@ find_package_handle_standard_args(libusb
|
||||
VERSION_VAR LIBUSB_VERSION
|
||||
)
|
||||
|
||||
if (PLATFORM_MSYS)
|
||||
FixMsysPath(PkgConfig::LIBUSB)
|
||||
endif()
|
||||
|
||||
if (libusb_FOUND AND NOT TARGET libusb::usb)
|
||||
add_library(libusb::usb ALIAS PkgConfig::LIBUSB)
|
||||
endif()
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -9,6 +12,11 @@ if (lz4_CONSIDERED_CONFIGS)
|
||||
else()
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_search_module(LZ4 QUIET IMPORTED_TARGET liblz4)
|
||||
|
||||
if (PLATFORM_MSYS)
|
||||
FixMsysPath(PkgConfig::LZ4)
|
||||
endif()
|
||||
|
||||
find_package_handle_standard_args(lz4
|
||||
REQUIRED_VARS LZ4_LINK_LIBRARIES
|
||||
VERSION_VAR LZ4_VERSION
|
||||
|
||||
@@ -6,22 +6,34 @@
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_search_module(ZSTD QUIET IMPORTED_TARGET libzstd)
|
||||
find_package_handle_standard_args(zstd
|
||||
REQUIRED_VARS ZSTD_LINK_LIBRARIES
|
||||
VERSION_VAR ZSTD_VERSION
|
||||
)
|
||||
find_package(zstd QUIET CONFIG)
|
||||
if (zstd_CONSIDERED_CONFIGS)
|
||||
find_package_handle_standard_args(zstd CONFIG_MODE)
|
||||
else()
|
||||
find_package(PkgConfig QUIET)
|
||||
pkg_search_module(ZSTD QUIET IMPORTED_TARGET libzstd)
|
||||
find_package_handle_standard_args(zstd
|
||||
REQUIRED_VARS ZSTD_LINK_LIBRARIES
|
||||
VERSION_VAR ZSTD_VERSION
|
||||
)
|
||||
endif()
|
||||
|
||||
if (zstd_FOUND AND NOT TARGET zstd::zstd)
|
||||
if (TARGET zstd::libzstd_shared)
|
||||
if (TARGET zstd::libzstd_shared AND NOT YUZU_STATIC_BUILD)
|
||||
add_library(zstd::zstd ALIAS zstd::libzstd_shared)
|
||||
add_library(zstd::libzstd ALIAS zstd::libzstd_shared)
|
||||
elseif (TARGET zstd::libzstd_static)
|
||||
add_library(zstd::zstd ALIAS zstd::libzstd_static)
|
||||
add_library(zstd::libzstd ALIAS zstd::libzstd_static)
|
||||
else()
|
||||
add_library(zstd::zstd ALIAS PkgConfig::ZSTD)
|
||||
add_library(zstd::libzstd ALIAS PkgConfig::ZSTD)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
get_target_property(ZSTD_TARGET zstd::zstd ALIASED_TARGET)
|
||||
|
||||
if (NOT TARGET zstd::libzstd)
|
||||
if (ZSTD_TARGET)
|
||||
add_library(zstd::libzstd ALIAS ${ZSTD_TARGET})
|
||||
else()
|
||||
add_library(zstd::libzstd ALIAS zstd::zstd)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
function(FixMsysPath target)
|
||||
get_target_property(include_dir ${target} INTERFACE_INCLUDE_DIRECTORIES)
|
||||
|
||||
if (NOT (include_dir MATCHES "^/"))
|
||||
return()
|
||||
endif()
|
||||
|
||||
set(root_default $ENV{MSYS2_LOCATION})
|
||||
if (root_default STREQUAL "")
|
||||
set(root_default "C:/msys64")
|
||||
endif()
|
||||
|
||||
set(MSYS_ROOT_PATH ${root_default} CACHE STRING "Location of the MSYS2 root")
|
||||
|
||||
set(include_dir "C:/msys64${include_dir}")
|
||||
set_target_properties(${target} PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES ${include_dir})
|
||||
endfunction()
|
||||
@@ -1,49 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2025 crueter
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
include(GetGitRevisionDescription)
|
||||
|
||||
function(trim var)
|
||||
string(REGEX REPLACE "\n" "" new "${${var}}")
|
||||
set(${var} ${new} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
set(TAG_FILE ${CMAKE_SOURCE_DIR}/GIT-TAG)
|
||||
set(REF_FILE ${CMAKE_SOURCE_DIR}/GIT-REFSPEC)
|
||||
set(COMMIT_FILE ${CMAKE_SOURCE_DIR}/GIT-COMMIT)
|
||||
set(RELEASE_FILE ${CMAKE_SOURCE_DIR}/GIT-RELEASE)
|
||||
|
||||
if (EXISTS ${REF_FILE} AND EXISTS ${COMMIT_FILE})
|
||||
file(READ ${REF_FILE} GIT_REFSPEC)
|
||||
file(READ ${COMMIT_FILE} GIT_COMMIT)
|
||||
else()
|
||||
get_git_head_revision(GIT_REFSPEC GIT_COMMIT)
|
||||
git_branch_name(GIT_REFSPEC)
|
||||
if (GIT_REFSPEC MATCHES "NOTFOUND")
|
||||
set(GIT_REFSPEC 1.0.0)
|
||||
set(GIT_COMMIT stable)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (EXISTS ${TAG_FILE})
|
||||
file(READ ${TAG_FILE} GIT_TAG)
|
||||
else()
|
||||
git_describe(GIT_TAG --tags --abbrev=0)
|
||||
if (GIT_TAG MATCHES "NOTFOUND")
|
||||
set(GIT_TAG "${GIT_REFSPEC}")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (EXISTS ${RELEASE_FILE})
|
||||
file(READ ${RELEASE_FILE} GIT_RELEASE)
|
||||
trim(GIT_RELEASE)
|
||||
message(STATUS "Git release: ${GIT_RELEASE}")
|
||||
endif()
|
||||
|
||||
trim(GIT_REFSPEC)
|
||||
trim(GIT_COMMIT)
|
||||
trim(GIT_TAG)
|
||||
|
||||
message(STATUS "Git commit: ${GIT_COMMIT}")
|
||||
message(STATUS "Git tag: ${GIT_TAG}")
|
||||
message(STATUS "Git refspec: ${GIT_REFSPEC}")
|
||||
@@ -1,58 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
set(MINGW_PREFIX /usr/x86_64-w64-mingw32/)
|
||||
set(CMAKE_SYSTEM_NAME Windows)
|
||||
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||
|
||||
set(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX})
|
||||
set(SDL2_PATH ${MINGW_PREFIX})
|
||||
set(MINGW_TOOL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-)
|
||||
|
||||
# Specify the cross compiler
|
||||
set(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}clang)
|
||||
set(CMAKE_CXX_COMPILER ${MINGW_TOOL_PREFIX}clang++)
|
||||
set(CMAKE_RC_COMPILER ${MINGW_TOOL_PREFIX}windres)
|
||||
set(CMAKE_C_COMPILER_AR ${MINGW_TOOL_PREFIX}ar)
|
||||
set(CMAKE_CXX_COMPILER_AR ${MINGW_TOOL_PREFIX}ar)
|
||||
set(CMAKE_C_COMPILER_RANLIB ${MINGW_TOOL_PREFIX}ranlib)
|
||||
set(CMAKE_CXX_COMPILER_RANLIB ${MINGW_TOOL_PREFIX}ranlib)
|
||||
|
||||
# Mingw tools
|
||||
set(STRIP ${MINGW_TOOL_PREFIX}strip)
|
||||
set(WINDRES ${MINGW_TOOL_PREFIX}windres)
|
||||
set(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config)
|
||||
|
||||
# ccache wrapper
|
||||
option(USE_CCACHE "Use ccache for compilation" OFF)
|
||||
if(USE_CCACHE)
|
||||
find_program(CCACHE ccache)
|
||||
if(CCACHE)
|
||||
message(STATUS "Using ccache found in PATH")
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
|
||||
else(CCACHE)
|
||||
message(WARNING "USE_CCACHE enabled, but no ccache found")
|
||||
endif(CCACHE)
|
||||
endif(USE_CCACHE)
|
||||
|
||||
# Search for programs in the build host directories
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
|
||||
|
||||
# Echo modified cmake vars to screen for debugging purposes
|
||||
if(NOT DEFINED ENV{MINGW_DEBUG_INFO})
|
||||
message("")
|
||||
message("Custom cmake vars: (blank = system default)")
|
||||
message("-----------------------------------------")
|
||||
message("* CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}")
|
||||
message("* CMAKE_CXX_COMPILER : ${CMAKE_CXX_COMPILER}")
|
||||
message("* CMAKE_RC_COMPILER : ${CMAKE_RC_COMPILER}")
|
||||
message("* WINDRES : ${WINDRES}")
|
||||
message("* ENV{PKG_CONFIG} : $ENV{PKG_CONFIG}")
|
||||
message("* STRIP : ${STRIP}")
|
||||
message("* USE_CCACHE : ${USE_CCACHE}")
|
||||
message("")
|
||||
# So that the debug info only appears once
|
||||
set(ENV{MINGW_DEBUG_INFO} SHOWN)
|
||||
endif()
|
||||
@@ -1,57 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2018 tech4me <guiwanglong@gmail.com>
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
set(MINGW_PREFIX /usr/x86_64-w64-mingw32/)
|
||||
set(CMAKE_SYSTEM_NAME Windows)
|
||||
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||
# Actually a hack, w/o this will cause some strange errors
|
||||
set(CMAKE_HOST_WIN32 TRUE)
|
||||
|
||||
|
||||
set(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX})
|
||||
set(SDL2_PATH ${MINGW_PREFIX})
|
||||
set(MINGW_TOOL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-)
|
||||
|
||||
# Specify the cross compiler
|
||||
set(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}gcc)
|
||||
set(CMAKE_CXX_COMPILER ${MINGW_TOOL_PREFIX}g++)
|
||||
set(CMAKE_RC_COMPILER ${MINGW_TOOL_PREFIX}windres)
|
||||
|
||||
# Mingw tools
|
||||
set(STRIP ${MINGW_TOOL_PREFIX}strip)
|
||||
set(WINDRES ${MINGW_TOOL_PREFIX}windres)
|
||||
set(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config)
|
||||
|
||||
# ccache wrapper
|
||||
option(USE_CCACHE "Use ccache for compilation" OFF)
|
||||
if(USE_CCACHE)
|
||||
find_program(CCACHE ccache)
|
||||
if(CCACHE)
|
||||
message(STATUS "Using ccache found in PATH")
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
|
||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
|
||||
else(CCACHE)
|
||||
message(WARNING "USE_CCACHE enabled, but no ccache found")
|
||||
endif(CCACHE)
|
||||
endif(USE_CCACHE)
|
||||
|
||||
# Search for programs in the build host directories
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
|
||||
|
||||
# Echo modified cmake vars to screen for debugging purposes
|
||||
if(NOT DEFINED ENV{MINGW_DEBUG_INFO})
|
||||
message("")
|
||||
message("Custom cmake vars: (blank = system default)")
|
||||
message("-----------------------------------------")
|
||||
message("* CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}")
|
||||
message("* CMAKE_CXX_COMPILER : ${CMAKE_CXX_COMPILER}")
|
||||
message("* CMAKE_RC_COMPILER : ${CMAKE_RC_COMPILER}")
|
||||
message("* WINDRES : ${WINDRES}")
|
||||
message("* ENV{PKG_CONFIG} : $ENV{PKG_CONFIG}")
|
||||
message("* STRIP : ${STRIP}")
|
||||
message("* USE_CCACHE : ${USE_CCACHE}")
|
||||
message("")
|
||||
# So that the debug info only appears once
|
||||
set(ENV{MINGW_DEBUG_INFO} SHOWN)
|
||||
endif()
|
||||
@@ -0,0 +1,31 @@
|
||||
# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
## When linking to a static Qt build on MinGW, certain additional libraries
|
||||
## must be statically linked to as well.
|
||||
|
||||
function(static_qt_link target)
|
||||
macro(extra_libs)
|
||||
foreach(lib ${ARGN})
|
||||
find_library(${lib}_LIBRARY ${lib} REQUIRED)
|
||||
target_link_libraries(${target} PRIVATE ${${lib}_LIBRARY})
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
# I am constantly impressed at how ridiculously stupid the linker is
|
||||
# NB: yes, we have to put them here twice. I have no idea why
|
||||
|
||||
# libtiff.a
|
||||
extra_libs(tiff jbig bz2 lzma deflate jpeg tiff)
|
||||
|
||||
# libfreetype.a
|
||||
extra_libs(freetype bz2 Lerc brotlidec brotlicommon freetype)
|
||||
|
||||
# libharfbuzz.a
|
||||
extra_libs(harfbuzz graphite2)
|
||||
|
||||
# sijfjkfnjkdfjsbjsbsdfhvbdf
|
||||
if (ENABLE_OPENSSL)
|
||||
target_link_libraries(${target} PRIVATE OpenSSL::SSL OpenSSL::Crypto)
|
||||
endif()
|
||||
endfunction()
|
||||
@@ -1,6 +1,5 @@
|
||||
<!--
|
||||
SPDX-FileCopyrightText: 2018 yuzu Emulator Project
|
||||
SPDX-License-Identifier: GPL-2.0-or-later
|
||||
-->
|
||||
# Contributing
|
||||
|
||||
**The Contributor's Guide has moved to [the yuzu wiki](https://github.com/yuzu-emu/yuzu/wiki/Contributing).**
|
||||
You want to contribute? Please consult [the development guide](./docs/Development.md).
|
||||
|
||||
Don't forget to [get a git account](./docs/SIGNUP.md) - not a requirement per se but it's highly recommended.
|
||||
|
||||
@@ -21,13 +21,13 @@ It is written in C++ with portability in mind, and we actively maintain builds f
|
||||
|
||||
<p align="center">
|
||||
</a>
|
||||
<a href="https://discord.gg/kXAmGCXBGD">
|
||||
<a href="https://discord.gg/HstXbPch7X">
|
||||
<img src="https://img.shields.io/discord/1367654015269339267?color=5865F2&label=Eden&logo=discord&logoColor=white"
|
||||
alt="Discord">
|
||||
</a>
|
||||
<a href="https://rvlt.gg/qKgFEAbH">
|
||||
<img src="https://img.shields.io/revolt/invite/qKgFEAbH?color=d61f3a&label=Revolt"
|
||||
alt="Revolt">
|
||||
<a href="https://stt.gg/qKgFEAbH">
|
||||
<img src="https://img.shields.io/revolt/invite/qKgFEAbH?color=d61f3a&label=Stoat"
|
||||
alt="Stoat">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@@ -52,10 +52,10 @@ Check out our [website](https://eden-emu.dev) for the latest news on exciting fe
|
||||
|
||||
## Development
|
||||
|
||||
Most of the development happens on our Git server. It is also where [our central repository](https://git.eden-emu.dev/eden-emu/eden) is hosted. For development discussions, please join us on [Discord](https://discord.gg/kXAmGCXBGD) or [Revolt](https://rvlt.gg/qKgFEAbH).
|
||||
You can also follow us on [X (Twitter)](https://x.com/edenemuofficial) for updates and announcements.
|
||||
Most of the development happens on our Git server. It is also where [our central repository](https://git.eden-emu.dev/eden-emu/eden) is hosted. For development discussions, please join us on [Discord](https://discord.gg/HstXbPch7X) or [Stoat](https://stt.gg/qKgFEAbH).
|
||||
You can also follow us on [X (Twitter)](https://nitter.poast.org/edenemuofficial) for updates and announcements.
|
||||
|
||||
If you would like to contribute, we are open to new developers and pull requests. Please ensure that your work is of a high standard and properly documented. You can also contact any of the developers on Discord or Revolt to learn more about the current state of the emulator.
|
||||
If you would like to contribute, we are open to new developers and pull requests. Please ensure that your work is of a high standard and properly documented. You can also contact any of the developers on Discord or Stoat to learn more about the current state of the emulator.
|
||||
|
||||
See the [sign-up instructions](docs/SIGNUP.md) for information on registration.
|
||||
|
||||
@@ -82,7 +82,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) 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/HstXbPch7X) and talk to Camille or any of our other developers.
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -4,13 +4,8 @@
|
||||
"package": "OpenSSL",
|
||||
"name": "openssl",
|
||||
"repo": "crueter-ci/OpenSSL",
|
||||
"version": "3.6.0",
|
||||
"min_version": "1.1.1",
|
||||
"disabled_platforms": [
|
||||
"macos-universal",
|
||||
"mingw-amd64",
|
||||
"mingw-arm64"
|
||||
]
|
||||
"version": "3.6.0-965d6279e8",
|
||||
"min_version": "1.1.1"
|
||||
},
|
||||
"boost": {
|
||||
"package": "Boost",
|
||||
@@ -20,7 +15,7 @@
|
||||
"hash": "4fb7f6fde92762305aad8754d7643cd918dd1f3f67e104e9ab385b18c73178d72a17321354eb203b790b6702f2cf6d725a5d6e2dfbc63b1e35f9eb59fb42ece9",
|
||||
"git_version": "1.89.0",
|
||||
"version": "1.57",
|
||||
"find_args": "CONFIG",
|
||||
"find_args": "CONFIG OPTIONAL_COMPONENTS headers context system fiber filesystem",
|
||||
"patches": [
|
||||
"0001-clang-cl.patch",
|
||||
"0002-use-marmasm.patch",
|
||||
@@ -30,9 +25,9 @@
|
||||
"fmt": {
|
||||
"repo": "fmtlib/fmt",
|
||||
"tag": "%VERSION%",
|
||||
"hash": "c4ab814c20fbad7e3f0ae169125a4988a2795631194703251481dc36b18da65c886c4faa9acd046b0a295005217b3689eb0126108a9ba5aac2ca909aae263c2f",
|
||||
"hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2",
|
||||
"version": "8",
|
||||
"git_version": "12.0.0"
|
||||
"git_version": "12.1.0"
|
||||
},
|
||||
"lz4": {
|
||||
"name": "lz4",
|
||||
@@ -96,5 +91,13 @@
|
||||
"version": "20250828",
|
||||
"artifact": "clang-rt-builtins.tar.zst",
|
||||
"hash": "d902392caf94e84f223766e2cc51ca5fab6cae36ab8dc6ef9ef6a683ab1c483bfcfe291ef0bd38ab16a4ecc4078344fa8af72da2f225ab4c378dee23f6186181"
|
||||
},
|
||||
"vulkan-validation-layers": {
|
||||
"package": "VVL",
|
||||
"repo": "KhronosGroup/Vulkan-ValidationLayers",
|
||||
"tag": "vulkan-sdk-%VERSION%",
|
||||
"git_version": "1.4.335.0",
|
||||
"artifact": "android-binaries-%VERSION%.zip",
|
||||
"hash": "48167c4a17736301bd08f9290f41830443e1f18cce8ad867fc6f289b49e18b40e93c9850b377951af82f51b5b6d7313aa6a884fc5df79f5ce3df82696c1c1244"
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 9.2 KiB |
|
Before Width: | Height: | Size: 403 KiB After Width: | Height: | Size: 346 KiB |
|
Before Width: | Height: | Size: 39 KiB |
@@ -0,0 +1,9 @@
|
||||
# Icon variations
|
||||
|
||||
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.
|
||||
- `base_small.svg`: Variant used for tiny icons (16x16, 64x64, etc).
|
||||
- `base.svg`: Variant without branding/naming.
|
||||
|
||||
Try to keep the icons simple. And preferably automatically be able to be generated (to reduce maintanaince burden). Additionally keep the files small (use `svgo` and `optipng`) to not clutter the git.
|
||||
|
Before Width: | Height: | Size: 9.2 KiB After Width: | Height: | Size: 6.9 KiB |
@@ -0,0 +1 @@
|
||||
#1F143C
|
||||
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 21 KiB |
@@ -0,0 +1,672 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="512"
|
||||
height="512"
|
||||
fill="none"
|
||||
viewBox="0 0 512 512"
|
||||
version="1.1"
|
||||
id="svg7"
|
||||
sodipodi:docname="newyear2025.svg"
|
||||
inkscape:version="1.4.2 (f4327f4, 2025-05-13)"
|
||||
xml:space="preserve"
|
||||
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">
|
||||
<metadata>
|
||||
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#">
|
||||
<cc:Work rdf:about="">
|
||||
<dc:title>New Year 2025 Logo</dc:title>
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Madeline_Dev</dc:title>
|
||||
<dc:identifier>mailto:madelvidel@gmail.com</dc:identifier>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<dc:date>2025</dc:date>
|
||||
<dc:license rdf:resource="https://www.gnu.org/licenses/gpl-3.0.html"/>
|
||||
<dc:rights>2025 Eden Emulator Project</dc:rights>
|
||||
<dc:source>https://git.eden-emu.dev</dc:source>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs7"><linearGradient
|
||||
id="swatch14"
|
||||
inkscape:swatch="solid"><stop
|
||||
style="stop-color:#66003b;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop14" /></linearGradient><linearGradient
|
||||
id="linearGradient1"
|
||||
inkscape:collect="always"><stop
|
||||
style="stop-color:#670047;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop1" /><stop
|
||||
style="stop-color:#54003b;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2" /></linearGradient><linearGradient
|
||||
id="linearGradient11"
|
||||
inkscape:collect="always"><stop
|
||||
style="stop-color:#60001d;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop11" /><stop
|
||||
style="stop-color:#2f087e;stop-opacity:1;"
|
||||
offset="0.49822688"
|
||||
id="stop20" /><stop
|
||||
style="stop-color:#0d3969;stop-opacity:1;"
|
||||
offset="0.99898213"
|
||||
id="stop12" /></linearGradient><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient11"
|
||||
id="linearGradient12"
|
||||
x1="109.74531"
|
||||
y1="106.54533"
|
||||
x2="431.05463"
|
||||
y2="427.85461"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
spreadMethod="reflect"
|
||||
gradientTransform="translate(-14.100045,-9.900077)" /><linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient1"
|
||||
id="linearGradient2"
|
||||
x1="125.40197"
|
||||
y1="271.834"
|
||||
x2="431.02424"
|
||||
y2="271.834"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.0017288,0,0,0.93676627,-14.581021,3.8948884)" /><filter
|
||||
inkscape:label="Light Contour"
|
||||
inkscape:menu="Image Paint and Draw"
|
||||
inkscape:menu-tooltip="Uses vertical specular light to draw lines"
|
||||
style="color-interpolation-filters:sRGB"
|
||||
id="filter11"
|
||||
x="-0.01907517"
|
||||
y="-0.054959154"
|
||||
width="1.0379885"
|
||||
height="1.1092314"><feGaussianBlur
|
||||
in="SourceGraphic"
|
||||
stdDeviation="0.38250006"
|
||||
result="result3"
|
||||
id="feGaussianBlur9" /><feComponentTransfer
|
||||
result="result1"
|
||||
in="result3"
|
||||
id="feComponentTransfer9"><feFuncR
|
||||
type="discrete"
|
||||
tableValues="0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1"
|
||||
id="feFuncR9" /><feFuncG
|
||||
type="discrete"
|
||||
tableValues="0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1"
|
||||
id="feFuncG9" /><feFuncB
|
||||
type="discrete"
|
||||
tableValues="0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1"
|
||||
id="feFuncB9" /></feComponentTransfer><feGaussianBlur
|
||||
result="result5"
|
||||
stdDeviation="0.01"
|
||||
id="feGaussianBlur10" /><feBlend
|
||||
in2="result5"
|
||||
result="result6"
|
||||
mode="lighten"
|
||||
in="result5"
|
||||
id="feBlend10" /><feColorMatrix
|
||||
in="result6"
|
||||
type="luminanceToAlpha"
|
||||
result="result2"
|
||||
id="feColorMatrix10" /><feSpecularLighting
|
||||
surfaceScale="5"
|
||||
result="result9"
|
||||
specularExponent="20"
|
||||
in="result2"
|
||||
specularConstant="1"
|
||||
id="feSpecularLighting10"><feDistantLight
|
||||
azimuth="180"
|
||||
elevation="90"
|
||||
id="feDistantLight10" /></feSpecularLighting><feComposite
|
||||
in2="result6"
|
||||
operator="arithmetic"
|
||||
in="result9"
|
||||
k1="0.4"
|
||||
k3="0.7"
|
||||
result="result3"
|
||||
id="feComposite10"
|
||||
k2="0"
|
||||
k4="0" /><feBlend
|
||||
in2="result1"
|
||||
in="result3"
|
||||
mode="normal"
|
||||
result="result8"
|
||||
id="feBlend11" /><feComposite
|
||||
in2="SourceGraphic"
|
||||
in="result8"
|
||||
operator="in"
|
||||
result="result7"
|
||||
id="feComposite11" /></filter></defs><sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="1.2"
|
||||
inkscape:cx="255.83333"
|
||||
inkscape:cy="263.75"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1001"
|
||||
inkscape:window-x="-9"
|
||||
inkscape:window-y="-9"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg7"
|
||||
showguides="false" /><circle
|
||||
style="fill:url(#linearGradient12);fill-opacity:1;stroke:#ffef91;stroke-width:12.8318;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
id="path8"
|
||||
cx="256.2999"
|
||||
cy="257.2999"
|
||||
r="227.2" /><path
|
||||
id="path15"
|
||||
style="fill:url(#linearGradient2);fill-opacity:1;stroke:#ffef91;stroke-width:15.499;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 302.36635,44.362459 c 0,0 -10.94894,36.624745 -16.49527,55.212494 -11.84627,8.682797 -19.6374,16.808737 -19.6374,16.808737 0,0 -21.391,-28.349465 -41.79087,-40.140074 C 204.04292,64.453007 176.5496,65.97212 176.5496,65.97212 c 0,0 -11.42088,3.65e-4 -25.24473,5.058903 -13.82386,5.058538 -19.43394,8.430897 -19.43394,8.430897 0,0 14.02577,-0.375072 34.66138,6.182291 20.63562,6.557362 29.65079,10.492882 29.65079,10.492882 l 28.34775,-5.99567 -7.71253,10.117817 c 0,0 13.52412,8.14986 20.83674,15.45664 7.31262,7.30677 10.71771,11.42782 10.71771,11.42782 0,0 -12.72117,-4.96414 -51.78859,-1.59178 -39.06742,3.37236 -77.5342,51.52215 -77.5342,51.52215 0,0 37.66383,-14.61428 59.90221,-19.48547 22.23838,-4.87118 43.47542,-7.30751 43.47542,-7.30751 0,0 -16.82788,6.74508 -34.85899,35.03543 -18.03112,28.29034 -12.82292,73.25622 -12.82292,73.25622 0,0 28.64945,-53.95774 56.09682,-72.131 27.44737,-18.17328 33.05705,-18.73533 33.05705,-18.73533 0,0 -22.03764,44.21537 -30.65251,115.22225 -8.61486,71.00688 27.64733,189.78848 27.64733,189.78848 l 43.67498,-6.37074 c 0,0 -41.67114,-38.5944 -45.27736,-138.26634 -3.60623,-99.67193 15.22549,-159.25026 15.22549,-159.25026 0,0 15.62776,1.12412 38.86787,29.97652 23.2401,28.85239 36.86244,52.4589 36.86244,52.4589 0,0 8.81678,-46.83904 -10.41641,-68.19731 -19.2332,-21.35826 -48.88515,-30.72483 -48.88515,-30.72483 0,0 12.522,-6.08862 38.46678,-4.30877 25.94477,1.77987 79.76265,24.7859 79.76265,24.78589 0,0 -14.44983,-23.31717 -48.30798,-39.47958 -33.85813,-16.16241 -74.32945,0.26713 -74.32945,0.26713 0,0 3.77869,-14.04506 26.5869,-29.81003 22.80821,-15.764974 51.99208,-31.396311 51.99208,-31.396311 0,0 -24.0829,1.06012 -50.43274,10.996027 -6.55623,2.472198 -12.84933,5.755465 -18.60438,9.294477 L 311.98256,46.04937 Z" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="path6"
|
||||
cx="95.957726"
|
||||
cy="394.82724"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse6"
|
||||
cx="99.829285"
|
||||
cy="376.65375"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse7"
|
||||
cx="148.00078"
|
||||
cy="402.74686"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse8"
|
||||
cx="120.2822"
|
||||
cy="380.68512"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse9"
|
||||
cx="124.24197"
|
||||
cy="422.54584"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse10"
|
||||
cx="191.27571"
|
||||
cy="438.38504"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse11"
|
||||
cx="156.48605"
|
||||
cy="444.0419"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse12"
|
||||
cx="156.39783"
|
||||
cy="421.90857"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse13"
|
||||
cx="165.44879"
|
||||
cy="389.66449"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse14"
|
||||
cx="109.53416"
|
||||
cy="338.25873"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse15"
|
||||
cx="74.373444"
|
||||
cy="369.86551"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse16"
|
||||
cx="211.26932"
|
||||
cy="459.80951"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse17"
|
||||
cx="166.38556"
|
||||
cy="326.66217"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse18"
|
||||
cx="143.81549"
|
||||
cy="310.87485"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse19"
|
||||
cx="54.096996"
|
||||
cy="302.62054"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse20"
|
||||
cx="81.161667"
|
||||
cy="337.62143"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse21"
|
||||
cx="197.21542"
|
||||
cy="389.73611"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse22"
|
||||
cx="206.17815"
|
||||
cy="420.49435"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse23"
|
||||
cx="191.47032"
|
||||
cy="355.72336"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse24"
|
||||
cx="123.39349"
|
||||
cy="289.32693"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse25"
|
||||
cx="107.918"
|
||||
cy="312.29456"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse26"
|
||||
cx="171.10564"
|
||||
cy="305.74896"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse27"
|
||||
cx="209.00658"
|
||||
cy="326.02487"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse28"
|
||||
cx="233.13644"
|
||||
cy="449.69873"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse29"
|
||||
cx="209.57225"
|
||||
cy="264.93088"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse30"
|
||||
cx="218.14577"
|
||||
cy="234.45544"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse31"
|
||||
cx="69.087662"
|
||||
cy="241.52652"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse32"
|
||||
cx="79.464607"
|
||||
cy="276.81027"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse33"
|
||||
cx="119.91112"
|
||||
cy="240.88925"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse34"
|
||||
cx="149.54393"
|
||||
cy="212.82214"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse35"
|
||||
cx="87.384209"
|
||||
cy="220.24173"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse36"
|
||||
cx="51.834263"
|
||||
cy="200.23149"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse37"
|
||||
cx="102.46313"
|
||||
cy="170.81586"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse38"
|
||||
cx="154.70078"
|
||||
cy="270.58774"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse39"
|
||||
cx="129.52776"
|
||||
cy="146.70262"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse40"
|
||||
cx="72.393524"
|
||||
cy="155.47075"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse41"
|
||||
cx="125.37337"
|
||||
cy="97.276749"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse42"
|
||||
cx="158.09486"
|
||||
cy="117.85267"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse43"
|
||||
cx="292.81625"
|
||||
cy="413.77774"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse44"
|
||||
cx="324.70099"
|
||||
cy="394.23505"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse45"
|
||||
cx="320.42599"
|
||||
cy="453.44434"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse46"
|
||||
cx="285.09122"
|
||||
cy="385.42184"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse48"
|
||||
cx="338.44168"
|
||||
cy="426.85901"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse49"
|
||||
cx="317.79169"
|
||||
cy="357.43658"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse51"
|
||||
cx="365.49063"
|
||||
cy="399.36642"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse53"
|
||||
cx="279.23981"
|
||||
cy="358.34058"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse54"
|
||||
cx="327.80048"
|
||||
cy="293.78082"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse56"
|
||||
cx="372.42056"
|
||||
cy="428.29486"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse57"
|
||||
cx="291.59659"
|
||||
cy="322.63077"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse58"
|
||||
cx="359.18237"
|
||||
cy="279.07053"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse59"
|
||||
cx="383.58429"
|
||||
cy="372.29739"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse60"
|
||||
cx="397.37979"
|
||||
cy="415.40317"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse63"
|
||||
cx="350.44458"
|
||||
cy="330.60577"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse64"
|
||||
cx="278.86871"
|
||||
cy="290.38669"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse65"
|
||||
cx="293.07599"
|
||||
cy="256.95929"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse66"
|
||||
cx="449.10278"
|
||||
cy="346.04938"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse67"
|
||||
cx="414.35034"
|
||||
cy="351.19788"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse68"
|
||||
cx="419.44153"
|
||||
cy="384.85614"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse70"
|
||||
cx="283.1795"
|
||||
cy="218.42702"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse71"
|
||||
cx="321.29507"
|
||||
cy="243.71765"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse73"
|
||||
cx="391.73221"
|
||||
cy="329.27985"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse75"
|
||||
cx="393.46164"
|
||||
cy="270.81857"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse76"
|
||||
cx="464.73605"
|
||||
cy="270.14359"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse77"
|
||||
cx="429.25717"
|
||||
cy="321.05084"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse78"
|
||||
cx="353.9671"
|
||||
cy="172.07269"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse79"
|
||||
cx="374.46957"
|
||||
cy="217.13043"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse80"
|
||||
cx="386.14307"
|
||||
cy="187.46037"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse81"
|
||||
cx="424.05527"
|
||||
cy="244.35493"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse82"
|
||||
cx="430.8371"
|
||||
cy="285.26224"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse83"
|
||||
cx="402.7533"
|
||||
cy="221.62213"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse84"
|
||||
cx="455.30573"
|
||||
cy="229.30444"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse85"
|
||||
cx="431.69202"
|
||||
cy="189.20061"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse86"
|
||||
cx="464.40521"
|
||||
cy="195.28293"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse87"
|
||||
cx="440.46014"
|
||||
cy="142.81439"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse88"
|
||||
cx="411.80481"
|
||||
cy="146.70259"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse89"
|
||||
cx="351.93036"
|
||||
cy="98.973793"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /><ellipse
|
||||
style="fill:#e6e6e6;stroke-width:0.696631;paint-order:markers stroke fill"
|
||||
id="ellipse90"
|
||||
cx="370.50977"
|
||||
cy="120.6811"
|
||||
rx="1.2"
|
||||
ry="1.1" /><ellipse
|
||||
style="fill:#ffffff;paint-order:markers stroke fill"
|
||||
id="ellipse91"
|
||||
cx="394.07391"
|
||||
cy="106.04485"
|
||||
rx="1.7"
|
||||
ry="1.6"
|
||||
inkscape:label="Ne" /></svg>
|
||||
|
After Width: | Height: | Size: 21 KiB |
@@ -0,0 +1 @@
|
||||
#1F143C
|
||||
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 37 KiB |
@@ -0,0 +1,80 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="512"
|
||||
height="512"
|
||||
fill="none"
|
||||
viewBox="0 0 512 512"
|
||||
version="1.1"
|
||||
id="svg7"
|
||||
sodipodi:docname="base_small.svg"
|
||||
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
|
||||
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">
|
||||
<defs
|
||||
id="defs7">
|
||||
<linearGradient
|
||||
id="linearGradient10"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
style="stop-color:#f977d9;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop10" />
|
||||
<stop
|
||||
style="stop-color:#a655d5;stop-opacity:1;"
|
||||
offset="0.54051435"
|
||||
id="stop13" />
|
||||
<stop
|
||||
style="stop-color:#984fd5;stop-opacity:1;"
|
||||
offset="0.5714342"
|
||||
id="stop12" />
|
||||
<stop
|
||||
style="stop-color:#8c4ad4;stop-opacity:1;"
|
||||
offset="0.59666741"
|
||||
id="stop14" />
|
||||
<stop
|
||||
style="stop-color:#3928d2;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop11" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient10"
|
||||
id="linearGradient11"
|
||||
x1="264.17508"
|
||||
y1="28.385544"
|
||||
x2="264.17508"
|
||||
y2="488.65109"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.97815818,0,0,0.97880258,4.570042,5.8799159)" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview7"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:zoom="0.88388348"
|
||||
inkscape:cx="153.30075"
|
||||
inkscape:cy="243.24473"
|
||||
inkscape:window-width="1600"
|
||||
inkscape:window-height="849"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg7"
|
||||
showguides="false" />
|
||||
<path
|
||||
id="path9"
|
||||
style="fill:url(#linearGradient11);fill-opacity:1;stroke:none;stroke-width:13.3314;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="M 262.97461 33.6875 A 218.44267 225.23091 0 0 0 138.83789 73.589844 L 141.13867 72.265625 L 161.2207 65.195312 L 181.01953 61.517578 L 204.35352 64.205078 L 228.96094 76.650391 L 265.80078 115 L 283 99.400391 L 304.59961 85.800781 L 331 76.400391 L 360.59961 69.599609 L 379.95508 69.208984 A 218.44267 225.23091 0 0 0 262.97461 33.6875 z M 380.07617 69.291016 L 350.19922 77.800781 L 329.19922 89.199219 L 307.40039 108 L 288.80078 129.80078 L 287.40039 135 L 302.40039 129.59961 L 319 127.80078 L 348.80078 131.80078 L 370.19922 141.40039 L 393 161.40039 L 399.59961 171.59961 L 374.80078 160.80078 L 338.40039 150.80078 L 309.19922 150 L 288.80078 154.40039 L 293.19922 155.19922 L 319.19922 168.80078 L 338 187.19922 L 350.80078 224 L 349.19922 260 L 326 222.80078 L 302.80078 194 L 277.59961 172.40039 L 269.19922 187.59961 L 256.80078 281.59961 L 258 364 L 278.40039 452.80078 L 297.19531 481.36914 A 218.44267 225.23091 0 0 0 481.41797 258.91797 A 218.44267 225.23091 0 0 0 380.07617 69.291016 z M 133.07422 77.839844 A 218.44267 225.23091 0 0 0 44.533203 258.91797 A 218.44267 225.23091 0 0 0 257.04102 484.06641 L 247.3457 458.62891 L 237.87109 418.18359 L 233.0625 380.42383 L 230.375 354.9668 L 229.95117 321.30859 L 232.35547 291.32812 L 237.44727 254.98242 L 254.55859 191.9082 L 261.62891 172.5332 L 255.54883 174.08984 L 240.98242 180.87695 L 229.59961 190.19922 L 210.59961 208.19922 L 197.40039 229.40039 L 186.40039 252.59961 L 173.40039 269 L 171.40039 253.19922 L 173.59961 229.40039 L 183 202.40039 L 199.40039 178 L 221.04102 153.44141 L 209.02148 155.70508 L 177.05859 162.77539 L 148.06836 171.40234 L 119.92578 183 L 120.63281 180.16992 L 129.82422 165.88672 L 151.17969 147.50195 L 172.95898 135.48242 L 190.07031 129.54102 L 209.02148 127.98633 L 227.6875 128.69336 L 247.76953 128.41016 L 246.49805 125.1582 L 226.69922 105.92383 L 219.62695 97.439453 L 221.4668 90.085938 L 206.75781 94.044922 L 195.86914 95.458984 L 179.46289 88.671875 L 156.12891 81.458984 L 133.07422 77.839844 z " />
|
||||
<path
|
||||
style="fill:#1b1b1b;fill-opacity:0.12492698;stroke:none;stroke-width:13.374;stroke-opacity:0.415999;paint-order:stroke fill markers"
|
||||
d="m 259.36665,490.16617 39.03323,-6.96642 -20,-30.4 -20.4,-88.8 -1.2,-82.4 12.4,-94 8.4,-15.2 25.2,21.6 23.2,28.8 23.2,37.2 1.6,-36 -12.8,-36.8 -18.8,-18.4 -26,-13.6 -4.4,-0.8 20.4,-4.4 29.2,0.8 36.4,10 24.8,10.8 -6.6,-10.2 -22.8,-20 -21.4,-9.6 -29.8,-4 -16.6,1.8 -15,5.4 1.4,-5.2 18.6,-21.8 21.8,-18.800003 21,-11.4 30.2,-8.6 -19.8,0.4 -29.6,6.8 -26.4,9.4 -21.6,13.6 -17.2,15.600003 -36.83882,-38.349628 -24.60732,-12.445079 -23.33452,-2.687006 -19.79899,3.676955 -20.08184,7.071068 -9.33381,5.374012 24.32448,3.818376 23.33452,7.212489 16.40488,6.788226 10.88944,-1.414214 14.70782,-3.959798 -1.83847,7.353911 7.07106,8.485288 19.79899,19.2333 1.2728,3.25269 -20.08184,0.28284 -18.66762,-0.7071 -18.95046,1.55563 -17.11198,5.9397 -21.77889,12.02081 -21.35462,18.38478 -9.19239,14.28356 -0.70711,2.82843 28.14285,-11.59656 28.99138,-8.6267 31.96122,-7.07107 12.02082,-2.26274 -21.64158,24.55783 -16.4,24.4 -9.4,27 -2.2,23.8 2,15.8 13,-16.4 11,-23.2 13.2,-21.2 19,-18 11.38199,-9.32209 14.5664,-6.78822 6.08112,-1.55564 -7.07107,19.37473 -17.11198,63.07393 -5.09117,36.34528 -2.40416,29.98133 0.42426,33.65828 2.68701,25.45585 4.80832,37.7595 9.47523,40.44651 z"
|
||||
id="path8-4" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 54 KiB |
@@ -821,31 +821,6 @@ QTabBar QToolButton::left-arrow:disabled {
|
||||
image: url(:/qss_icons/rc/left_arrow_disabled.png);
|
||||
}
|
||||
|
||||
QDockWidget {
|
||||
background: #31363b;
|
||||
border: 1px solid #403F3F;
|
||||
titlebar-close-icon: url(:/qss_icons/rc/close.png);
|
||||
titlebar-normal-icon: url(:/qss_icons/rc/undock.png);
|
||||
}
|
||||
|
||||
QDockWidget::close-button,
|
||||
QDockWidget::float-button {
|
||||
border: 1px solid transparent;
|
||||
border-radius: 2px;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
QDockWidget::close-button:hover,
|
||||
QDockWidget::float-button:hover {
|
||||
background: rgba(255, 255, 255, 10);
|
||||
}
|
||||
|
||||
QDockWidget::close-button:pressed,
|
||||
QDockWidget::float-button:pressed {
|
||||
padding: 1px -1px -1px 1px;
|
||||
background: rgba(255, 255, 255, 10);
|
||||
}
|
||||
|
||||
QTreeView,
|
||||
QListView {
|
||||
border: 1px solid #54575B;
|
||||
|
||||
@@ -1685,54 +1685,6 @@ QTabBar QToolButton::right-arrow:disabled {
|
||||
image: url(":/qss_icons/rc/arrow_right_disabled.png");
|
||||
}
|
||||
|
||||
/* QDockWiget -------------------------------------------------------------
|
||||
|
||||
--------------------------------------------------------------------------- */
|
||||
QDockWidget {
|
||||
outline: 1px solid #32414B;
|
||||
background-color: #19232D;
|
||||
border: 1px solid #32414B;
|
||||
border-radius: 4px;
|
||||
titlebar-close-icon: url(":/qss_icons/rc/window_close.png");
|
||||
titlebar-normal-icon: url(":/qss_icons/rc/window_undock.png");
|
||||
}
|
||||
|
||||
QDockWidget::title {
|
||||
/* Better size for title bar */
|
||||
padding: 6px;
|
||||
spacing: 4px;
|
||||
border: none;
|
||||
background-color: #32414B;
|
||||
}
|
||||
|
||||
QDockWidget::close-button {
|
||||
background-color: #32414B;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
QDockWidget::close-button:hover {
|
||||
image: url(":/qss_icons/rc/window_close_focus.png");
|
||||
}
|
||||
|
||||
QDockWidget::close-button:pressed {
|
||||
image: url(":/qss_icons/rc/window_close_pressed.png");
|
||||
}
|
||||
|
||||
QDockWidget::float-button {
|
||||
background-color: #32414B;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
QDockWidget::float-button:hover {
|
||||
image: url(":/qss_icons/rc/window_undock_focus.png");
|
||||
}
|
||||
|
||||
QDockWidget::float-button:pressed {
|
||||
image: url(":/qss_icons/rc/window_undock_pressed.png");
|
||||
}
|
||||
|
||||
/* QTreeView QListView QTableView -----------------------------------------
|
||||
|
||||
https://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qtreeview
|
||||
|
||||
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
@@ -26,7 +26,7 @@ Android has a completely different build process than other platforms. See its [
|
||||
|
||||
If the configure phase fails, see the `Troubleshooting` section below. Usually, as long as you followed the dependencies guide, the defaults *should* successfully configure and build.
|
||||
|
||||
### Qt Creator
|
||||
### Option A: Qt Creator
|
||||
|
||||
This is the recommended GUI method for Linux, macOS, and Windows.
|
||||
|
||||
@@ -46,39 +46,51 @@ Hit "Configure Project", then wait for CMake to finish configuring (may take a w
|
||||
|
||||
</details>
|
||||
|
||||
### Command Line
|
||||
|
||||
This is recommended for *BSD, Solaris, Linux, and MSYS2. MSVC is possible, but not recommended.
|
||||
### Option B: Command Line
|
||||
|
||||
<details>
|
||||
<summary>Click to Open</summary>
|
||||
|
||||
Note that CMake must be in your PATH, and you must be in the cloned Eden directory. On Windows, you must also set up a Visual C++ development environment. This can be done by running `C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat` in the same terminal.
|
||||
|
||||
Recommended generators:
|
||||
> [!WARNING]
|
||||
>For all systems:
|
||||
>- *CMake* **MUST** be in your PATH (and also *ninja*, if you are using it as `<GENERATOR>`)
|
||||
>- You *MUST* be in the cloned *Eden* directory
|
||||
>
|
||||
>On Windows:
|
||||
> - It's recommended to install **[Ninja](https://ninja-build.org/)**
|
||||
> - You must load **Visual C++ development environment**, this can be done by running our convenience script:
|
||||
> - `tools/windows/load-msvc-env.ps1` (for PowerShell 5+)
|
||||
> - `tools/windows/load-msvc-env.sh` (for MSYS2, Git Bash, etc)
|
||||
|
||||
Available `<GENERATOR>`:
|
||||
- MSYS2: `MSYS Makefiles`
|
||||
- MSVC: Install **[ninja](https://ninja-build.org/)** and use `Ninja`, OR use `Visual Studio 17 2022`
|
||||
- MSVC: `Ninja` (preferred) or `Visual Studio 17 2022`
|
||||
- macOS: `Ninja` (preferred) or `Xcode`
|
||||
- Others: `Ninja` (preferred) or `UNIX Makefiles`
|
||||
|
||||
BUILD_TYPE should usually be `Release` or `RelWithDebInfo` (debug symbols--compiled executable will be large). If you are using a debugger and annoyed with stuff getting optimized out, try `Debug`.
|
||||
Available `<BUILD_TYPE>`:
|
||||
- `Release` (default)
|
||||
- `RelWithDebInfo` (debug symbols--compiled executable will be large)
|
||||
- `Debug` (if you are using a debugger and annoyed with stuff getting optimized out)
|
||||
|
||||
Caveat for Debug Builds:
|
||||
- If you're building with CCache, you will need to add the environment variable `CL` with the `/FS` flag ([Reference](https://learn.microsoft.com/pt-br/cpp/build/reference/fs-force-synchronous-pdb-writes?view=msvc-170))
|
||||
|
||||
Also see the [Options](Options.md) page for additional CMake options.
|
||||
|
||||
```sh
|
||||
cmake -S . -B build -G "GENERATOR" -DCMAKE_BUILD_TYPE=<BUILD_TYPE> -DYUZU_TESTS=OFF
|
||||
cmake -S . -B build -G "<GENERATOR>" -DCMAKE_BUILD_TYPE=<BUILD_TYPE> -DYUZU_TESTS=OFF
|
||||
```
|
||||
|
||||
If you are on Windows and prefer to use Clang:
|
||||
|
||||
```sh
|
||||
cmake -S . -B build -G "GENERATOR" -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl
|
||||
cmake -S . -B build -G "<GENERATOR>" -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
### [CLion](https://www.jetbrains.com/clion/)
|
||||
### Option C: [CLion](https://www.jetbrains.com/clion/)
|
||||
|
||||
<details>
|
||||
<summary>Click to Open</summary>
|
||||
@@ -125,7 +137,7 @@ If your initial configure failed:
|
||||
- Evaluate the error and find any related settings
|
||||
- See the [CPM docs](CPM.md) to see if you may need to forcefully bundle any packages
|
||||
|
||||
Otherwise, feel free to ask for help in Revolt or Discord.
|
||||
Otherwise, feel free to ask for help in Stoat or Discord.
|
||||
|
||||
## Caveats
|
||||
|
||||
@@ -133,13 +145,13 @@ Many platforms have quirks, bugs, and other fun stuff that may cause issues when
|
||||
|
||||
## Building & Running
|
||||
|
||||
### Qt Creator
|
||||
### On Qt Creator
|
||||
|
||||
Simply hit Ctrl+B, or the "hammer" icon in the bottom left. To run, hit the "play" icon, or Ctrl+R.
|
||||
|
||||
### Command Line
|
||||
### On Command Line
|
||||
|
||||
If you are not on Windows and are using the `UNIX Makefiles` generator, you must also add `-j$(nproc)` to this command.
|
||||
If you are using the `UNIX Makefiles` or `Visual Studio 17 2022` as `<GENERATOR>`, you should also add `--parallel` for faster build times.
|
||||
|
||||
```
|
||||
cmake --build build
|
||||
@@ -157,4 +169,4 @@ Some platforms have convenience scripts provided for building.
|
||||
- **[Linux](scripts/Linux.md)**
|
||||
- **[Windows](scripts/Windows.md)**
|
||||
|
||||
macOS scripts will come soon.
|
||||
macOS scripts will come soon.
|
||||
|
||||
@@ -30,6 +30,13 @@ macOS is largely untested. Expect crashes, significant Vulkan issues, and other
|
||||
|
||||
## Solaris
|
||||
|
||||
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`.
|
||||
|
||||
Qt Widgets appears to be broken. For now, add `-DENABLE_QT=OFF` to your configure command. In the meantime, a Qt Quick frontend is in the works--check back later!
|
||||
|
||||
This is needed for some dependencies that call cc directly (tz):
|
||||
@@ -70,11 +77,13 @@ For this reason this patch is NOT applied to default on all platforms (for obvio
|
||||
|
||||
Still will not run flawlessly until `mesa-24` is available. Modify CMakeCache.txt with the `.so` of libGL and libGLESv2 by doing the incredibly difficult task of copy pasting them (`cp /boot/system/lib/libGL.so .`)
|
||||
|
||||
If you have `quazip1_qt6_devel`, uninstall it. It may call `Core5Compat` on CMake which is wrongly packaged.
|
||||
|
||||
## OpenBSD
|
||||
|
||||
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`.
|
||||
`-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`.
|
||||
|
||||
@@ -92,11 +101,17 @@ ip6addrctl=YES
|
||||
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`. Then build with `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -B build`.
|
||||
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`
|
||||
- `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`
|
||||
|
||||
Make may error out when generating C++ headers of SPIRV shaders, hence it's recommended to use `gmake` over the default system one.
|
||||
|
||||
glslang is not available on NetBSD, to circumvent this simply build glslang by yourself:
|
||||
[parallel/spirv-tools](https://iso.us.netbsd.org/pub/pkgsrc/current/pkgsrc/parallel/spirv-tools/index.html) isn't available in binary form and must be build from source.
|
||||
|
||||
Such that glslang is not available on NetBSD, to circumvent this simply build glslang by yourself:
|
||||
```sh
|
||||
pkgin python313
|
||||
git clone --depth=1 https://github.com/KhronosGroup/glslang.git
|
||||
@@ -107,6 +122,23 @@ cmake --build build -- -j`nproc`
|
||||
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.
|
||||
|
||||
# DragonFlyBSD
|
||||
|
||||
If `libstdc++.so.6` is not found (`GLIBCXX_3.4.30`) then attempt:
|
||||
```sh
|
||||
rm /usr/local/lib/gcc11/libstdc++.so.6
|
||||
ln -s /usr/local/lib/gcc14/libstdc++.so /usr/local/lib/gcc11/libstdc++.so.6
|
||||
```
|
||||
This may have unforeseen consequences of which we don't need to worry about for now.
|
||||
|
||||
Default `g++` (and the libstdc++) is too outdated - so install `gcc14` and redirect CMake to the new compiler toolchain `-DCMAKE_CXX_COMPILER=gcc14 -DCMAKE_C_COMPILER=g++14`.
|
||||
|
||||
There is also `llvm18` and use `-DCMAKE_CXX_COMPILER=clang++18 -DCMAKE_C_COMPILER=clang18` (note the `18` suffix at the end). NOTE: It doesn't have an updated libcxx so `<span>` will be missing, either build it manually or use gcc.
|
||||
|
||||
If build hangs, use `hammer2 bulkfree`.
|
||||
|
||||
## MSYS2
|
||||
|
||||
`qt6-static` isn't supported yet.
|
||||
@@ -169,3 +201,9 @@ find ./*/ -name "*.dll" | while read -r dll; do deps "$dll"; done
|
||||
DirectX 12 is not available - simply copy and paste a random DLL and name it `d3d12.dll`.
|
||||
|
||||
Install [Qt6 compatibility libraries](github.com/ANightly/qt6windows7) specifically Qt 6.9.5.
|
||||
|
||||
## RedoxOS
|
||||
|
||||
The package install may randomly hang at times, in which case it has to be restarted. ALWAYS do a `sudo pkg update` or the chances of it hanging will be close to 90%. If "multiple" installs fail at once, try installing 1 by 1 the packages.
|
||||
|
||||
When CMake invokes certain file syscalls - it may sometimes cause crashes or corruptions on the (kernel?) address space - so reboot the system if there is a "hang" in CMake.
|
||||
|
||||
@@ -8,6 +8,8 @@ But for new developers you may find that following these guidelines will make ev
|
||||
|
||||
Simply put, types/classes are named as `PascalCase`, same for methods and functions like `AddElement`. Variables are named `like_this_snake_case` and constants are `IN_SCREAMING_CASE`.
|
||||
|
||||
Except for Qt MOC where `functionName` is preferred.
|
||||
|
||||
Template typenames prefer short names like `T`, `I`, `U`, if a longer name is required either `Iterator` or `perform_action` are fine as well.
|
||||
|
||||
Macros must always be in `SCREAMING_CASE`. Do not use short letter macros as systems like Solaris will conflict with them; a good rule of thumb is >5 characters per macro - i.e `THIS_MACRO_IS_GOOD`, `AND_ALSO_THIS_ONE`.
|
||||
|
||||
@@ -3,10 +3,13 @@
|
||||
To build Eden, you MUST have a C++ compiler.
|
||||
* On Linux, this is usually [GCC](https://gcc.gnu.org/) 11+ or [Clang](https://clang.llvm.org/) v14+
|
||||
- GCC 12 also requires Clang 14+
|
||||
* On Windows, this is either:
|
||||
- **[MSVC](https://visualstudio.microsoft.com/downloads/)** (you should select *Community* option),
|
||||
- clang-cl - can be downloaded from the MSVC installer,
|
||||
- or **[MSYS2](https://www.msys2.org)**
|
||||
* On Windows, we support:
|
||||
- **[MSVC](https://visualstudio.microsoft.com/downloads/)** (default)
|
||||
- It's STRONGLY RECOMMENDED to use the **Community** option and **Visual Studio 2022**
|
||||
- You need to install: **[Desktop development with C++](https://learn.microsoft.com/en-us/cpp/build/vscpp-step-0-installation?view=msvc-170)**
|
||||
- **[clang-cl](https://learn.microsoft.com/en-us/cpp/build/clang-support-msbuild?view=msvc-180)**
|
||||
- You need to install: **C++ Clang tools for Windows**
|
||||
- **[MSYS2](https://www.msys2.org)** (experimental)
|
||||
* On macOS, this is Apple Clang
|
||||
- This can be installed with `xcode-select --install`
|
||||
|
||||
@@ -15,20 +18,23 @@ The following additional tools are also required:
|
||||
* **[CMake](https://www.cmake.org/)** 3.22+ - already included with the Android SDK
|
||||
* **[Git](https://git-scm.com/)** for version control
|
||||
- **[Windows installer](https://gitforwindows.org)**
|
||||
* **[Python3](https://www.python.org/downloads/)** 3.10+ - necessary to download external repositories
|
||||
* On Windows, you must install the **[Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows)** as well
|
||||
- *A convenience script to install the latest SDK is provided in `.ci/windows/install-vulkan-sdk.ps1`*
|
||||
- *A convenience script to install the latest SDK is provided in:*
|
||||
- `tools/windows/install-vulkan-sdk.ps1` (for PowerShell 5+)
|
||||
- `tools/windows/install-vulkan-sdk.sh` (for MSYS2, Git Bash, etc)
|
||||
|
||||
If you are on desktop and plan to use the Qt frontend, you *must* install Qt 6, and optionally Qt Creator (the recommended IDE for building)
|
||||
If you are on desktop and plan to use the Qt frontend, you *must* install Qt 6, and optionally Qt Creator (the **RECOMMENDED** IDE for building)
|
||||
* On Linux, *BSD and macOS, this can be done by the package manager
|
||||
- If you wish to use Qt Creator, append `qtcreator` or `qt-creator` to the commands seen below.
|
||||
* MSVC/clang-cl users on Windows must install through the [official installer](https://www.qt.io/download-qt-installer-oss)
|
||||
* MSVC/clang-cl users on Windows must install through the official [Qt](https://www.qt.io/download-qt-installer-oss) installer
|
||||
* Linux and macOS users may choose to use the installer as well.
|
||||
* MSYS2 can also install Qt 6 via the package manager
|
||||
|
||||
If you are on Windows, a convenience script to install MSVC, MSYS2, Qt, all necessary packages for MSYS2, and set up a zsh environment with useful keybinds and aliases can be found [here](https://git.crueter.xyz/scripts/windev).
|
||||
- For help setting up Qt Creator, run `./install.sh -h qtcreator`
|
||||
|
||||
If you are on Windows and NOT building with MSYS2, you may go [back home](Build.md) and continue.
|
||||
If you are on **Windows** and building with **MSVC** or **clang-cl**, you may go [back home](Build.md) and continue.
|
||||
|
||||
## Externals
|
||||
The following are handled by Eden's externals:
|
||||
@@ -177,6 +183,8 @@ sudo dnf config-manager --enable crb
|
||||
sudo dnf install qt6-qtbase-private-devel
|
||||
```
|
||||
|
||||
For systems like OpenEuler or derivates, don't forget to also install: `SDL2-devel pkg-config fmt-dev nlohmann-json-dev`.
|
||||
|
||||
* [RPM Fusion](https://rpmfusion.org/Configuration) is required for `ffmpeg-devel`
|
||||
* Fedora 32 or later is required.
|
||||
* Fedora 36+ users with GCC 12 need Clang and should configure CMake with: `cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -B build`
|
||||
@@ -196,7 +204,6 @@ apk add g++ git cmake make mbedtls-dev mbedtls-static mesa-dev qt6-qtbase-dev qt
|
||||
`mbedtls-static` has to be specified otherwise `libeverest.a` and `libp256m.a` will fail to be found.
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Void Linux</summary>
|
||||
|
||||
@@ -236,7 +243,7 @@ brew install molten-vk vulkan-loader
|
||||
<details>
|
||||
<summary>FreeBSD</summary>
|
||||
|
||||
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/jwt-cpp devel/unordered-dense`
|
||||
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.
|
||||
|
||||
@@ -246,7 +253,7 @@ If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
|
||||
<details>
|
||||
<summary>NetBSD</summary>
|
||||
|
||||
For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv-headers ffmpeg7 libva nlohmann-json jq libopus qt6 mbedtls3 cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1`.
|
||||
For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv-headers ffmpeg7 libva nlohmann-json jq libopus qt6 mbedtls3 cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx`.
|
||||
|
||||
[Caveats](./Caveats.md#netbsd).
|
||||
|
||||
@@ -261,18 +268,23 @@ pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gm
|
||||
|
||||
[Caveats](./Caveats.md#openbsd).
|
||||
|
||||
</details>
|
||||
<details>
|
||||
<summary>DragonFlyBSD</summary>
|
||||
|
||||
```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 quazip-qt6 unordered-dense libva-vdpau-driver libva-utils libva-intel-driver
|
||||
```
|
||||
|
||||
[Caveats](./Caveats.md#dragonflybsd).
|
||||
|
||||
</details>
|
||||
<details>
|
||||
<summary>Solaris / OpenIndiana</summary>
|
||||
|
||||
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 libraries: `sudo pkg install qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt`.
|
||||
```sh
|
||||
sudo pkg install qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt
|
||||
```
|
||||
|
||||
[Caveats](./Caveats.md#solaris).
|
||||
|
||||
@@ -310,22 +322,22 @@ pacman -Syuu --needed --noconfirm $packages
|
||||
<summary>HaikuOS</summary>
|
||||
|
||||
```sh
|
||||
pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt6_devel qt6_5compat_devel libusb1_devel libz_devel mbedtls3_devel glslang
|
||||
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).
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>RedoxOS</summary>
|
||||
|
||||
TODO: Fix syscall crashes (heavy IO stalls and hangup due to net mutexes?)
|
||||
```sh
|
||||
sudo pkg update && sudo pkg install git cmake
|
||||
sudo pkg install ffmpeg6 sdl2 zlib llvm18
|
||||
sudo pkg update
|
||||
sudo pkg install git cmake ffmpeg6 sdl2 zlib llvm18
|
||||
```
|
||||
|
||||
[Caveats](./Caveats.md#redoxos).
|
||||
|
||||
</details>
|
||||
|
||||
## All Done
|
||||
|
||||
@@ -0,0 +1,874 @@
|
||||
# The NVIDIA SM86 (Maxwell) GPU - Instruction set
|
||||
|
||||
<!-- TOC -->
|
||||
[AL2P](#AL2P)
|
||||
[ALD](#ALD)
|
||||
[AST](#AST)
|
||||
[ATOM](#ATOM)
|
||||
[ATOMS](#ATOMS)
|
||||
[B2R](#B2R)
|
||||
[BAR](#BAR)
|
||||
[BFE](#BFE)
|
||||
[BFI](#BFI)
|
||||
[BPT](#BPT)
|
||||
[BRA](#BRA)
|
||||
[BRK](#BRK)
|
||||
[BRX](#BRX)
|
||||
[CAL](#CAL)
|
||||
[CCTL](#CCTL)
|
||||
[CCTLL](#CCTLL)
|
||||
[CONT](#CONT)
|
||||
[CS2R](#CS2R)
|
||||
[CSET](#CSET)
|
||||
[CSETP](#CSETP)
|
||||
[DADD](#DADD)
|
||||
[DEPBAR](#DEPBAR)
|
||||
[DFMA](#DFMA)
|
||||
[DMNMX](#DMNMX)
|
||||
[DMUL](#DMUL)
|
||||
[DSET](#DSET)
|
||||
[DSETP](#DSETP)
|
||||
[EXIT](#EXIT)
|
||||
[F2F](#F2F)
|
||||
[F2I](#F2I)
|
||||
[FADD](#FADD)
|
||||
[FCHK](#FCHK)
|
||||
[FCMP](#FCMP)
|
||||
[FFMA](#FFMA)
|
||||
[FLO](#FLO)
|
||||
[FMNMX](#FMNMX)
|
||||
[FMUL](#FMUL)
|
||||
[FSET](#FSET)
|
||||
[FSETP](#FSETP)
|
||||
[FSWZADD](#FSWZADD)
|
||||
[GETCRSPTR](#GETCRSPTR)
|
||||
[GETLMEMBASE](#GETLMEMBASE)
|
||||
[HADD2](#HADD2)
|
||||
[HFMA2](#HFMA2)
|
||||
[HMUL2](#HMUL2)
|
||||
[HSET2](#HSET2)
|
||||
[HSETP2](#HSETP2)
|
||||
[I2F](#I2F)
|
||||
[I2I](#I2I)
|
||||
[IADD](#IADD)
|
||||
[IADD3](#IADD3)
|
||||
[ICMP](#ICMP)
|
||||
[IDE](#IDE)
|
||||
[IDP](#IDP)
|
||||
[IMAD](#IMAD)
|
||||
[IMADSP](#IMADSP)
|
||||
[IMNMX](#IMNMX)
|
||||
[IMUL](#IMUL)
|
||||
[IPA](#IPA)
|
||||
[ISBERD](#ISBERD)
|
||||
[ISCADD](#ISCADD)
|
||||
[ISET](#ISET)
|
||||
[ISETP](#ISETP)
|
||||
[JCAL](#JCAL)
|
||||
[JMP](#JMP)
|
||||
[JMX](#JMX)
|
||||
[KIL](#KIL)
|
||||
[LD](#LD)
|
||||
[LDC](#LDC)
|
||||
[LDG](#LDG)
|
||||
[LDL](#LDL)
|
||||
[LDS](#LDS)
|
||||
[LEA](#LEA)
|
||||
[LEPC](#LEPC)
|
||||
[LONGJMP](#LONGJMP)
|
||||
[LOP](#LOP)
|
||||
[LOP3](#LOP3)
|
||||
[MEMBAR](#MEMBAR)
|
||||
[MOV](#MOV)
|
||||
[MUFU](#MUFU)
|
||||
[NOP](#NOP)
|
||||
[OUT](#OUT)
|
||||
[P2R](#P2R)
|
||||
[PBK](#PBK)
|
||||
[PCNT](#PCNT)
|
||||
[PEXIT](#PEXIT)
|
||||
[PIXLD](#PIXLD)
|
||||
[PLONGJMP](#PLONGJMP)
|
||||
[POPC](#POPC)
|
||||
[PRET](#PRET)
|
||||
[PRMT](#PRMT)
|
||||
[PSET](#PSET)
|
||||
[PSETP](#PSETP)
|
||||
[R2B](#R2B)
|
||||
[R2P](#R2P)
|
||||
[RAM](#RAM)
|
||||
[RED](#RED)
|
||||
[RET](#RET)
|
||||
[RRO](#RRO)
|
||||
[RTT](#RTT)
|
||||
[S2R](#S2R)
|
||||
[SAM](#SAM)
|
||||
[SEL](#SEL)
|
||||
[SETCRSPTR](#SETCRSPTR)
|
||||
[SETLMEMBASE](#SETLMEMBASE)
|
||||
[SHF](#SHF)
|
||||
[SHFL](#SHFL)
|
||||
[SHL](#SHL)
|
||||
[SHR](#SHR)
|
||||
[SSY](#SSY)
|
||||
[ST](#ST)
|
||||
[STG](#STG)
|
||||
[STL](#STL)
|
||||
[STP](#STP)
|
||||
[STS](#STS)
|
||||
[SUATOM](#SUATOM)
|
||||
[SULD](#SULD)
|
||||
[SURED](#SURED)
|
||||
[SUST](#SUST)
|
||||
[SYNC](#SYNC)
|
||||
[TEX](#TEX)
|
||||
[TLD](#TLD)
|
||||
[TLD4](#TLD4)
|
||||
[TMML](#TMML)
|
||||
[TXA](#TXA)
|
||||
[TXD](#TXD)
|
||||
[TXQ](#TXQ)
|
||||
[VABSDIFF](#VABSDIFF)
|
||||
[VABSDIFF4](#VABSDIFF4)
|
||||
[VADD](#VADD)
|
||||
[VMAD](#VMAD)
|
||||
[VMNMX](#VMNMX)
|
||||
[VOTE](#VOTE)
|
||||
[VSET](#VSET)
|
||||
[VSETP](#VSETP)
|
||||
[VSHL](#VSHL)
|
||||
[VSHR](#VSHR)
|
||||
[XMAD](#XMAD)
|
||||
<!-- /TOC -->
|
||||
|
||||
NOTE: Regenerate TOC with `cat docs/gpu/README.md | grep '#' | cut -d '#' -f 2 | tr -d ' ' | awk '{print "["$1"](#"$1")"}'`.
|
||||
|
||||
The numbers (in binary) represent the opcodes; `-` signifies "don't care".
|
||||
|
||||
# AL2P
|
||||
`1110 1111 1010 0---`
|
||||
|
||||
# ALD
|
||||
`1110 1111 1101 1---`
|
||||
|
||||
# AST
|
||||
`1110 1111 1111 0---`
|
||||
|
||||
# ATOM
|
||||
- **ATOM_cas**: `1110 1110 1111 ----`
|
||||
- **ATOM**: `1110 1101 ---- ----`
|
||||
|
||||
Atomic operation.
|
||||
|
||||
- INC, DEC for U32/S32/U64 does nothing.
|
||||
- ADD, INC, DEC for S64 does nothing.
|
||||
- Only ADD does something for F32.
|
||||
- Only ADD, MIN and MAX does something for F16x2.
|
||||
|
||||
# ATOMS
|
||||
- **ATOMS_cas**: `1110 1110 ---- ----`
|
||||
- **ATOMS**: `1110 1100 ---- ----`
|
||||
|
||||
# B2R
|
||||
`1111 0000 1011 1---`
|
||||
|
||||
# BAR
|
||||
`1111 0000 1010 1---`
|
||||
|
||||
# BFE
|
||||
- **BFE_reg**: `0101 1100 0000 0---`
|
||||
- **BFE_cbuf**: `0100 1100 0000 0---`
|
||||
- **BFE_imm**: `0011 100- 0000 0---`
|
||||
|
||||
Bit Field Extract.
|
||||
|
||||
# BFI
|
||||
- **BFI_reg**: `0101 1011 1111 0---`
|
||||
- **BFI_rc**: `0101 0011 1111 0---`
|
||||
- **BFI_cr**: `0100 1011 1111 0---`
|
||||
- **BFI_imm**: `0011 011- 1111 0---`
|
||||
|
||||
Bit Field Insert.
|
||||
|
||||
# BPT
|
||||
`1110 0011 1010 ----`
|
||||
|
||||
Breakpoint trap.
|
||||
|
||||
# BRA
|
||||
`1110 0010 0100 ----`
|
||||
|
||||
Relative branch.
|
||||
|
||||
# BRK
|
||||
`1110 0011 0100 ----`
|
||||
|
||||
Break.
|
||||
|
||||
# BRX
|
||||
`1110 0010 0101 ----`
|
||||
|
||||
# CAL
|
||||
`1110 0010 0110 ----`
|
||||
|
||||
# CCTL
|
||||
`1110 1111 011- ----`
|
||||
|
||||
Cache Control.
|
||||
|
||||
# CCTLL
|
||||
`1110 1111 100- ----`
|
||||
|
||||
Texture Cache Control.
|
||||
|
||||
# CONT
|
||||
`1110 0011 0101 ----`
|
||||
|
||||
Continue.
|
||||
|
||||
# CS2R
|
||||
`0101 0000 1100 1---`
|
||||
|
||||
Move Special Register to Register.
|
||||
|
||||
# CSET
|
||||
`0101 0000 1001 1---`
|
||||
|
||||
Test Condition Code And Set.
|
||||
|
||||
# CSETP
|
||||
`0101 0000 1010 0---`
|
||||
|
||||
Test Condition Code and Set Predicate.
|
||||
|
||||
# DADD
|
||||
- **DADD_reg**: `0101 1100 0111 0---`
|
||||
- **DADD_cbuf**: `0100 1100 0111 0---`
|
||||
- **DADD_imm**: `0011 100- 0111 0---`
|
||||
|
||||
# DEPBAR
|
||||
`1111 0000 1111 0---`
|
||||
|
||||
# DFMA
|
||||
- **DFMA_reg**: `0101 1011 0111 ----`
|
||||
- **DFMA_rc**: `0101 0011 0111 ----`
|
||||
- **DFMA_cr**: `0100 1011 0111 ----`
|
||||
- **DFMA_imm**: `0011 011- 0111 ----`
|
||||
|
||||
FP64 Fused Mutiply Add.
|
||||
|
||||
# DMNMX
|
||||
- **DMNMX_reg**: `0101 1100 0101 0---`
|
||||
- **DMNMX_cbuf**: `0100 1100 0101 0---`
|
||||
- **DMNMX_imm**: `0011 100- 0101 0---`
|
||||
|
||||
FP64 Minimum/Maximum.
|
||||
|
||||
# DMUL
|
||||
- **DMUL_reg**: `0101 1100 1000 0---`
|
||||
- **DMUL_cbuf**: `0100 1100 1000 0---`
|
||||
- **DMUL_imm**: `0011 100- 1000 0---`
|
||||
|
||||
FP64 Multiply.
|
||||
|
||||
# DSET
|
||||
- **DSET_reg**: `0101 1001 0--- ----`
|
||||
- **DSET_cbuf**: `0100 1001 0--- ----`
|
||||
- **DSET_imm**: `0011 001- 0--- ----`
|
||||
|
||||
FP64 Compare And Set.
|
||||
|
||||
# DSETP
|
||||
- **DSETP_reg**: `0101 1011 1000 ----`
|
||||
- **DSETP_cbuf**: `0100 1011 1000 ----`
|
||||
- **DSETP_imm**: `0011 011- 1000 ----`
|
||||
|
||||
FP64 Compare And Set Predicate.
|
||||
|
||||
# EXIT
|
||||
`1110 0011 0000 ----`
|
||||
|
||||
# F2F
|
||||
- **F2F_reg**: `0101 1100 1010 1---`
|
||||
- **F2F_cbuf**: `0100 1100 1010 1---`
|
||||
- **F2F_imm**: `0011 100- 1010 1---`
|
||||
|
||||
# F2I
|
||||
- **F2I_reg**: `0101 1100 1011 0---`
|
||||
- **F2I_cbuf**: `0100 1100 1011 0---`
|
||||
- **F2I_imm**: `0011 100- 1011 0---`
|
||||
|
||||
# FADD
|
||||
- **FADD_reg**: `0101 1100 0101 1---`
|
||||
- **FADD_cbuf**: `0100 1100 0101 1---`
|
||||
- **FADD_imm**: `0011 100- 0101 1---`
|
||||
- **FADD32I**: `0000 10-- ---- ----`
|
||||
|
||||
FP32 Add.
|
||||
|
||||
# FCHK
|
||||
- **FCHK_reg**: `0101 1100 1000 1---`
|
||||
- **FCHK_cbuf**: `0100 1100 1000 1---`
|
||||
- **FCHK_imm**: `0011 100- 1000 1---`
|
||||
|
||||
Single Precision FP Divide Range Check.
|
||||
|
||||
# FCMP
|
||||
- **FCMP_reg**: `0101 1011 1010 ----`
|
||||
- **FCMP_rc**: `0101 0011 1010 ----`
|
||||
- **FCMP_cr**: `0100 1011 1010 ----`
|
||||
- **FCMP_imm**: `0011 011- 1010 ----`
|
||||
|
||||
FP32 Compare to Zero and Select Source.
|
||||
|
||||
# FFMA
|
||||
- **FFMA_reg**: `0101 1001 1--- ----`
|
||||
- **FFMA_rc**: `0101 0001 1--- ----`
|
||||
- **FFMA_cr**: `0100 1001 1--- ----`
|
||||
- **FFMA_imm**: `0011 001- 1--- ----`
|
||||
- **FFMA32I**: `0000 11-- ---- ----`
|
||||
|
||||
FP32 Fused Multiply and Add.
|
||||
|
||||
# FLO
|
||||
- **FLO_reg**: `0101 1100 0011 0---`
|
||||
- **FLO_cbuf**: `0100 1100 0011 0---`
|
||||
- **FLO_imm**: `0011 100- 0011 0---`
|
||||
|
||||
# FMNMX
|
||||
- **FMNMX_reg**: `0101 1100 0110 0---`
|
||||
- **FMNMX_cbuf**: `0100 1100 0110 0---`
|
||||
- **FMNMX_imm**: `0011 100- 0110 0---`
|
||||
|
||||
FP32 Minimum/Maximum.
|
||||
|
||||
# FMUL
|
||||
- **FMUL_reg**: `0101 1100 0110 1---`
|
||||
- **FMUL_cbuf**: `0100 1100 0110 1---`
|
||||
- **FMUL_imm**: `0011 100- 0110 1---`
|
||||
- **FMUL32I**: `0001 1110 ---- ----`
|
||||
|
||||
FP32 Multiply.
|
||||
|
||||
# FSET
|
||||
- **FSET_reg**: `0101 1000 ---- ----`
|
||||
- **FSET_cbuf**: `0100 1000 ---- ----`
|
||||
- **FSET_imm**: `0011 000- ---- ----`
|
||||
|
||||
FP32 Compare And Set.
|
||||
|
||||
# FSETP
|
||||
- **FSETP_reg**: `0101 1011 1011 ----`
|
||||
- **FSETP_cbuf**: `0100 1011 1011 ----`
|
||||
- **FSETP_imm**: `0011 011- 1011 ----`
|
||||
|
||||
FP32 Compare And Set Predicate.
|
||||
|
||||
# FSWZADD
|
||||
`0101 0000 1111 1---`
|
||||
|
||||
FP32 Add used for FSWZ emulation.
|
||||
|
||||
# GETCRSPTR
|
||||
`1110 0010 1100 ----`
|
||||
|
||||
# GETLMEMBASE
|
||||
`1110 0010 1101 ----`
|
||||
|
||||
# HADD2
|
||||
- **HADD2_reg**: `0101 1101 0001 0---`
|
||||
- **HADD2_cbuf**: `0111 101- 1--- ----`
|
||||
- **HADD2_imm**: `0111 101- 0--- ----`
|
||||
- **HADD2_32I**: `0010 110- ---- ----`
|
||||
|
||||
FP16 Add.
|
||||
|
||||
# HFMA2
|
||||
- **HFMA2_reg**: `0101 1101 0000 0---`
|
||||
- **HFMA2_rc**: `0110 0--- 1--- ----`
|
||||
- **HFMA2_cr**: `0111 0--- 1--- ----`
|
||||
- **HFMA2_imm**: `0111 0--- 0--- ----`
|
||||
- **HFMA2_32I**: `0010 100- ---- ----`
|
||||
|
||||
FP16 Fused Mutiply Add.
|
||||
|
||||
# HMUL2
|
||||
- **HMUL2_reg**: `0101 1101 0000 1---`
|
||||
- **HMUL2_cbuf**: `0111 100- 1--- ----`
|
||||
- **HMUL2_imm**: `0111 100- 0--- ----`
|
||||
- **HMUL2_32I**: `0010 101- ---- ----`
|
||||
|
||||
FP16 Multiply.
|
||||
|
||||
# HSET2
|
||||
- **HSET2_reg**: `0101 1101 0001 1---`
|
||||
- **HSET2_cbuf**: `0111 110- 1--- ----`
|
||||
- **HSET2_imm**: `0111 110- 0--- ----`
|
||||
|
||||
FP16 Compare And Set.
|
||||
|
||||
# HSETP2
|
||||
- **HSETP2_reg**: `0101 1101 0010 0---`
|
||||
- **HSETP2_cbuf**: `0111 111- 1--- ----`
|
||||
- **HSETP2_imm**: `0111 111- 0--- ----`
|
||||
|
||||
FP16 Compare And Set Predicate.
|
||||
|
||||
# I2F
|
||||
- **I2F_reg**: `0101 1100 1011 1---`
|
||||
- **I2F_cbuf**: `0100 1100 1011 1---`
|
||||
- **I2F_imm**: `0011 100- 1011 1---`
|
||||
|
||||
# I2I
|
||||
- **I2I_reg**: `0101 1100 1110 0---`
|
||||
- **I2I_cbuf**: `0100 1100 1110 0---`
|
||||
- **I2I_imm**: `0011 100- 1110 0---`
|
||||
|
||||
# IADD
|
||||
- **IADD_reg**: `0101 1100 0001 0---`
|
||||
- **IADD_cbuf**: `0100 1100 0001 0---`
|
||||
- **IADD_imm**: `0011 100- 0001 0---`
|
||||
|
||||
Integer Addition.
|
||||
|
||||
# IADD3
|
||||
- **IADD3_reg**: `0101 1100 1100 ----`
|
||||
- **IADD3_cbuf**: `0100 1100 1100 ----`
|
||||
- **IADD3_imm**: `0011 100- 1100 ----`
|
||||
- **IADD32I**: `0001 110- ---- ----`
|
||||
|
||||
3-input Integer Addition.
|
||||
|
||||
# ICMP
|
||||
- **ICMP_reg**: `0101 1011 0100 ----`
|
||||
- **ICMP_rc**: `0101 0011 0100 ----`
|
||||
- **ICMP_cr**: `0100 1011 0100 ----`
|
||||
- **ICMP_imm**: `0011 011- 0100 ----`
|
||||
|
||||
Integer Compare to Zero and Select Source.
|
||||
|
||||
# IDE
|
||||
`1110 0011 1001 ----`
|
||||
|
||||
# IDP
|
||||
- **IDP_reg**: `0101 0011 1111 1---`
|
||||
- **IDP_imm**: `0101 0011 1101 1---`
|
||||
|
||||
# IMAD
|
||||
- **IMAD_reg**: `0101 1010 0--- ----`
|
||||
- **IMAD_rc**: `0101 0010 0--- ----`
|
||||
- **IMAD_cr**: `0100 1010 0--- ----`
|
||||
- **IMAD_imm**: `0011 010- 0--- ----`
|
||||
- **IMAD32I**: `1000 00-- ---- ----`
|
||||
|
||||
Integer Multiply And Add.
|
||||
|
||||
# IMADSP
|
||||
- **IMADSP_reg**: `0101 1010 1--- ----`
|
||||
- **IMADSP_rc**: `0101 0010 1--- ----`
|
||||
- **IMADSP_cr**: `0100 1010 1--- ----`
|
||||
- **IMADSP_imm**: `0011 010- 1--- ----`
|
||||
|
||||
Extracted Integer Multiply And Add..
|
||||
|
||||
# IMNMX
|
||||
- **IMNMX_reg**: `0101 1100 0010 0---`
|
||||
- **IMNMX_cbuf**: `0100 1100 0010 0---`
|
||||
- **IMNMX_imm**: `0011 100- 0010 0---`
|
||||
|
||||
Integer Minimum/Maximum.
|
||||
|
||||
# IMUL
|
||||
- **IMUL_reg**: `0101 1100 0011 1---`
|
||||
- **IMUL_cbuf**: `0100 1100 0011 1---`
|
||||
- **IMUL_imm**: `0011 100- 0011 1---`
|
||||
- **IMUL32I**: `0001 1111 ---- ----`
|
||||
|
||||
Integer Multiply.
|
||||
|
||||
# IPA
|
||||
`1110 0000 ---- ----`
|
||||
|
||||
# ISBERD
|
||||
`1110 1111 1101 0---`
|
||||
|
||||
In-Stage-Buffer Entry Read.
|
||||
|
||||
# ISCADD
|
||||
- **ISCADD_reg**: `0101 1100 0001 1---`
|
||||
- **ISCADD_cbuf**: `0100 1100 0001 1---`
|
||||
- **ISCADD_imm**: `0011 100- 0001 1---`
|
||||
- **ISCADD32I**: `0001 01-- ---- ----`
|
||||
|
||||
Scaled Integer Addition.
|
||||
|
||||
# ISET
|
||||
- **ISET_reg**: `0101 1011 0101 ----`
|
||||
- **ISET_cbuf**: `0100 1011 0101 ----`
|
||||
- **ISET_imm**: `0011 011- 0101 ----`
|
||||
|
||||
Integer Compare And Set.
|
||||
|
||||
# ISETP
|
||||
- **ISETP_reg**: `0101 1011 0110 ----`
|
||||
- **ISETP_cbuf**: `0100 1011 0110 ----`
|
||||
- **ISETP_imm**: `0011 011- 0110 ----`
|
||||
|
||||
Integer Compare And Set Predicate.
|
||||
|
||||
# JCAL
|
||||
`1110 0010 0010 ----`
|
||||
|
||||
Absolute Call.
|
||||
|
||||
# JMP
|
||||
`1110 0010 0001 ----`
|
||||
|
||||
Absolute Jump.
|
||||
|
||||
# JMX
|
||||
`1110 0010 0000 ----`
|
||||
|
||||
Absolute Jump Indirect.
|
||||
|
||||
# KIL
|
||||
`1110 0011 0011 ----`
|
||||
|
||||
# LD
|
||||
`100- ---- ---- ----`
|
||||
|
||||
Load from generic Memory.
|
||||
|
||||
# LDC
|
||||
`1110 1111 1001 0---`
|
||||
|
||||
Load Constant.
|
||||
|
||||
# LDG
|
||||
`1110 1110 1101 0---`
|
||||
|
||||
Load from Global Memory.
|
||||
|
||||
# LDL
|
||||
`1110 1111 0100 0---`
|
||||
|
||||
Load within Local Memory Window.
|
||||
|
||||
# LDS
|
||||
`1110 1111 0100 1---`
|
||||
|
||||
Load within Shared Memory Window.
|
||||
|
||||
# LEA
|
||||
- **LEA_hi_reg**: `0101 1011 1101 1---`
|
||||
- **LEA_hi_cbuf**: `0001 10-- ---- ----`
|
||||
- **LEA_lo_reg**: `0101 1011 1101 0---`
|
||||
- **LEA_lo_cbuf**: `0100 1011 1101 ----`
|
||||
- **LEA_lo_imm**: `0011 011- 1101 0---`
|
||||
|
||||
# LEPC
|
||||
`0101 0000 1101 0---`
|
||||
|
||||
# LONGJMP
|
||||
`1110 0011 0001 ----`
|
||||
|
||||
# LOP
|
||||
- **LOP_reg**: `0101 1100 0100 0---`
|
||||
- **LOP_cbuf**: `0100 1100 0100 0---`
|
||||
- **LOP_imm**: `0011 100- 0100 0---`
|
||||
|
||||
# LOP3
|
||||
- **LOP3_reg**: `0101 1011 1110 0---`
|
||||
- **LOP3_cbuf**: `0000 001- ---- ----`
|
||||
- **LOP3_imm**: `0011 11-- ---- ----`
|
||||
- **LOP32I**: `0000 01-- ---- ----`
|
||||
|
||||
# MEMBAR
|
||||
`1110 1111 1001 1---`
|
||||
|
||||
Memory Barrier.
|
||||
|
||||
# MOV
|
||||
- **MOV_reg**: `0101 1100 1001 1---`
|
||||
- **MOV_cbuf**: `0100 1100 1001 1---`
|
||||
- **MOV_imm**: `0011 100- 1001 1---`
|
||||
- **MOV32I**: `0000 0001 0000 ----`
|
||||
|
||||
# MUFU
|
||||
`0101 0000 1000 0---`
|
||||
|
||||
Multi Function Operation.
|
||||
|
||||
# NOP
|
||||
`0101 0000 1011 0---`
|
||||
|
||||
No operation.
|
||||
|
||||
# OUT
|
||||
- **OUT_reg**: `1111 1011 1110 0---`
|
||||
- **OUT_cbuf**: `1110 1011 1110 0---`
|
||||
- **OUT_imm**: `1111 011- 1110 0---`
|
||||
|
||||
# P2R
|
||||
- **P2R_reg**: `0101 1100 1110 1---`
|
||||
- **P2R_cbuf**: `0100 1100 1110 1---`
|
||||
- **P2R_imm**: `0011 1000 1110 1---`
|
||||
|
||||
Move Predicate Register To Register.
|
||||
|
||||
# PBK
|
||||
`1110 0010 1010 ----`
|
||||
|
||||
Pre-break.
|
||||
|
||||
# PCNT
|
||||
`1110 0010 1011 ----`
|
||||
|
||||
Pre-continue.
|
||||
|
||||
# PEXIT
|
||||
`1110 0010 0011 ----`
|
||||
|
||||
Pre-exit.
|
||||
|
||||
# PIXLD
|
||||
`1110 1111 1110 1---`
|
||||
|
||||
# PLONGJMP
|
||||
`1110 0010 1000 ----`
|
||||
|
||||
Pre-long jump.
|
||||
|
||||
# POPC
|
||||
- **POPC_reg**: `0101 1100 0000 1---`
|
||||
- **POPC_cbuf**: `0100 1100 0000 1---`
|
||||
- **POPC_imm**: `0011 100- 0000 1---`
|
||||
|
||||
Population/Bit count.
|
||||
|
||||
# PRET
|
||||
`1110 0010 0111 ----`
|
||||
|
||||
Pre-return from subroutine. Pushes the return address to the CRS stack.
|
||||
|
||||
# PRMT
|
||||
- **PRMT_reg**: `0101 1011 1100 ----`
|
||||
- **PRMT_rc**: `0101 0011 1100 ----`
|
||||
- **PRMT_cr**: `0100 1011 1100 ----`
|
||||
- **PRMT_imm**: `0011 011- 1100 ----`
|
||||
|
||||
# PSET
|
||||
`0101 0000 1000 1---`
|
||||
|
||||
Combine Predicates and Set.
|
||||
|
||||
# PSETP
|
||||
`0101 0000 1001 0---`
|
||||
|
||||
Combine Predicates and Set Predicate.
|
||||
|
||||
# R2B
|
||||
`1111 0000 1100 0---`
|
||||
|
||||
Move Register to Barrier.
|
||||
|
||||
# R2P
|
||||
- **R2P_reg**: `0101 1100 1111 0---`
|
||||
- **R2P_cbuf**: `0100 1100 1111 0---`
|
||||
- **R2P_imm**: `0011 100- 1111 0---`
|
||||
|
||||
Move Register To Predicate/CC Register.
|
||||
|
||||
# RAM
|
||||
`1110 0011 1000 ----`
|
||||
|
||||
# RED
|
||||
`1110 1011 1111 1---`
|
||||
|
||||
Reduction Operation on Generic Memory.
|
||||
|
||||
# RET
|
||||
`1110 0011 0010 ----`
|
||||
|
||||
Return.
|
||||
|
||||
# RRO
|
||||
- **RRO_reg**: `0101 1100 1001 0---`
|
||||
- **RRO_cbuf**: `0100 1100 1001 0---`
|
||||
- **RRO_imm**: `0011 100- 1001 0---`
|
||||
|
||||
# RTT
|
||||
`1110 0011 0110 ----`
|
||||
|
||||
# S2R
|
||||
`1111 0000 1100 1---`
|
||||
|
||||
# SAM
|
||||
`1110 0011 0111 ----`
|
||||
|
||||
# SEL
|
||||
- **SEL_reg**: `0101 1100 1010 0---`
|
||||
- **SEL_cbuf**: `0100 1100 1010 0---`
|
||||
- **SEL_imm**: `0011 100- 1010 0---`
|
||||
|
||||
# SETCRSPTR
|
||||
`1110 0010 1110 ----`
|
||||
|
||||
# SETLMEMBASE
|
||||
`1110 0010 1111 ----`
|
||||
|
||||
# SHF
|
||||
- **SHF_l_reg**: `0101 1011 1111 1---`
|
||||
- **SHF_l_imm**: `0011 011- 1111 1---`
|
||||
- **SHF_r_reg**: `0101 1100 1111 1---`
|
||||
- **SHF_r_imm**: `0011 100- 1111 1---`
|
||||
|
||||
# SHFL
|
||||
`1110 1111 0001 0---`
|
||||
|
||||
# SHL
|
||||
- **SHL_reg**: `0101 1100 0100 1---`
|
||||
- **SHL_cbuf**: `0100 1100 0100 1---`
|
||||
- **SHL_imm**: `0011 100- 0100 1---`
|
||||
|
||||
# SHR
|
||||
- **SHR_reg**: `0101 1100 0010 1---`
|
||||
- **SHR_cbuf**: `0100 1100 0010 1---`
|
||||
- **SHR_imm**: `0011 100- 0010 1---`
|
||||
|
||||
# SSY
|
||||
`1110 0010 1001 ----`
|
||||
|
||||
Set Synchronization Point.
|
||||
|
||||
# ST
|
||||
`101- ---- ---- ----`
|
||||
|
||||
Store to generic Memory.
|
||||
|
||||
# STG
|
||||
`1110 1110 1101 1---`
|
||||
|
||||
Store to global Memory.
|
||||
|
||||
# STL
|
||||
`1110 1111 0101 0---`
|
||||
|
||||
Store within Local or Shared Window.
|
||||
|
||||
# STP
|
||||
`1110 1110 1010 0---`
|
||||
|
||||
Store to generic Memory and Predicate.
|
||||
|
||||
# STS
|
||||
`1110 1111 0101 1---`
|
||||
|
||||
Store within Local or Shared Window.
|
||||
|
||||
# SUATOM
|
||||
- **SUATOM**: `1110 1010 0--- ----`
|
||||
- **SUATOM_cas**: `1110 1010 1--- ----`
|
||||
|
||||
Atomic Op on Surface Memory.
|
||||
|
||||
# SULD
|
||||
`1110 1011 000- ----`
|
||||
|
||||
Surface Load.
|
||||
|
||||
# SURED
|
||||
`1110 1011 010- ----`
|
||||
|
||||
Reduction Op on Surface Memory.
|
||||
|
||||
# SUST
|
||||
`1110 1011 001- ----`
|
||||
|
||||
Surface Store.
|
||||
|
||||
# SYNC
|
||||
`1111 0000 1111 1---`
|
||||
|
||||
# TEX
|
||||
- **TEX**: `1100 0--- ---- ----`
|
||||
- **TEX_b**: `1101 1110 10-- ----`
|
||||
- **TEXS**: `1101 -00- ---- ----`
|
||||
|
||||
Texture Fetch with scalar/non-vec4 source/destinations.
|
||||
|
||||
# TLD
|
||||
- **TLD**: `1101 1100 ---- ----`
|
||||
- **TLD_b**: `1101 1101 ---- ----`
|
||||
- **TLDS**: `1101 -01- ---- ----`
|
||||
|
||||
Texture Load with scalar/non-vec4 source/destinations.
|
||||
|
||||
# TLD4
|
||||
- **TLD4**: `1100 10-- ---- ----`
|
||||
- **TLD4_b**: `1101 1110 11-- ----`
|
||||
- **TLD4S**: `1101 1111 -0-- ----`
|
||||
|
||||
Texture Load 4 with scalar/non-vec4 source/destinations.
|
||||
|
||||
# TMML
|
||||
- **TMML**: `1101 1111 0101 1---`
|
||||
- **TMML_b**: `1101 1111 0110 0---`
|
||||
|
||||
Texture MipMap Level.
|
||||
|
||||
# TXA
|
||||
`1101 1111 0100 0---`
|
||||
|
||||
# TXD
|
||||
- **TXD**: `1101 1110 00-- ----`
|
||||
- **TXD_b**: `1101 1110 01-- ----`
|
||||
|
||||
Texture Fetch With Derivatives.
|
||||
|
||||
# TXQ
|
||||
- **TXQ**: `1101 1111 0100 1---`
|
||||
- **TXQ_b**: `1101 1111 0101 0---`
|
||||
|
||||
Texture Query.
|
||||
|
||||
# VABSDIFF
|
||||
`0101 0100 ---- ----`
|
||||
|
||||
# VABSDIFF4
|
||||
`0101 0000 0--- ----`
|
||||
|
||||
# VADD
|
||||
`0010 00-- ---- ----`
|
||||
|
||||
# VMAD
|
||||
`0101 1111 ---- ----`
|
||||
|
||||
# VMNMX
|
||||
`0011 101- ---- ----`
|
||||
|
||||
# VOTE
|
||||
- **VOTE**: `0101 0000 1101 1---`
|
||||
- **VOTE_vtg**: `0101 0000 1110 0---`
|
||||
|
||||
Vote Across SIMD Thread Group
|
||||
|
||||
# VSET
|
||||
`0100 000- ---- ----`
|
||||
|
||||
# VSETP
|
||||
`0101 0000 1111 0---`
|
||||
|
||||
# VSHL
|
||||
`0101 0111 ---- ----`
|
||||
|
||||
# VSHR
|
||||
`0101 0110 ---- ----`
|
||||
|
||||
# XMAD
|
||||
- **XMAD_reg**: `0101 1011 00-- ----`
|
||||
- **XMAD_rc**: `0101 0001 0--- ----`
|
||||
- **XMAD_cr**: `0100 111- ---- ----`
|
||||
- **XMAD_imm**: `0011 011- 00-- ----`
|
||||
|
||||
Integer Short Multiply Add.
|
||||
@@ -10,4 +10,6 @@ This contains documentation created by developers. This contains build instructi
|
||||
- **[Debug Guidelines](./Debug.md)**
|
||||
- **[CPM - CMake Package Manager](CPMUtil.md)**
|
||||
- **[Platform-Specific Caveats](Caveats.md)**
|
||||
- **[The NVIDIA SM86 (Maxwell) GPU](./NvidiaGpu.md)**
|
||||
- **[User Handbook](./user)**
|
||||
- **[Release Policy](./ReleasePolicy.md)**
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# Release Policy
|
||||
|
||||
While releases are usually made at the discretion of the team, we feel that establishing a clearer guideline on how those come to be will help expectations when it comes to features and fixes per version.
|
||||
|
||||
## Release candidates
|
||||
|
||||
Every full release is *preceded* by at least, 3 release candidates. The reasoning is that each week of the month, there will be a release candidate, with the "4th one" being the final full release.
|
||||
|
||||
The main expectation is that the release candidates bring both fixes and, sometimes, new features. But not guarantee a regression-free experience.
|
||||
|
||||
The criteria for choosing a date for a release candidate is at discretion, or "perceived necesity" at any given time.
|
||||
|
||||
## Full release
|
||||
|
||||
A full release means there are *no major* leftover regressions, importantly this means that a grand portion of regressions found between release candidates are swept out before declaring a full release. This doesn't mean a full release is regression-free; but we do a best-effort approach to reduce them for end-users.
|
||||
|
||||
The main expectation is that users can safely upgrade from a stable build to another, with no major regressions.
|
||||
|
||||
## Snapshot/rolling release
|
||||
|
||||
While we don't publish rolling releases, we are aware users may compile from source and/or provide binaries to master builds of the project.
|
||||
|
||||
This is mostly fine since we keep master very stable from major hiccups. However sometimes bugs do slip between tests or reviews - so users are advised to keep that in mind.
|
||||
|
||||
We advise that users also read git logs (`git log --oneline`) before recompiling to get a clearer picture of the changes given into the emulator.
|
||||
@@ -1,30 +1,37 @@
|
||||
# Note: These build instructions are a work-in-progress.
|
||||
# Android
|
||||
|
||||
## Dependencies
|
||||
|
||||
* [Android Studio](https://developer.android.com/studio)
|
||||
* [NDK 27+ 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`.
|
||||
## 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
|
||||
```
|
||||
|
||||
```sh
|
||||
git clone --recursive https://git.eden-emu.dev/eden-emu/eden.git
|
||||
```
|
||||
Eden by default will be cloned into -
|
||||
|
||||
Eden by default will be cloned into:
|
||||
|
||||
* `C:\Users\<user-name>\eden` on Windows
|
||||
* `~/eden` on Linux and 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
|
||||
@@ -38,7 +45,44 @@ Eden by default will be cloned into -
|
||||
Remember to have a Java SDK installed if not already, on Debian and similar this is done with `sudo apt install openjdk-17-jdk`.
|
||||
|
||||
### 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.
|
||||
|
||||
A convenience script for building is provided in `.ci/android/build.sh`. On Windows, this must be run in Git Bash or MSYS2. This script provides the following options:
|
||||
|
||||
```txt
|
||||
Usage: build.sh [-c|--chromeos] [-t|--target FLAVOR] [-b|--build-type BUILD_TYPE]
|
||||
[-h|--help] [-r|--release] [extra options]
|
||||
|
||||
Build script for Android.
|
||||
Associated variables can be set outside the script,
|
||||
and will apply both to this script and the packaging script.
|
||||
bool values are "true" or "false"
|
||||
|
||||
Options:
|
||||
-c, --chromeos Build for ChromeOS (x86_64) (variable: CHROMEOS, bool)
|
||||
Default: false
|
||||
-r, --release Enable update checker. If set, sets the DEVEL bool variable to false.
|
||||
By default, DEVEL is true.
|
||||
-t, --target <FLAVOR> Build flavor (variable: TARGET)
|
||||
Valid values are: legacy, optimized, standard
|
||||
Default: standard
|
||||
-b, --build-type <TYPE> Build type (variable: TYPE)
|
||||
Valid values are: Release, RelWithDebInfo, Debug
|
||||
Default: Debug
|
||||
|
||||
Extra arguments are passed to CMake (e.g. -DCMAKE_OPTION_NAME=VALUE)
|
||||
Set the CCACHE variable to "true" to enable build caching.
|
||||
The APK and AAB will be output into "artifacts".
|
||||
```
|
||||
|
||||
Examples:
|
||||
|
||||
* Build legacy release with update checker for ChromeOS:
|
||||
* `.ci/android/build.sh -c -r -t legacy`
|
||||
* Build standard release with debug info without update checker for phones:
|
||||
* `.ci/android/build.sh -b RelWithDebInfo`
|
||||
* Build optimized release with update checker:
|
||||
* `.ci/android/build.sh -r -t optimized`
|
||||
|
||||
### Additional Resources
|
||||
https://developer.android.com/studio/intro
|
||||
|
||||
<https://developer.android.com/studio/intro>
|
||||
|
||||
@@ -0,0 +1,162 @@
|
||||
# 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.*
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Importing-Eden-into-Steam-with-Steam-Rom-Manager-2b757c2edaf68054851bc287b6382cb5) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden set up and configured
|
||||
- Internet Connection
|
||||
- Comfort Accessing and Navigating SteamOS Desktop Mode
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
|
||||
### Initial Setup
|
||||
|
||||
1. Press the **STEAM** button and then go to *Power → Switch to Desktop* to enter the Desktop mode.
|
||||
|
||||
2. Install ***Steam ROM Manager*** (if needed), there are 2 ways you can accomplish this, either manually or through [*EmuDeck*](https://www.emudeck.com/#downloads).
|
||||
|
||||
---
|
||||
|
||||
### 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*
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: This assumes you have already set up EmuDeck, if not - just run through the guided installation and select *Steam ROM Manager* as one of the options.
|
||||
|
||||
</aside>
|
||||
|
||||
1. Open **EmuDeck**, then navigate to *Manage Emulators.*
|
||||
2. Scroll down to the bottom of the page to the *Manage your Tools & Frontends* section. Click **Steam ROM Manager**.
|
||||
3. Click the **Install** button on the right hand side to install it.
|
||||
|
||||
---
|
||||
|
||||
### Adding Eden into *Steam ROM Manager*
|
||||
|
||||
### EmuDeck Users
|
||||
|
||||
EmuDeck will automatically create an *Emulators - Emulators* parser for ***Steam ROM Manager*** that uses shell scripts to launch them. We will follow this convention.
|
||||
|
||||
1. In the file explorer go to your **EmuDeck installation folder → tools → launchers**
|
||||
2. Right-Click some empty space and hit **Create New → Text File,** call this new file ***eden.sh*** instead of ***Text File.txt***
|
||||
3. Right-Click the ***eden.sh*** file you created and hit ***Open with Kate***.
|
||||
4. Paste the following code into the contents of the file, save and close the file.
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
emuName="eden" #parameterize me
|
||||
|
||||
. "$HOME/.config/EmuDeck/backend/functions/all.sh"
|
||||
emulatorInit "$emuName"
|
||||
|
||||
# find full path to emulator appimage
|
||||
appimage=$(find "$emusFolder" -iname "${emuName}*.AppImage" -print -quit 2>/dev/null)
|
||||
|
||||
# make sure the appimage is executable
|
||||
chmod +x "$appimage"
|
||||
set -- "$appimage" "$@"
|
||||
|
||||
echo "Launching ${emuName} with:" "$@"
|
||||
"$@"
|
||||
|
||||
cloud_sync_uploadForced
|
||||
rm -rf "$savesPath/.gaming"
|
||||
```
|
||||
|
||||
5. Open a terminal in the directory containing the ***eden.sh*** file and run the following command to make it executable.
|
||||
|
||||
```bash
|
||||
chmod u+x ./eden.sh
|
||||
```
|
||||
|
||||
6. Proceed to the Adding the Emulator section
|
||||
|
||||
---
|
||||
|
||||
### Non-EmuDeck Users
|
||||
|
||||
We will need to create a new parser for the Emulators. Unlike with the EmuDeck model, we will have the parser look for AppImages.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: In order to ensure that the matches occur correctly, it is recommended that you name the Eden Appimage as ***eden.AppImage***, rather than what it downloads as.
|
||||
|
||||
</aside>
|
||||
|
||||
1. Open *Steam ROM Manager* and choose **Create Parser**.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: You may need to go to **Settings → Theme** and set it to *Classic* to view this option.
|
||||
|
||||
</aside>
|
||||
|
||||
2. Add the following settings to create the parser.
|
||||
|
||||
1. Basic Configuration
|
||||
1. **Parser Type**: *Blob*
|
||||
2. **Parser Title**: *Emulators - Emulators*
|
||||
3. **Steam Directory**: *${steamdirglobal}*
|
||||
4. **User Accounts**: *Global*
|
||||
5. **ROMs Directory**: <path to directory containing eden AppImage>
|
||||
6. **Steam Collections**: *Emulation* (OPTIONAL)
|
||||
2. Parser Specific Configuration
|
||||
1. **Search Glob**: *${title}@(.AppImage|.APPIMAGE|.appimage)*
|
||||
3. Executable Configuration
|
||||
1. **Executable Modifier**: *"${exePath}”*
|
||||
4. Title Modification Configuration
|
||||
1. **Title Modifier**: *${fuzzyTitle}*
|
||||
|
||||
3. Hit the **Test** button to ensure your emulator AppImages.
|
||||
4. Hit **Save** to save the Parser.
|
||||
|
||||
---
|
||||
|
||||
### Adding Eden to Steam
|
||||
|
||||
Now that we have the parser or shell script created, we can actually add it to Steam.
|
||||
|
||||
1. Open *Steam ROM Manager* if it is not already open.
|
||||
2. Toggle the **Emulators - Emulators** parser on and hit ***Add Games*** in the top left.
|
||||
3. Click **Parse** to identify the emulators.
|
||||
4. Make sure all your emulators are showing up and have the right matches.
|
||||
|
||||
---
|
||||
|
||||
### Correcting a Mismatch
|
||||
|
||||
If the emulator is not identified correctly, you may need to tell *Steam ROM Manager* what the game is manually.
|
||||
|
||||
1. Hover over the emulator card and click the magnifying glass icon. Here it incorrectly identified *Eden* as a game by a similar name. **
|
||||
2. Search for *Eden Emulator* on the *Search SteamGridDB* section and scroll through the results, selecting the one you want.
|
||||
3. Ensure the *Name* and *Game ID* update in the **Per-App Exceptions** and press **Save and close**. The game should now update.
|
||||
|
||||
---
|
||||
|
||||
### Excluding Matches
|
||||
|
||||
You may want to tell Steam ROM Manager to ignore some files that it finds in the directory. This is how you do so.
|
||||
|
||||
1. Hit the **Exclude Games** button in the bottom right.
|
||||
2. Deselect the game you want to exclude, the poster artwork should go dim and the **Number Excluded** number should increment up. Repeat with any other exclusions you want to add.
|
||||
3. Hit **Save Excludes** when you are happy with your selections.
|
||||
|
||||
---
|
||||
|
||||
5. The program will now start writing the entries into the Steam Library. You should get pop up notifications of the progress, but you can monitor the progress by selecting the **Log** on the left-hand side if needed.
|
||||
6. Restart Steam to have the changes take effect. Check your library to ensure that your games are there, in a category if you defined one in the parser.
|
||||
7. Try to launch the Emulator from Steam and ensure everything is working. You are now good to go.
|
||||
@@ -0,0 +1,100 @@
|
||||
# Importing Games into Steam with Steam Rom Manager
|
||||
|
||||
Use this when you want to import your games inside Eden into Steam to launch with artwork from Steam Game Mode without needing to launch Eden first.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Importing-Games-into-Steam-with-Steam-Rom-Manager-2b757c2edaf680d7a491c92b138f1fcc) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Steam Deck Set up and Configured
|
||||
- Eden set up and Configured
|
||||
- Internet Access
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
|
||||
1. Press the **STEAM** button and then go to *Power → Switch to Desktop* to enter the Desktop mode.
|
||||
|
||||
1. Install ***Steam ROM Manager***, there are 2 ways you can accomplish this, either manually or through [*EmuDeck*](https://www.emudeck.com/#downloads).
|
||||
|
||||
---
|
||||
|
||||
### 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*
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: This assumes you have already set up EmuDeck, if not - just run through the guided installation and select *Steam ROM Manager* as one of the options.
|
||||
|
||||
</aside>
|
||||
|
||||
1. Open **EmuDeck**, then navigate to *Manage Emulators.*
|
||||
2. Scroll down to the bottom of the page to the *Manage your Tools & Frontends* section. Click **Steam ROM Manager**.
|
||||
|
||||
3. Click the **Install** button on the right hand side to install it.
|
||||
|
||||
---
|
||||
|
||||
2. Open the Start Menu and Launch ***Steam ROM Manager***
|
||||
|
||||
1. The program will now launch and show you a window with parsers.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: Your layout may look different depending on how you installed *Steam ROM Manager*. You may need to go to **Settings → Theme** and change it to *Classic* to follow along.
|
||||
|
||||
</aside>
|
||||
|
||||
2. Switch off all Parsers by hitting the *Toggle Parsers* switch.
|
||||
3. Scroll down the list on the left-hand side and look for a parser called *Nintendo Switch - Eden* and switch it on. This parser may not exist depending on how you installed *Steam ROM Manager* (EmuDeck creates it for you). Follow these steps to create it if it is missing.
|
||||
|
||||
---
|
||||
### Creating the Eden Parser
|
||||
|
||||
1. Select Create Parser and in the *Community Presets* option look for **Nintendo Switch - Yuzu**.
|
||||
2. Change the **Parser title** from *Nintendo Switch - Yuzu* to *Nintendo Switch - Eden.*
|
||||
3. Hit the **Browse** option under the *ROMs directory* section. Select the directory containing your Switch ROMs.
|
||||
4. Under *Steam collections*, you can add a Steam category name. This just organizes the games under a common category in your Steam Library, this is optional but recommended.
|
||||
5. Scroll down slightly to the **Executable Configuration → Executable**, select **Browse** and select the Eden AppImage.
|
||||
6. Leave everything else the same and hit **Save** to save the parser.
|
||||
---
|
||||
|
||||
4. Click the Eden parser to view the options on the right, select **Test** at the bottom of the screen to ensure that *Steam ROM Manager* detects your games correctly.
|
||||
1. *Steam ROM Manager* will start to scan the specified ROMs directory and match them to games. Look over the results to ensure they are accurate. If you do not see any entries - check your parsers ROMs directory field.
|
||||
1. When you are happy with the results, click the **Add Games** → **Parse** to start the actual Parsing.
|
||||
1. The program will now identify the games and pull artwork from [*SteamGridDB*](https://www.steamgriddb.com/).
|
||||
2. Review the game matches and ensure everything is there.
|
||||
|
||||
---
|
||||
|
||||
### Correcting a Mismatch
|
||||
|
||||
If the game is not identified correctly, you may need to tell *Steam ROM Manager* what the game is manually.
|
||||
|
||||
1. Hover over the game card and click the magnifying glass icon.
|
||||
2. Search for the game on the *Search SteamGridDB* section and scroll through the results, selecting the one you want.
|
||||
3. Ensure the *Name* and *Game ID* update in the **Per-App Exceptions** and press **Save and close**. The game should now update.
|
||||
|
||||
---
|
||||
|
||||
### Excluding Matches
|
||||
|
||||
You may want to tell Steam ROM Manager to ignore some files (updates/DLC/etc.) that it finds in the directory. This is how you do so.
|
||||
|
||||
1. Hit the **Exclude Games** button in the bottom right.
|
||||
2. Deselect the game you want to exclude, the poster artwork should go dim and the **Number Excluded** number should increment up. Repeat with any other exclusions you want to add.
|
||||
3. Hit **Save Excludes** when you are happy with your selections.
|
||||
---
|
||||
3. When you are happy with the results, select **Save to Steam** to save the results.
|
||||
1. The program will now start writing the entries into the Steam Library. You should get pop up notifications of the progress, but you can monitor the progress by selecting the **Log** on the left-hand side if needed.
|
||||
2. Restart Steam to have the changes take effect. Check your library to ensure that your games are there, in a category if you defined one in the parser.
|
||||
3. Try to launch a game and ensure everything is working. You are now good to go.
|
||||
@@ -0,0 +1,154 @@
|
||||
# User Handbook - Adding Boolean Settings Toggles
|
||||
|
||||
> [!WARNING]
|
||||
> This guide is intended for developers ONLY. If you are not a developer, this likely irrelevant to yourself.
|
||||
>
|
||||
> If you want to add temporary toggles, please refer to **[Adding Debug Knobs](AddingDebugKnobs.md)**
|
||||
|
||||
This guide will walk you through adding a new boolean toggle setting to Eden's configuration across both Qt's (PC) and Kotlin's (Android) UIs.
|
||||
|
||||
## Index
|
||||
|
||||
1. [Step 1 - src/common/settings](#step-1-src-common-settings)
|
||||
2. [Qt's (PC) Steps](#qt-pc-steps)
|
||||
|
||||
* [Step 2 - src/qt_common/config/shared_translation.cpp](#step-2-src-qt_common-config-shared_translation-cpp)
|
||||
3. [ Kotlin's (Android) Steps](#android-steps)
|
||||
|
||||
* [Step 3 - BooleanSetting.kt](#step-3-src-android-app-src-main-java-org-yuzu-yuzu_emu-features-settings-model-booleansetting-kt)
|
||||
* [Step 4 - SettingsItem.kt](#step-4-src-android-app-src-main-java-org-yuzu-yuzu_emu-features-settings-model-view-settingsitem-kt)
|
||||
* [Step 5 - SettingsFragmentPresenter.kt](#step-5-src-android-app-src-main-java-org-yuzu-yuzu_emu-features-settings-ui-settingsfragmentpresenter-kt)
|
||||
* [Step 6 - strings.xml](#step-6-src-android-app-src-main-res-values-strings-xml)
|
||||
4. [Step 7 - Use Your Toggle](#step-7-use-your-toggle)
|
||||
5. [Best Practices](#best-practices)
|
||||
|
||||
---
|
||||
|
||||
## Step 1 - src/common/settings.
|
||||
|
||||
Firstly add your desired toggle inside `setting.h`,
|
||||
Example:
|
||||
|
||||
```
|
||||
SwitchableSetting<bool> your_setting_name{linkage, false, "your_setting_name", Category::RendererExtensions};
|
||||
```
|
||||
|
||||
NOTE - If you wish for your toggle to be on by default then change `false` to `true` after `linkage,`.
|
||||
|
||||
### Remember to add your toggle to the appropriate category, for example:
|
||||
|
||||
Common Categories:
|
||||
|
||||
* Category::Renderer
|
||||
* Category::RendererAdvanced
|
||||
* Category::RendererExtensions
|
||||
* Category::System
|
||||
* Category::Core
|
||||
|
||||
---
|
||||
|
||||
## Qt (PC) Steps
|
||||
|
||||
### Step 2 - src/qt_common/config/shared_translation.cpp
|
||||
|
||||
Now you can add the toggle to the QT (PC) UI inside `shared_translation.cpp`,
|
||||
Find where you wish for it to appear and place it there.
|
||||
Example:
|
||||
|
||||
```
|
||||
INSERT(Settings,
|
||||
your_setting_name,
|
||||
tr("Your Setting Display Name"),
|
||||
tr("Detailed description of what this setting does.\n"
|
||||
"You can use multiple lines.\n"
|
||||
"Explain any caveats or requirements."));
|
||||
```
|
||||
|
||||
### Make sure to:
|
||||
|
||||
* Keep display naming consistant
|
||||
* Put detailed info in the description
|
||||
* Use `\n` for line breaks in descriptions
|
||||
|
||||
---
|
||||
|
||||
## Android Steps
|
||||
|
||||
### Step 3 - src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
|
||||
|
||||
Now add it inside `BooleanSetting.kt` where it should be in the settings.
|
||||
Example:
|
||||
|
||||
```
|
||||
RENDERER_YOUR_SETTING_NAME("your_setting_name"),
|
||||
```
|
||||
|
||||
Remember to make sure the naming of the prefix matches the desired category.
|
||||
|
||||
### Step 4 - src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
|
||||
|
||||
Now you may add the toggle to the Kotlin (Android) UI inside `SettingsItem.kt`.
|
||||
Example:
|
||||
|
||||
```
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.RENDERER_YOUR_SETTING_NAME,
|
||||
titleId = R.string.your_setting_name,
|
||||
descriptionId = R.string.your_setting_name_description
|
||||
)
|
||||
)
|
||||
```
|
||||
|
||||
### Step 5 - src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt
|
||||
|
||||
Now add your setting to the correct location inside `SettingsFragmentPresenter.kt` within the right category.
|
||||
Example:
|
||||
|
||||
```
|
||||
add(BooleanSetting.RENDERER_YOUR_SETTING_NAME.key)
|
||||
```
|
||||
|
||||
Remember, placing matters! Settings appear in the order of where you add them.
|
||||
|
||||
### Step 6 - src/android/app/src/main/res/values/strings.xml
|
||||
|
||||
Now add your setting and description to `strings.xml` in the appropriate place.
|
||||
Example:
|
||||
|
||||
```
|
||||
<string name="your_setting_name">Your Setting Display Name</string>
|
||||
<string name="your_setting_name_description">Detailed description of what this setting does. Explain any caveats, requirements, or warnings here.</string>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 7 - Use Your Toggle!
|
||||
|
||||
Now the UI part is done find a place in the code for the toggle,
|
||||
And use it to your heart's desire!
|
||||
Example:
|
||||
|
||||
```
|
||||
const bool your_value = Settings::values.your_setting_name.GetValue();
|
||||
|
||||
if (your_value) {
|
||||
// Do something when enabled
|
||||
}
|
||||
```
|
||||
|
||||
If you wish to do something only when the toggle is disabled,
|
||||
Use `if (!your_value) {` instead of `if (your_value) {`.
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
* Naming - Use clear, descriptive names. Something for both the devs and the users.
|
||||
* Defaults - Choose safe default values (usually false for new features).
|
||||
* Documentation - Write clear descriptions explaining when and why to use the setting.
|
||||
* Categories - Put settings in the appropriate category.
|
||||
* Order - Place related settings near each other.
|
||||
* Testing - Always test on both PC and Android before committing when possible.
|
||||
|
||||
### Thank you for reading, I hope this guide helped you making your toggle!
|
||||
@@ -0,0 +1,119 @@
|
||||
# User Handbook - Adding Debug Knobs
|
||||
|
||||
Debug Knobs is a 16-bit integer setting (`debug_knobs`) in the Eden Emulator that serves as a bitmask for gating various testing and debugging features. This allows developers and advanced users to enable or disable specific debug behaviors without requiring deploying of complete but temporary toggles.
|
||||
|
||||
The setting ranges from 0 to 65535 (0x0000 to 0xFFFF), where each bit represents a different debug feature flag.
|
||||
|
||||
## Index
|
||||
|
||||
1. [Advantages](#advantages)
|
||||
2. [Usage](#usage)
|
||||
|
||||
* [Accessing Debug Knobs (dev side)](#accessing-debug-knobs-dev-side)
|
||||
* [Setting Debug Knobs (user side)](#setting-debug-knobs-user-side)
|
||||
* [Bit Manipulation Examples](#bit-manipulation-examples)
|
||||
3. [Examples](#examples)
|
||||
|
||||
* [Example 1: Conditional Debug Logging](#example-1-conditional-debug-logging)
|
||||
* [Example 2: Performance Tuning](#example-2-performance-tuning)
|
||||
* [Example 3: Feature Gating](#example-3-feature-gating)
|
||||
4. [Best Practices](#best-practices)
|
||||
|
||||
---
|
||||
|
||||
## Advantages
|
||||
|
||||
The main advantage is to avoid deploying new disposable toggles (those made only for testing stage, and are disposed once new feature gets good to merge). This empowers devs to be free of all frontend burocracy and hassle of new toggles.
|
||||
|
||||
Common advantages recap:
|
||||
|
||||
* **Fine-Grained Control**: Enable or disable up to 16 individual debug features independently using bit manipulation on a single build
|
||||
* **Runtime Configuration**: Change debug behavior at runtime the same way as new toggles would do
|
||||
* **Safe incremental development**: New debug features can be added while impact can be isolated from previous deployments
|
||||
|
||||
## Usage
|
||||
|
||||
### Accessing Debug Knobs (dev side)
|
||||
|
||||
Use the `Settings::getDebugKnobAt(u8 i)` function to check if a specific bit is set:
|
||||
|
||||
```cpp
|
||||
#include "common/settings.h"
|
||||
|
||||
// Check if bit 0 is set
|
||||
bool feature_enabled = Settings::getDebugKnobAt(0);
|
||||
|
||||
// Check if bit 15 is set
|
||||
bool another_feature = Settings::getDebugKnobAt(15);
|
||||
```
|
||||
|
||||
The function returns `true` if the specified bit (0-15) is set in the `debug_knobs` value, `false` otherwise.
|
||||
|
||||
### Setting Debug Knobs (user side)
|
||||
|
||||
Developers must inform which knobs are tied to each functionality to be tested.
|
||||
|
||||
The debug knobs value can be set through:
|
||||
|
||||
1. **Desktop UI**: In the Debug configuration tab, there's a spinbox for "Debug knobs" (0-65535)
|
||||
2. **Android UI**: Available as an integer setting in the Debug section
|
||||
3. **Configuration Files**: Set the `debug_knobs` value in the emulator's configuration
|
||||
|
||||
### Bit Manipulation Examples
|
||||
|
||||
To enable specific features, calculate the decimal value by setting the appropriate bits:
|
||||
|
||||
* **Enable only bit 0**: Value = 1 (2^0)
|
||||
* **Enable only bit 1**: Value = 2 (2^1)
|
||||
* **Enable bits 0 and 1**: Value = 3 (2^0 + 2^1)
|
||||
* **Enable bit 15**: Value = 32768 (2^15)
|
||||
|
||||
## Examples
|
||||
|
||||
### Example 1: Conditional Debug Logging
|
||||
|
||||
```cpp
|
||||
void SomeFunction() {
|
||||
if (Settings::getDebugKnobAt(0)) {
|
||||
LOG_DEBUG(Common, "Debug feature 0 is enabled");
|
||||
// Additional debug code here
|
||||
}
|
||||
|
||||
if (Settings::getDebugKnobAt(1)) {
|
||||
LOG_DEBUG(Common, "Debug feature 1 is enabled");
|
||||
// Different debug behavior
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Example 2: Performance Tuning
|
||||
|
||||
```cpp
|
||||
bool UseOptimizedPath() {
|
||||
// Skip optimization if debug bit 2 is set for testing
|
||||
return !Settings::getDebugKnobAt(2);
|
||||
}
|
||||
```
|
||||
|
||||
### Example 3: Feature Gating
|
||||
|
||||
```cpp
|
||||
void ExperimentalFeature() {
|
||||
static constexpr u8 EXPERIMENTAL_FEATURE_BIT = 3;
|
||||
|
||||
if (!Settings::getDebugKnobAt(EXPERIMENTAL_FEATURE_BIT)) {
|
||||
// Fallback to stable implementation
|
||||
StableImplementation();
|
||||
return;
|
||||
}
|
||||
|
||||
// Experimental implementation
|
||||
ExperimentalImplementation();
|
||||
}
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
* This setting is intended for development and testing purposes only
|
||||
* Knobs must be unwired before PR creation
|
||||
* The setting is per-game configurable, allowing different debug setups for different titles
|
||||
@@ -0,0 +1,20 @@
|
||||
# Setting a Custom Date/Time in Eden
|
||||
|
||||
Use this guide whenever you want to modify the Date or Time that Eden reports to games. This can be useful for modifying RNG elements, skipping wait times in games, etc.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Setting-a-Custom-Date-Time-in-Eden-2b357c2edaf680acb8d4e63ccc126564) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden set up and fully configured
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
|
||||
1. Navigate to *Emulation → Configure*.
|
||||
2. Click on the **System** item on the left-hand side navigation, then check the *Custom RTC Date* box.
|
||||
3. The Date/Time option now becomes editable. Set it to the value you want and hit **OK**.
|
||||
4. GREAT SCOTT! We have time traveled! You can of course go forward or backward in time (as long as it is not before the year 1970) and your game should update accordingly (e.g. certain *Super Mario Odyssey* moons that take time for flowers to grow will now be fully grown.).
|
||||
@@ -0,0 +1,22 @@
|
||||
# User Handbook - Command Line
|
||||
|
||||
There are two main applications, an SDL2 based app (`eden-cli`) and a Qt based app (`eden`); both accept command line arguments.
|
||||
|
||||
## eden
|
||||
- `./eden <path>`: Running with a single argument and nothing else, will make the emulator look for the given file and load it, this behaviour is similar to `eden-cli`; allows dragging and dropping games into the application.
|
||||
- `-g <path>`: Alternate way to specify what to load, overrides. However let it be noted that arguments that use `-` will be treated as options/ignored, if your game, for some reason, starts with `-`, in order to safely handle it you may need to specify it as an argument.
|
||||
- `-f`: Use fullscreen.
|
||||
- `-u <number>`: Select the index of the user to load as.
|
||||
- `-qlaunch`: Launch QLaunch.
|
||||
- `-setup`: Launch setup applet.
|
||||
|
||||
## eden-cli
|
||||
- `--debug/-d`: Enter debug mode, allow gdb stub at port `1234`
|
||||
- `--config/-c`: Specify alternate configuration file.
|
||||
- `--fullscreen/-f`: Set fullscreen.
|
||||
- `--help/-h`: Display help.
|
||||
- `--game/-g`: Specify the game to run.
|
||||
- `--multiplayer/-m`: Specify multiplayer options.
|
||||
- `--program/-p`: Specify the program arguments to pass (optional).
|
||||
- `--user/-u`: Specify the user index.
|
||||
- `--version/-v`: Display version and quit.
|
||||
@@ -0,0 +1,49 @@
|
||||
# Configuring Controller Profiles
|
||||
|
||||
Use this guide for when you want to configure specific controller settings to be reused.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Configuring-Controller-Profiles-2be57c2edaf680eabc3ac8c333ec75c4) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden Set Up and Configured
|
||||
|
||||
---
|
||||
|
||||
### Steps
|
||||
1. Launch Eden and wait for it to load.
|
||||
2. Navigate to *Emulation > Configure…*
|
||||
3. Select **Controls** from the left-hand menu and configure your controller for the way you want it to be in game.
|
||||
4. Select **New** and enter a name for the profile in the box that appears. Press **OK** to save the profile settings.
|
||||
5. Select **OK** to close the settings menu.
|
||||
|
||||
## Setting Controller Profiles By Game
|
||||
|
||||
Use this guide when you want to set up specific controller profiles for specific games. This can be useful for certain games like *Captain Toad Treasure Tracker* where a blue dot appears in the middle of the screen when you have docked mode enabled, but not handheld mode.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Setting-Controller-Profiles-By-Game-2b057c2edaf681658a57f0c199cb6083) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden Emulator set up and fully configured
|
||||
- Controller Profile Created
|
||||
- See [*Configuring Controller Profiles*](./ControllerProfiles.md) for instructions on how to do this if needed.
|
||||
|
||||
---
|
||||
|
||||
### Steps
|
||||
|
||||
1. *Right-Click* the game you want to apply the profile to in the main window and select **Properties.**
|
||||
2. Navigate to the **Input Profiles** tab in the window that appears. Drop down on *Player 1 profile* (or whatever player profile you want to apply it to) and select the profile you want.
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: You may have to resize the window to see all tabs, or press the arrows by the tabs to see **Input Profiles**.
|
||||
|
||||
</aside>
|
||||
1. Click **OK** to apply the profile mapping.
|
||||
2. Launch the game and confirm that the profile is applied, regardless of what the global configuration is.
|
||||
@@ -43,6 +43,12 @@ Various graphical filters exist - each of them aimed at a specific target/image
|
||||
- **Pros**: Offers decent pixel-art upscaling.
|
||||
- **Cons**: Only works for pixel-art.
|
||||
|
||||
### Anisotropy values
|
||||
|
||||
The anisotropy value is (value game wants + the set value); **Default** will use the native anisotropy value as it would be on hardware. **Automatic** sets it according to screen resolution. Turning off anisotropy is not recommended as it can break a myriad of games, however it is provided in the name of flexibility.
|
||||
|
||||
Values from x2, x4, x8, x16, x32 up to x64 values are provided. This should be enough to not need to revise those values in my lifetime ever again.
|
||||
|
||||
### External
|
||||
|
||||
While stock shaders offer a basic subset of options for most users, programs such as [ReShade](https://github.com/crosire/reshade) offer a more flexible experience. In addition to that users can also seek out modifications (mods) for enhancing visual experience (60 FPS mods, HDR, etc).
|
||||
@@ -84,3 +90,22 @@ The OpenGL backend would invoke behaviour that would result in swarst/LLVMpipe w
|
||||
### HaikuOS compatibility
|
||||
|
||||
HaikuOS bundles a Mesa library that doesn't support full core OpenGL 4.6 (required by the emulator). This leads to HaikuOS being one of the few computer platforms where Vulkan is the only available option for users. If OpenGL is desired, Mesa has to be built manually from source. For debugging purpouses `lavapipe` is recommended over the GPU driver; there is in-kernel support for NVIDIA cards through.
|
||||
|
||||
### Fixes for Windows 10 and above having "Device loss"
|
||||
|
||||
Run the following batch script *inside* the Eden folder:
|
||||
```cmd
|
||||
@echo off
|
||||
pushd "%~dp0"
|
||||
if exist "%temp%\FixFullScreen.reg" (
|
||||
del %temp%\FixFullScreen.reg
|
||||
)
|
||||
set str_path="%cd:\=\\%\\eden.exe"
|
||||
echo Windows Registry Editor Version 5.00 >> %temp%\FixFullScreen.reg
|
||||
echo. >> %temp%\FixFullScreen.reg
|
||||
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers] >> %temp%\FixFullScreen.reg
|
||||
echo %str_path%="~ DISABLEDXMAXIMIZEDWINDOWEDMODE HIGHDPIAWARE" >> %temp%\FixFullScreen.reg
|
||||
regedit /s %temp%\FixFullScreen.reg
|
||||
del %temp%\FixFullScreen.reg
|
||||
exit /b
|
||||
```
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
# Getting Gyro/Motion Controls Working on Steam Deck
|
||||
Use this guide when you want to use the Steam Deck's native gyro functionality for motion controls in Eden.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Getting-Gyro-Motion-Controls-Working-on-Steam-Deck-2b057c2edaf681a1aaade35db6e0fd1b) for a version of this guide with images & visual elements.**
|
||||
|
||||
## Steamdeck
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Steam Deck Set up and Configured
|
||||
- Eden set up and Configured
|
||||
- Internet Access
|
||||
|
||||
---
|
||||
|
||||
### Steps
|
||||
|
||||
1. Go into Steam Deck's Desktop Mode, and use the shortcut to launch EmuDeck.
|
||||
2. Install [SteamDeckGyroDSU](https://github.com/kmicki/SteamDeckGyroDSU/releases) by going to *3rd Party Tools > Gyroscope* and clicking **Install.**
|
||||
a. Alternatively you can install [SteamDeckGyroDSU](https://github.com/kmicki/SteamDeckGyroDSU/releases) manually following the GitHub page instructions.
|
||||
3. Upon completion of the installation. You will need to reboot your Steam Deck. Do so before continuing on.
|
||||
4. Go back into the Steam Deck Desktop Mode and open the Dolphin File Explorer.
|
||||
5. Navigate to the following directory to see you controller configuration: `/home/deck/.config/Eden`
|
||||
6. *Right-Click* the **qt-config.ini** file and open it with ***Kate***
|
||||
7. Look for the following line: `player_0_motionleft=[empty]`.
|
||||
8. Change the line to now say: `player_0_motionleft="motion:0,pad:0,port:26760,guid:0000000000000000000000007f000001,engine:cemuhookudp"`
|
||||
9. Save the file and open Eden.
|
||||
10. Launch a compatible title, like *The Legend of Zelda: Breath of the Wild*.
|
||||
11. Test the gyro capabilities, for the above mentioned title, it is accessed by holding down the **R Trigger** and moving the Steam Deck around.
|
||||
@@ -0,0 +1,47 @@
|
||||
# How to Access Logs
|
||||
|
||||
Use this when you need to review the logs to determine an issue or provide them to a member of the Eden team.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/How-to-Access-Logs-2b057c2edaf68105a281fe1688a332d4) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
## Pre-Requisites
|
||||
|
||||
- Eden installed and run at least once
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
|
||||
### Windows
|
||||
|
||||
*By default the Eden folder is stored in your AppData `C:\Users\<USER>\AppData\Roaming\Eden\log`, or the local **user** folder if you have a portable installation.*
|
||||
|
||||
<aside>
|
||||
|
||||
1. Open Eden.
|
||||
2. Navigate to *File > Open Eden Folder > Log Folder*, a Windows explorer window will appear.
|
||||
3. Your log files are now here for your review or upload.
|
||||
</aside>
|
||||
|
||||
### Steam Deck
|
||||
|
||||
*By default the Eden folder is stored in `/home/deck/.local/share/Eden`, or the local **user** folder if you have a portable installation.*
|
||||
|
||||
<aside>
|
||||
|
||||
1. Open Eden.
|
||||
2. Navigate to *File > Open Eden Folder > Log Folder*, a Dolphin file explorer window will appear.
|
||||
3. Your log files are now here for your review or upload.
|
||||
</aside>
|
||||
|
||||
### Android
|
||||
|
||||
*Logs are stored in the application data, so you wouldn't be able to access the files directly without a rooted device.*
|
||||
|
||||
<aside>
|
||||
|
||||
1. Open the Eden application on your device.
|
||||
2. Navigate to *Settings > Share Debug Logs.* You can either save it to your device or send it through some other manner supported by your device.
|
||||
</aside>
|
||||
@@ -0,0 +1,30 @@
|
||||
# Importing Saves Into Eden
|
||||
|
||||
Use this guide when you want to manually import save files for use in the Eden emulator.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Importing-Saves-Into-Eden-2b057c2edaf681fe968df8d63821ccae) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden emulator already set up and configured.
|
||||
- The save file(s) you want to import
|
||||
|
||||
## Desktop
|
||||
|
||||
### Steps
|
||||
1. Open Eden and wait for it to load.
|
||||
2. Start the game and create a save file to establish the directories.
|
||||
3. *Right-Click* the game for which you want to load a save in.
|
||||
4. Select *Open Save Data Location.*
|
||||
5. A File Explorer will now appear where Eden is looking for the save data for this title.
|
||||
6. Copy the save file(s) you want to import and use in Eden into this directory.
|
||||
<aside>
|
||||
|
||||
***NOTE***: Different games have different ways of saving them, it may be a single file or multiple files.
|
||||
|
||||
</aside>
|
||||
7. Close the file explorer as it is no longer needed.
|
||||
8. Launch the game in Eden and verify that the save data appears through whatever method the game implements.
|
||||
|
||||
## Android
|
||||
|
||||
TBD
|
||||
@@ -0,0 +1,32 @@
|
||||
# User Handbook - Installing Atmosphere Mods
|
||||
|
||||
Use this guide for when you want to install an Atmosphere-based mod for use in Eden.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Installing-Atmosphere-Mods-2b057c2edaf681fe8d39cbfc2d0cc799) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden already set up and functioning with keys and firmware
|
||||
- The mod you want to install
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
|
||||
1. Right-Click the game you want to apply the mod to and select **Open Mod Data Location.**
|
||||
2. Create new folder inside the mod directory with the name of the mod.
|
||||
3. Extract the downloaded mod (if applicable) to a temporary directory.
|
||||
4. Locate the ***exefs*** and ***romfs*** folders inside the extracted mod - usually *atmosphere/contents/<TITLE_ID>*.
|
||||
5. Copy the ***exefs*** and ***romfs*** folders into the mod folder you created earlier.
|
||||
6. Restart Eden.
|
||||
7. Right-Click the game you installed the mod to and hit *Configure Game*.
|
||||
8. Look in the **Add-Ons** tab and observe that the Mod Name (or whatever you named the folder to earlier) now appears on the list and is selected.
|
||||
9. Hit **OK** and launch the game. Your mod should now be active.
|
||||
<aside>
|
||||
|
||||
***NOTE:*** Your mod may not show up on the home screen initially, if it does not. Hit the refresh button in the bottom-left of the window or go back into *Configure Game* and disable the mod by unchecking it, and clicking **OK**. It should now appear on the home screen in the Add-Ons column correctly. Just go back into the *Configure Game* and enable it again if you use this method.
|
||||
|
||||
</aside>
|
||||
10. Your mod is now ready to play.
|
||||
@@ -0,0 +1,52 @@
|
||||
# User Handbook - Working with Updates/DLC in Eden
|
||||
|
||||
Use this guide when you want to install Updates or DLC for your games in Eden.
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: This applies to separate Update/DLC files, not “merged” NSP/XCI’s which include the base game and Updates/DLC applied on top of them in a single file. These files work in Eden, but would not require the following steps.
|
||||
|
||||
</aside>
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Working-with-Updates-DLC-in-Eden-2b057c2edaf681dfb65dfc4dd96980c0) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
1. Eden already setup and configured for your platform.
|
||||
2. The Update/DLC file(s) you want to install
|
||||
|
||||
---
|
||||
|
||||
## Installing Updates/DLC
|
||||
|
||||
1. Open Eden to the Main Window.
|
||||
2. Select *File > Install Files to NAND...*.
|
||||
3. Navigate to the Update/DLC files you want to install.
|
||||
<aside>
|
||||
|
||||
***TIP***: You can install multiple files at once by selecting multiple files in this window.
|
||||
|
||||
</aside>
|
||||
|
||||
4. The file(s) will be scanned for validity and then a confirmation window will appear, select *Install* to begin installation.
|
||||
<aside>
|
||||
|
||||
***TIP***: You can deselect any that you do not want to install with the checkbox by each entry.
|
||||
|
||||
</aside>
|
||||
|
||||
5. Upon installation, you will get a prompt saying it was installed successfully.
|
||||
6. Look at the *Add-Ons* column in the main window, you should now see the additional installed content reflected.
|
||||
|
||||
---
|
||||
|
||||
## Disabling Updates/DLC
|
||||
|
||||
Upon occasion you may find that you want to disable a certain DLC or Update (incompatibility with a mod, causes significant regression, etc.). Luckily the process if very easy to do so.
|
||||
|
||||
1. *Right-Click* the game for which you want to disable the additional content.
|
||||
2. Select *Configure Game.*
|
||||
3. Uncheck the box next to the DLC or Update you want to disable and hit **OK**.
|
||||
4. The listing should now reflect that it has been disabled with a **[D]** before the entry. If you load the game, you will observe that the reported version is not updated (assuming the game reports this information).
|
||||
@@ -0,0 +1,296 @@
|
||||
# Multiplayer
|
||||
Use this guide to answer questions regarding and to start using the multiplayer functionality of Eden.
|
||||
|
||||
## Multiplayer FAQ
|
||||
This FAQ will serve as a general quick question and answer simple questions.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Multiplayer-FAQ-2c357c2edaf680fca2e9ce59969a220f) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Can Eden Play Games with a Switch Console?
|
||||
No - The only emulator that has this kind of functionality is *Ryujinx* and it's forks. This solution requires loading a custom module on a modded switch console to work.
|
||||
|
||||
### Can I Play Online Games?
|
||||
No - This would require hijacking requests to Nintendo's official servers to a custom server infrastructure built to emulate that functionality. This is how services like [*Pretendo*](https://pretendo.network/) operate. As such, you would not be able to play “Online”, you can however play multiplayer games.
|
||||
|
||||
### What's the Difference Between Online and Multiplayer?
|
||||
I have chosen the wording carefully here for a reason.
|
||||
|
||||
- Online: Games that connect to Nintendo's Official servers and allow games/functionality using that communication method are unsupported on any emulator currently (for obvious reasons).
|
||||
- Multiplayer: The ability to play with multiple players on separate systems. This is supported for games that support LDN Local Wireless.
|
||||
|
||||
The rule of thumb here is simple: If a game supports the ability to communicate without a server (Local Wireless, LAN, etc.) you will be able to play with other users. If it requires a server to function - it will not. You will need to look up if your title support Local Wireless/LAN play as an option.
|
||||
|
||||
### How Does Multiplayer Work on Eden Exactly?
|
||||
Eden's multiplayer works by emulating the Switch's local wireless (LDN) system, then tunneling that traffic over the internet through “rooms” that act like lobbies. Each player runs their own instance of the emulator, and as long as everyone joins the same room and the game supports local wireless multiplayer, the emulated consoles see each other as if they were on the same local network. This design avoids typical one-save netplay issues because every user keeps an independent save and console state while only the in-game wireless packets are forwarded through the room server. In practice, you pick or host a room, configure your network interface/port forwarding if needed, then launch any LDN-capable game; from the game's perspective it is just doing standard local wireless, while the emulator handles discovery and communication over the internet or LAN.
|
||||
|
||||
### What Do I Need to Do?
|
||||
That depends entirely on what your goal is and your level of technical ability, you have a 2 options on how to proceed.
|
||||
|
||||
1. Join a Public Lobby.
|
||||
1. If you just want to play *Mario Kart 8 Deluxe* with other people and don't care how it works or about latency - this is the option for you. See the *Joining a Multiplayer Room* section for instructions on how to do this.
|
||||
2. Host Your Own Room.
|
||||
1. This option will require you to be comfortable with accessing your router's configuration, altering firewall rules, and troubleshooting when things (inevitably) don't work out perfectly on the first try. Use this option if you want to control the room entirely, are concerned about latency issues, or just want to run something for your friends. See the *Hosting a Multiplayer Room* section for next steps*.*
|
||||
|
||||
### Can Other Platforms Play Together?
|
||||
Yes - the platform you choose to run the emulator on does not matter. Steam Deck users can play with Windows users, Android users can play with MacOS users, etc. Furthermore different emulators can play together as well (Eden/Citron/Ryubing, etc.) - but be you may want to all go to the same one if you are having issues.
|
||||
|
||||
### What Pitfalls Should I Look Out For?
|
||||
While it would be nice if everything always worked perfectly - that is not reality. Here are some things you should watch out for when attempting to play multiplayer.
|
||||
|
||||
1. Emulator Version Mismatches
|
||||
1. Occasionally updates to the emulator of choice alter how the LDN functionality is handled. In these situations, unexpected behavior can occur when trying to establish LDN connections. This is a good first step to check if you are having issues playing a game together, but can join the same lobby without issue.
|
||||
2. Game Version Mismatches
|
||||
1. It is best practice to have the game version be identical to each other in order to ensure that there is no difference in how the programs are handling the LDN logic. Games are black boxes that the dev team cannot see into to ensure the logic handling operates the same way. For this reason, it is highly advised that the game versions match across all the players. This would be a good 2nd step to check if you are having issues playing a game together, but can join the same lobby without issue.
|
||||
3. Latency
|
||||
1. Because this implementation is emulating a LAN/Local Wireless connection - it is extremely sensitive to network latency and drops. Eden has done a good job of trying to account for this and not immediately drop users out - but it is not infallible. If latency is a concern or becomes an issue - consider hosting a room.
|
||||
|
||||
---
|
||||
|
||||
## Joining a Multiplayer Room
|
||||
Use this when you need to connect to a multiplayer room for LDN functionality inside of Eden. This does not cover how to host a room, only joining existing ones.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Access-Your-Multiplayer-Room-Externally-2c357c2edaf681c0ab2ce2ee624d809d) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden set up and functioning
|
||||
- Multiplayer Options Configured in Eden Settings
|
||||
- Network Access
|
||||
|
||||
## Steps
|
||||
There are 2 primary methods that you can use to connect to an existing room, depending on how the room is hosted.
|
||||
|
||||
- Joining a Public Lobby
|
||||
- This option allows you to view publicly hosted lobbies and join them easily. Use this option if you just want to join a room and play quickly.
|
||||
- Directly Connecting to a Room
|
||||
- Use this option if the hosted room is not on the public lobby list (private, internal network only, etc.)
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE:*** Just because a lobby appears on the public lobby list, does not mean that the hoster has properly configured the necessary port forwarding/firewall rules to allow a connection. If you cannot connect to a lobby, move onto another entry as the issue is probably not on your end. Start looking at your environment if you are unable to connect to multiple/any lobbies.
|
||||
|
||||
</aside>
|
||||
|
||||
### Joining a Public Lobby
|
||||
1. Open Eden and navigate to *Multiplayer → Browse Public Game Lobby*.
|
||||
2. The **Public Room Browser** will now open and display a list of publicly accessible rooms. Find one you want to connect to and double click it.
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: Just because a room is set for a specific game, does not mean that you ***have*** to play that game in that lobby. It is generally good practice to do so, but there is no enforcement of that.
|
||||
|
||||
</aside>
|
||||
3. You will now see a window showing everyone on the lobby, or an error message.
|
||||
|
||||
### Direct Connecting to a Room
|
||||
If the hoster has not made the lobby public, or you don't want to find it in the public game browser - use this option to connect.
|
||||
|
||||
1. Open Eden and navigate to *Multiplayer → Direct Connect*.
|
||||
2. Enter the *Server Address, Port*, *Nickname* (what your user will be called in the room), and a *Password* (if the hoster set one, otherwise leave it blank) and hit **Connect.**
|
||||
3. You will now see a window showing everyone on the lobby, or an error message.
|
||||
|
||||
---
|
||||
|
||||
# Hosting a Multiplayer Room
|
||||
Use this guide for when you want to host a multiplayer lobby to play with others in Eden. In order to have someone access the room from outside your local network, see the *Access Your Multiplayer Room Externally* section for next steps.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Hosting-a-Multiplayer-Room-2c357c2edaf6819481dbe8a99926cea2) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden set up and Functioning
|
||||
- Network Access
|
||||
- Ability to allow programs through the firewall on your device.
|
||||
|
||||
## Steps
|
||||
1. Open Eden and navigate to *Emulation → Multiplayer → Create Room.*
|
||||
2. Fill out the following information in the popup dialog box.
|
||||
|
||||
|
||||
| **Option** | **Acceptable Values** | **Default** | **Description** |
|
||||
| --- | --- | --- | --- |
|
||||
| Room Name | *Any string between 4 - 20 characters.* | *None* | Controls the name of the room and how it would appear in the Public Game Lobby/Room screen. |
|
||||
| Username | *Any string between 4 - 20 characters.* | *None* | Controls the name your user will appear as to the other users in the room. |
|
||||
| Preferred Game | *Any Game from your Game List.* | The first game on your game list | What game will the lobby be playing? You are not forced to play the game you choose and can switch games without needing to recreate the room. |
|
||||
| Password | *None or any string* | *None* | What password do you want to secure the room with, if any. |
|
||||
| Max Players | 2 - 16 | 8 | How many players do you want to allow in the room at a time? |
|
||||
| Port | 1024 - 65535 | 24872 | What port do you want to run the lobby on? Could technically be any port number, but it's best to choose an uncommon port to avoid potential conflicts. See [*Well-Known Ports*](https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports) for more information on ports commonly used. |
|
||||
| Room Description | *None or any string* | *None* | An optional message that elaborates on what the room is for, or for a makeshift message of the day presented to users in the lobby. |
|
||||
| Load Previous Ban List | [Checked, Unchecked] | Checked | Tells Eden to load the list containing users you have banned before. |
|
||||
| Room Type | [Public, Unlisted] | Public | Specifies whether you want the server to appear in the public game lobby browser |
|
||||
3. Click **Host Room** to start the room server. You may get a notice to allow the program through the firewall from your operating system. Allow it and then users can attempt to connect to your room.
|
||||
|
||||
---
|
||||
|
||||
# Access Your Multiplayer Room Externally
|
||||
Quite often the person with whom you want to play is located off of your internal network (LAN). If you want to host a room and play with them you will need to get your devices to communicate with each other. This guide will go over your options on how to do this so that you can play together.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Access-Your-Multiplayer-Room-Externally-2c357c2edaf681c0ab2ce2ee624d809d) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden set up and Functioning
|
||||
- Network Access
|
||||
|
||||
## Options
|
||||
|
||||
### Port Forwarding
|
||||
|
||||
- **Difficulty Level**: High
|
||||
|
||||
<aside>
|
||||
|
||||
Use this option if you want the greatest performance/lowest latency, don't want to install any software, and have the ability to modify your networking equipment's configuration (most notably - your router). Avoid this option if you cannot modify your router's configuration or are uncomfortable with looking up things on your own.
|
||||
|
||||
</aside>
|
||||
|
||||
|
||||
Port forwarding is a networking technique that directs incoming traffic arriving at a specific port on a router or firewall to a designated device and port inside a private local network. When an external client contacts the public IP address of the router on that port, the router rewrites the packet's destination information (IP address and sometimes port number) and forwards it to the internal host that is listening on the corresponding service. This allows services such as web servers, game servers, or remote desktop sessions hosted behind NAT (Network Address Translation) to be reachable from the wider Internet despite the devices themselves having non-routable private addresses.
|
||||
|
||||
The process works by creating a static mapping—often called a “port-forward rule”—in the router's configuration. The rule specifies three pieces of data: the external (public) port, the internal (private) IP address of the target machine, and the internal port on which that machine expects the traffic. When a packet arrives, the router checks its NAT table, matches the external port to a rule, and then translates the packet's destination to the internal address before sending it onward. Responses from the internal host are similarly rewritten so they appear to come from the router's public IP, completing the bidirectional communication loop. This mechanism enables seamless access to services inside a protected LAN without exposing the entire network.
|
||||
|
||||
For our purposes we would pick the port we want to expose (*e.g. 24872*) and we would access our router's configuration and create a port-forward rule to send the traffic from an external connection to your local machine over our specified port (*24872)*. The exact way to do so, varies greatly by router manufacturer - and sometimes require contacting your ISP to do so depending on your agreement. You can look up your router on [*portforward.com*](https://portforward.com/router.htm) which may have instructions on how to do so for your specific equipment. If it is not there, you will have to use Google/ChatGPT to determine the steps for your equipment.
|
||||
|
||||
|
||||
### Use a Tunnelling Service
|
||||
- **Difficulty Level**: Easy
|
||||
|
||||
<aside>
|
||||
|
||||
Use this option if you don't want to have to worry about other users machine/configuration settings, but also cannot do port forwarding. This will still require that you as the hoster install a program and sign up for an account - but will prevent you from having to deal with port forwards or networking equipment. Avoid this option if there is not a close relay and you are getting issues with latency.
|
||||
|
||||
</aside>
|
||||
|
||||
|
||||
Using a Tunnelling service may be the solution to avoid port forward, but also avoid worrying about your users setup. A tunnelling service works by having a lightweight client run on the machine that hosts the game server. That client immediately opens an **outbound** encrypted connection (typically over TLS/QUIC) to a relay node operated by the tunnel provider's cloud infrastructure. Because outbound traffic is almost always allowed through NAT routers and ISP firewalls, the tunnel can be established even when the host sits behind carrier-grade NAT or a strict firewall. The tunnel provider then assigns a public address (e.g., `mygame.playit.gg:12345`). When a remote player connects to that address, the traffic reaches the the tunnel provider relay, which forwards it through the already-established tunnel back to the client on the private network, and finally onto the local game server's port. In effect, the server appears to the Internet as if it were listening on the public address, while the host never needs to configure port-forwarding rules or expose its own IP directly.
|
||||
|
||||
For our purposes we would spawn the listener for the port that way chose when hosting our room. The user would connect to our assigned public address/port combination, and it would be routed to our machine. The tunnel must remain active for as long as you want the connection to remain open. Closing the terminal will kill the tunnel and disconnect the users.
|
||||
|
||||
**Recommended Services:**
|
||||
- [*Playit.GG*](https://playit.gg/)
|
||||
|
||||
|
||||
### Use a VPN Service
|
||||
|
||||
- **Difficulty**: Easy
|
||||
|
||||
<aside>
|
||||
|
||||
Use this option if you don't want to use a tunnelling service, or don't want to manage the overhead of the playit gg solution, don't want to send data through the relay, or any other reason. Avoid this method if you do not want to have to manage VPN installation/configuration for your users.
|
||||
|
||||
</aside>
|
||||
|
||||
The VPN solution is a good compromise between the tunnelling solution and port forwarding. You do not have to port forward or touch your networking equipment at all - but also don't need to send all your data connections through a 3rd party relay. The big downside is that you will have to ensure all of your users have your VPN solution installed *and* that they have a valid configuration. When looking for a solution, it is advised to find one that uses the WireGuard protocol for speed, and does not require communication with a server beyond the initial handshake.
|
||||
|
||||
**Recommended Services:**
|
||||
- [*Tailscale*](https://tailscale.com/)
|
||||
- [*ZeroTier*](https://www.zerotier.com/)
|
||||
- *Self-hosted VPN Solution*
|
||||
- This is so far out of the scope of this document it has a different postal code.
|
||||
|
||||
*Check with the provider you select on the sign up and installation process specific to that provider.*
|
||||
|
||||
---
|
||||
|
||||
# Finding the Server Information for a Multiplayer Room
|
||||
Use this guide when you need to determine the connection information for the Public Multiplayer Lobby you are connected to.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Finding-the-Server-Information-for-a-Multiplayer-Room-2c557c2edaf6809e94e8ed3429b9eb26) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden set up and configured
|
||||
- Internet Access
|
||||
|
||||
## Steps
|
||||
|
||||
### Method 1: Grabbing the Address from the Log File
|
||||
1. Open Eden and Connect to the room you want to identify.
|
||||
1. See the *Joining a Multiplayer Room* section for instructions on how to do so if you need them.
|
||||
2. Go to *File → Open Eden Folder*, then open the **config** folder.
|
||||
3. Open the the **qt-config.ini** file in a text editor.
|
||||
4. Search for the following keys:
|
||||
1. `Multiplayer\ip=`
|
||||
2. `Multiplayer\port=`
|
||||
5. Copy the Server Address and Port.
|
||||
|
||||
### Method 2: Using a Web Browser
|
||||
1. Obtain the name of the room you want the information for.
|
||||
2. Open a Web Browser.
|
||||
3. Navigate to [`https://api.ynet-fun.xyz/lobby`](https://api.ynet-fun.xyz/lobby)
|
||||
4. Press *Ctrl + F* and search for the name of your room.
|
||||
5. Look for and copy the Server Address and Port.
|
||||
|
||||
### Method 3: Using a Terminal (PowerShell or CURL)
|
||||
1. Obtain the name of the room you want the information for.
|
||||
2. Open the terminal supported by your operating system.
|
||||
3. Run one of the following commands, replacing *<Name>* with the name of the server from step 1.
|
||||
|
||||
### PowerShell Command [Windows Users]
|
||||
|
||||
```powershell
|
||||
# Calls the API to get the address and port information
|
||||
(Invoke-RestMethod -Method Get -Uri "https://api.ynet-fun.xyz/lobby").rooms | Where-Object {$_.Name -eq '<NAME>'} | Select address,port | ConvertTo-Json
|
||||
|
||||
# Example Output
|
||||
#{
|
||||
# "address": "118.208.233.90",
|
||||
# "port": 5001
|
||||
#}
|
||||
```
|
||||
|
||||
### CURL Command [MacOS/Linux Users] **Requires jq*
|
||||
|
||||
```bash
|
||||
# Calls the API to get the address and port information
|
||||
curl -s "https://api.ynet-fun.xyz/lobby" | jq '.rooms[] | select(.name == "<NAME>") | {address, port}'
|
||||
|
||||
# Example Output
|
||||
#{
|
||||
# "address": "118.208.233.90",
|
||||
# "port": 5001
|
||||
#}
|
||||
```
|
||||
|
||||
4. Copy the Server Address and Port.
|
||||
|
||||
---
|
||||
|
||||
# Multiplayer for Local Co-Op Games
|
||||
Use this guide when you want to play with a friend on a different system for games that only support local co-op.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Multiplayer-for-Local-Co-Op-Games-2c657c2edaf680c59975ec6b52022a2d) for a version of this guide with images & visual elements.**
|
||||
|
||||
Occasionally you will want to play a game with a friend on a game that does not support LDN multiplayer, and only offer local co-op (multiple controllers connected to a single console), such as with *New Super Mario Bros. U Deluxe.* Emulation solutions have developed 2 primary methods for handling these cases.
|
||||
|
||||
1. Netplay: Netplay lets two or more players run the same game on their own computers while sharing each other's controller inputs over the internet, so everyone sees the same game world in sync. One player hosts the session, and the others join as guests, sending their button presses back and forth to keep the gameplay coordinated.
|
||||
1. This is a huge over-simplification of how it works, but gives you an idea
|
||||
2. Low-Latency remote desktop solutions: Using a service like *Parsec*, the host shares his screen to a remote party with an input device connected. This device sends inputs to the host machine.
|
||||
|
||||
In either situation at its core, we are emulating an input device on the host machine, so the game believes 2 controllers are connected. No current Switch emulator has a Netplay offering, so we use Parsec to accomplish this for us.
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden Set Up and Fully Configured
|
||||
- A [*Parsec*](https://parsec.app/) Account
|
||||
- Parsec is free to use for personal, non-commercial use. For instructions on how to set up an account and install the client you should refer to the Parsec documentation on it's site.
|
||||
- Parsec client installed on your machine and remote (friend's) machine
|
||||
|
||||
## Steps
|
||||
|
||||
<aside>
|
||||
|
||||
This guide will assume you are the one hosting the game and go over things *Parsec* specific at a high level, as their system is subject to change. Follow *Parsec's* documentation where needed.
|
||||
|
||||
</aside>
|
||||
|
||||
1. Launch Parsec on the host machine.
|
||||
2. Connect to the other player in Parsec. You will know it is successful when the other player can see the host's screen.
|
||||
1. If you are the one hosting the game, you will have your friend initiate the remote connection you will accept.
|
||||
2. If you are joining a game, you will have to send a connection request the host will have to accept.
|
||||
3. Verify that the remote player can see the screen and that there is no issues with the connection.
|
||||
4. Launch Eden.
|
||||
5. Navigate to *Emulation → Configure*.
|
||||
6. Select the **Controls** tab.
|
||||
7. Set up your controller, if necessary.
|
||||
8. Select the **Player 2** tab and select the **Connect Controller** checkbox. This enables inputs from another device to be seen as a second controller.
|
||||
9. Dropdown the **Input Device** and select the controller.
|
||||
1. What exactly it shows up as depends on the Parsec settings.
|
||||
10. Set up the remote player's controller.
|
||||
11. Hit **OK** to apply the changes.
|
||||
12. Launch the game you want to play and enter the co-op mode. How this works depends on the game, so you will have to look in the menus or online to find out.
|
||||