Compare commits
86 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5ba3ae32dc | ||
|
|
2912f64145 | ||
|
|
470d43df6d | ||
|
|
fb6330645a | ||
|
|
48219f348c | ||
|
|
661346503b | ||
|
|
a4e9b08fe7 | ||
|
|
ce9c7c196d | ||
|
|
efc7472330 | ||
|
|
aadcc24aac | ||
|
|
89199f4d27 | ||
|
|
978d9d935d | ||
|
|
ad9af25027 | ||
|
|
f729dbb3c3 | ||
|
|
ec2b9b0400 | ||
|
|
5027aecf77 | ||
|
|
f39e985434 | ||
|
|
f8f5a9b1a2 | ||
|
|
a8047d3b12 | ||
|
|
cc8451f764 | ||
|
|
27189f39d2 | ||
|
|
683e6249c3 | ||
|
|
eaece15dbd | ||
|
|
8e5419209c | ||
|
|
8fac95dcc0 | ||
|
|
706a3d0764 | ||
|
|
3d19743d95 | ||
|
|
bd2d344040 | ||
|
|
5f4a286046 | ||
|
|
b7fcec4985 | ||
|
|
0473747f94 | ||
|
|
23bb909bc9 | ||
|
|
e94ac63a5e | ||
|
|
88ff086d13 | ||
|
|
116377f6d9 | ||
|
|
7c32cf03a1 | ||
|
|
ff7bbaea7d | ||
|
|
c84d605426 | ||
|
|
def03f6589 | ||
|
|
5ea24621cf | ||
|
|
251a3470dc | ||
|
|
08f65cbd01 | ||
|
|
8fd495f906 | ||
|
|
9d55875377 | ||
|
|
8a11bec55a | ||
|
|
4a11d5db2f | ||
|
|
0d736d49d6 | ||
|
|
0c74a495f5 | ||
|
|
c6afeb2bf8 | ||
|
|
d9067d85af | ||
|
|
2aa2ac7d9a | ||
|
|
90164197dc | ||
|
|
573e06131d | ||
|
|
06c8926a2e | ||
|
|
eabd1017cc | ||
|
|
b870bd255c | ||
|
|
37b5cf6003 | ||
|
|
d761ecba8c | ||
|
|
83683440b2 | ||
|
|
9b18d0b111 | ||
|
|
46cfd9b6f3 | ||
|
|
889545e1ee | ||
|
|
24dc3834b6 | ||
|
|
2a66b40267 | ||
|
|
feb8c5f88e | ||
|
|
300a646a34 | ||
|
|
e875a3196b | ||
|
|
4eb082485d | ||
|
|
7455854528 | ||
|
|
5ab0227624 | ||
|
|
ad2e1cc554 | ||
|
|
02521882e7 | ||
|
|
9a7ca3aca4 | ||
|
|
ca6bb3ae1d | ||
|
|
50df88106e | ||
|
|
945ea630b4 | ||
|
|
5aba461cb3 | ||
|
|
8330940eca | ||
|
|
4d49341918 | ||
|
|
2f0f8a979c | ||
|
|
413c7543ba | ||
|
|
975aa4e2f2 | ||
|
|
a1f9e68f46 | ||
|
|
02dee4a20b | ||
|
|
bc9b9480fb | ||
|
|
d1ceeeca22 |
|
|
@ -7,7 +7,7 @@
|
||||||
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"
|
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 :))))
|
# license header constants, please change when needed :))))
|
||||||
YEAR=2026
|
YEAR=$(date "+%Y")
|
||||||
HOLDER="Eden Emulator Project"
|
HOLDER="Eden Emulator Project"
|
||||||
LICENSE="GPL-3.0-or-later"
|
LICENSE="GPL-3.0-or-later"
|
||||||
|
|
||||||
|
|
@ -112,10 +112,10 @@ for file in $FILES; do
|
||||||
[ "$excluded" = "true" ] && continue
|
[ "$excluded" = "true" ] && continue
|
||||||
|
|
||||||
case "$file" in
|
case "$file" in
|
||||||
*.cmake|*.sh|*CMakeLists.txt)
|
*.cmake|*.sh|*.ps1|*.py|*.rb|*.perl|*.pl|*.nix|*CMakeLists.txt)
|
||||||
begin="#"
|
begin="#"
|
||||||
;;
|
;;
|
||||||
*.kt*|*.cpp|*.h|*.qml)
|
*.kt|*.kts|*.cpp|*.h|*.qml|*.c|*.hpp|*.hxx|*.cxx|*.h.in|*.inc)
|
||||||
begin="//"
|
begin="//"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
|
@ -185,11 +185,12 @@ if [ "$UPDATE" = "true" ]; then
|
||||||
|
|
||||||
for file in $SRC_FILES $OTHER_FILES; do
|
for file in $SRC_FILES $OTHER_FILES; do
|
||||||
case $(basename -- "$file") in
|
case $(basename -- "$file") in
|
||||||
*.cmake|*CMakeLists.txt)
|
# Windows Powershell wont use shebangs
|
||||||
|
*.cmake|*.ps1|*CMakeLists.txt)
|
||||||
begin="#"
|
begin="#"
|
||||||
shell="false"
|
shell="false"
|
||||||
;;
|
;;
|
||||||
*.sh)
|
*.sh|*.py|*.rb|*.perl|*.pl|*.nix)
|
||||||
begin="#"
|
begin="#"
|
||||||
shell=true
|
shell=true
|
||||||
;;
|
;;
|
||||||
|
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
#!/bin/bash -ex
|
|
||||||
|
|
||||||
# git-archive-all
|
|
||||||
export PATH="$PATH:/home/$USER/.local/bin"
|
|
||||||
|
|
||||||
GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
|
|
||||||
GITREV="`git show -s --format='%h'`"
|
|
||||||
REV_NAME="eden-unified-source-${GITDATE}-${GITREV}"
|
|
||||||
|
|
||||||
COMPAT_LIST='dist/compatibility_list/compatibility_list.json'
|
|
||||||
|
|
||||||
mkdir artifacts
|
|
||||||
|
|
||||||
touch "${COMPAT_LIST}"
|
|
||||||
git describe --abbrev=0 --always HEAD > GIT-COMMIT
|
|
||||||
git describe --tags HEAD > GIT-TAG || echo 'unknown' > GIT-TAG
|
|
||||||
git-archive-all --include "${COMPAT_LIST}" --include GIT-COMMIT --include GIT-TAG --force-submodules artifacts/"${REV_NAME}.tar"
|
|
||||||
|
|
||||||
cd artifacts/
|
|
||||||
xz -T0 -9 "${REV_NAME}.tar"
|
|
||||||
sha256sum "${REV_NAME}.tar.xz" > "${REV_NAME}.tar.xz.sha256sum"
|
|
||||||
cd ..
|
|
||||||
214
.patch/openssl-cmake/0001-cpmutil-compat.patch
Normal file
|
|
@ -0,0 +1,214 @@
|
||||||
|
From ec4c1fdf526cb9ad045abf59b29ee495bbf5023a Mon Sep 17 00:00:00 2001
|
||||||
|
From: crueter <crueter@eden-emu.dev>
|
||||||
|
Date: Sat, 30 May 2026 20:56:35 -0400
|
||||||
|
Subject: [PATCH] cpmutil compat
|
||||||
|
|
||||||
|
---
|
||||||
|
CMakeLists.txt | 31 ++++++++-----------
|
||||||
|
cmake/FetchOpenSSL.cmake | 64 ----------------------------------------
|
||||||
|
cmake/GetCPM.cmake | 5 ----
|
||||||
|
3 files changed, 13 insertions(+), 87 deletions(-)
|
||||||
|
delete mode 100644 cmake/FetchOpenSSL.cmake
|
||||||
|
delete mode 100644 cmake/GetCPM.cmake
|
||||||
|
|
||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index 5420ecc..9ffd5a0 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -19,9 +19,7 @@ include(FetchContent)
|
||||||
|
include(ProcessorCount)
|
||||||
|
include(cmake/ConfigureOpenSSL.cmake)
|
||||||
|
include(cmake/DetectTargetPlatform.cmake)
|
||||||
|
-include(cmake/FetchOpenSSL.cmake)
|
||||||
|
include(cmake/FindVcvarsall.cmake)
|
||||||
|
-include(cmake/GetCPM.cmake)
|
||||||
|
|
||||||
|
# Custom options
|
||||||
|
option(OPENSSL_BUILD_VERBOSE "Enable verbose output from build" OFF)
|
||||||
|
@@ -47,9 +45,6 @@ if("${OPENSSL_TARGET_PLATFORM}" STREQUAL "")
|
||||||
|
detect_target_platform(OPENSSL_TARGET_PLATFORM)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
-# Fetch OpenSSL source
|
||||||
|
-fetch_openssl()
|
||||||
|
-
|
||||||
|
# Apply patches
|
||||||
|
foreach(patch IN LISTS OPENSSL_PATCH)
|
||||||
|
if(EXISTS "${patch}" AND NOT IS_DIRECTORY "${patch}")
|
||||||
|
@@ -59,13 +54,13 @@ foreach(patch IN LISTS OPENSSL_PATCH)
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND git init
|
||||||
|
- WORKING_DIRECTORY ${openssl_SOURCE_DIR}
|
||||||
|
+ WORKING_DIRECTORY ${OpenSSL_SOURCE_DIR}
|
||||||
|
OUTPUT_QUIET
|
||||||
|
ERROR_QUIET
|
||||||
|
)
|
||||||
|
execute_process(
|
||||||
|
COMMAND git apply ${patch}
|
||||||
|
- WORKING_DIRECTORY ${openssl_SOURCE_DIR}
|
||||||
|
+ WORKING_DIRECTORY ${OpenSSL_SOURCE_DIR}
|
||||||
|
OUTPUT_QUIET
|
||||||
|
ERROR_QUIET
|
||||||
|
)
|
||||||
|
@@ -161,8 +156,8 @@ list(PREPEND OPENSSL_CONFIGURE_OPTIONS ${OPENSSL_TARGET_PLATFORM})
|
||||||
|
# Configure OpenSSL
|
||||||
|
configure_openssl(
|
||||||
|
COMMAND ${VCVARSALL_COMMAND}
|
||||||
|
- FILE ${openssl_SOURCE_DIR}/Configure
|
||||||
|
- BUILD_DIR ${openssl_BINARY_DIR}
|
||||||
|
+ FILE ${OpenSSL_SOURCE_DIR}/Configure
|
||||||
|
+ BUILD_DIR ${OpenSSL_BINARY_DIR}
|
||||||
|
OPTIONS ${OPENSSL_CONFIGURE_OPTIONS}
|
||||||
|
)
|
||||||
|
|
||||||
|
@@ -203,8 +198,8 @@ endif()
|
||||||
|
# Parse Makefile
|
||||||
|
parse_makefile(${OPENSSL_MAKEFILE} "INSTALL_LIBS" OPENSSL_STATIC_LIBS)
|
||||||
|
parse_makefile(${OPENSSL_MAKEFILE} "INSTALL_SHLIBS" OPENSSL_SHARED_LIBS)
|
||||||
|
-list(TRANSFORM OPENSSL_STATIC_LIBS PREPEND "${openssl_BINARY_DIR}/")
|
||||||
|
-list(TRANSFORM OPENSSL_SHARED_LIBS PREPEND "${openssl_BINARY_DIR}/")
|
||||||
|
+list(TRANSFORM OPENSSL_STATIC_LIBS PREPEND "${OpenSSL_BINARY_DIR}/")
|
||||||
|
+list(TRANSFORM OPENSSL_SHARED_LIBS PREPEND "${OpenSSL_BINARY_DIR}/")
|
||||||
|
|
||||||
|
foreach(LIBRARY IN LISTS OPENSSL_STATIC_LIBS)
|
||||||
|
if(LIBRARY MATCHES "crypto")
|
||||||
|
@@ -239,14 +234,14 @@ endif()
|
||||||
|
|
||||||
|
# Provide same targets and variables as FindOpenSSL module
|
||||||
|
set(OPENSSL_FOUND ON CACHE BOOL "Override FindOpenSSL variables" FORCE)
|
||||||
|
-set(OPENSSL_INCLUDE_DIR ${openssl_SOURCE_DIR}/include ${openssl_BINARY_DIR}/include CACHE STRING "Override FindOpenSSL variables" FORCE)
|
||||||
|
+set(OPENSSL_INCLUDE_DIR ${OpenSSL_SOURCE_DIR}/include ${OpenSSL_BINARY_DIR}/include CACHE STRING "Override FindOpenSSL variables" FORCE)
|
||||||
|
set(OPENSSL_CRYPTO_LIBRARY ${OPENSSL_${OPENSSL_LIBRARY_TYPE}_CRYPTO_LIBRARY} CACHE STRING "Override FindOpenSSL variables" FORCE)
|
||||||
|
set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY} ${OPENSSL_DEPENDENCIES} CACHE STRING "Override FindOpenSSL variables" FORCE)
|
||||||
|
set(OPENSSL_SSL_LIBRARY ${OPENSSL_${OPENSSL_LIBRARY_TYPE}_SSL_LIBRARY} CACHE STRING "Override FindOpenSSL variables" FORCE)
|
||||||
|
set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_DEPENDENCIES} CACHE STRING "Override FindOpenSSL variables" FORCE)
|
||||||
|
set(OPENSSL_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY} ${OPENSSL_SSL_LIBRARY} ${OPENSSL_DEPENDENCIES} CACHE STRING "Override FindOpenSSL variables" FORCE)
|
||||||
|
set(OPENSSL_VERSION ${OPENSSL_CONFIGURED_VERSION} CACHE STRING "Override FindOpenSSL variables" FORCE)
|
||||||
|
-set(OPENSSL_APPLINK_SOURCE ${openssl_SOURCE_DIR}/ms/applink.c CACHE STRING "Override FindOpenSSL variables" FORCE)
|
||||||
|
+set(OPENSSL_APPLINK_SOURCE ${OpenSSL_SOURCE_DIR}/ms/applink.c CACHE STRING "Override FindOpenSSL variables" FORCE)
|
||||||
|
|
||||||
|
add_library(OpenSSL::Crypto ${OPENSSL_LIBRARY_TYPE} IMPORTED GLOBAL)
|
||||||
|
add_library(OpenSSL::SSL ${OPENSSL_LIBRARY_TYPE} IMPORTED GLOBAL)
|
||||||
|
@@ -308,8 +303,8 @@ if(ANDROID)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(GLOB_RECURSE OPENSSL_SOURCES
|
||||||
|
- ${openssl_SOURCE_DIR}/*.[ch]
|
||||||
|
- ${openssl_SOURCE_DIR}/*.[ch].in
|
||||||
|
+ ${OpenSSL_SOURCE_DIR}/*.[ch]
|
||||||
|
+ ${OpenSSL_SOURCE_DIR}/*.[ch].in
|
||||||
|
)
|
||||||
|
|
||||||
|
set(OPENSSL_BUILD_OUTPUT
|
||||||
|
@@ -322,7 +317,7 @@ add_custom_command(
|
||||||
|
OUTPUT ${OPENSSL_BUILD_OUTPUT}
|
||||||
|
COMMAND ${OPENSSL_BUILD_COMMAND}
|
||||||
|
DEPENDS ${OPENSSL_SOURCES}
|
||||||
|
- WORKING_DIRECTORY ${openssl_BINARY_DIR}
|
||||||
|
+ WORKING_DIRECTORY ${OpenSSL_BINARY_DIR}
|
||||||
|
VERBATIM
|
||||||
|
)
|
||||||
|
|
||||||
|
@@ -341,7 +336,7 @@ if(OPENSSL_TEST AND NOT CMAKE_CROSSCOMPILING)
|
||||||
|
add_test(
|
||||||
|
NAME openssl-test
|
||||||
|
COMMAND ${OPENSSL_BUILD_TOOL} test VERBOSE_FAILURE=yes HARNESS_JOBS=${NUMBER_OF_THREADS}
|
||||||
|
- WORKING_DIRECTORY ${openssl_BINARY_DIR}
|
||||||
|
+ WORKING_DIRECTORY ${OpenSSL_BINARY_DIR}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
@@ -356,7 +351,7 @@ if(OPENSSL_INSTALL)
|
||||||
|
install(CODE
|
||||||
|
"execute_process(
|
||||||
|
COMMAND ${OPENSSL_INSTALL_COMMAND}
|
||||||
|
- WORKING_DIRECTORY \"${openssl_BINARY_DIR}\"
|
||||||
|
+ WORKING_DIRECTORY \"${OpenSSL_BINARY_DIR}\"
|
||||||
|
)"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
diff --git a/cmake/FetchOpenSSL.cmake b/cmake/FetchOpenSSL.cmake
|
||||||
|
deleted file mode 100644
|
||||||
|
index a43505d..0000000
|
||||||
|
--- a/cmake/FetchOpenSSL.cmake
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,64 +0,0 @@
|
||||||
|
-function(fetch_openssl)
|
||||||
|
- if(EXISTS "${OPENSSL_SOURCE}" AND IS_DIRECTORY "${OPENSSL_SOURCE}")
|
||||||
|
- # Fetch the local OpenSSL source
|
||||||
|
- if(NOT IS_ABSOLUTE "${OPENSSL_SOURCE}")
|
||||||
|
- string(PREPEND OPENSSL_SOURCE ${CMAKE_SOURCE_DIR}/)
|
||||||
|
- endif()
|
||||||
|
-
|
||||||
|
- string(REPLACE "\\" "/" openssl-source_SOURCE_DIR "${OPENSSL_SOURCE}")
|
||||||
|
- set(openssl-source_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/openssl-source-build)
|
||||||
|
- else()
|
||||||
|
- set(CPM_OPTIONS
|
||||||
|
- NAME openssl-source
|
||||||
|
- DOWNLOAD_ONLY ON
|
||||||
|
- )
|
||||||
|
-
|
||||||
|
- if(NOT OPENSSL_CONFIGURE_VERBOSE)
|
||||||
|
- list(APPEND CPM_OPTIONS QUIET)
|
||||||
|
- endif()
|
||||||
|
-
|
||||||
|
- if("${OPENSSL_SOURCE}" MATCHES "^http")
|
||||||
|
- # Download OpenSSL source from the internet
|
||||||
|
- list(APPEND CPM_OPTIONS URL ${OPENSSL_SOURCE})
|
||||||
|
- else()
|
||||||
|
- # Download OpenSSL source from the official website
|
||||||
|
- if("${OPENSSL_TARGET_VERSION}" STREQUAL "")
|
||||||
|
- set(OPENSSL_TARGET_VERSION ${PROJECT_VERSION})
|
||||||
|
- endif()
|
||||||
|
-
|
||||||
|
- if(OPENSSL_TARGET_VERSION VERSION_EQUAL PROJECT_VERSION)
|
||||||
|
- list(APPEND CPM_OPTIONS URL_HASH SHA256=aaf51a1fe064384f811daeaeb4ec4dce7340ec8bd893027eee676af31e83a04f)
|
||||||
|
- endif()
|
||||||
|
-
|
||||||
|
- if(OPENSSL_TARGET_VERSION MATCHES "^1\.1\.1[a-w]$")
|
||||||
|
- string(REPLACE "." "_" OPENSSL_TAGGED_VERSION ${OPENSSL_TARGET_VERSION})
|
||||||
|
- list(APPEND CPM_OPTIONS URL https://github.com/openssl/openssl/releases/download/OpenSSL_${OPENSSL_TAGGED_VERSION}/openssl-${OPENSSL_TARGET_VERSION}.tar.gz)
|
||||||
|
- else()
|
||||||
|
- list(APPEND CPM_OPTIONS URL https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_TARGET_VERSION}/openssl-${OPENSSL_TARGET_VERSION}.tar.gz)
|
||||||
|
- endif()
|
||||||
|
- endif()
|
||||||
|
-
|
||||||
|
- CPMAddPackage(${CPM_OPTIONS})
|
||||||
|
- endif()
|
||||||
|
-
|
||||||
|
- # Clean build directory if source directory has changed
|
||||||
|
- if(DEFINED CACHE{openssl-source_SOURCE_DIR_OLD} AND NOT openssl-source_SOURCE_DIR STREQUAL openssl-source_SOURCE_DIR_OLD)
|
||||||
|
- set(openssl-source_SOURCE_DIR_OLD ${openssl-source_SOURCE_DIR} CACHE INTERNAL "Previously fetched OpenSSL source")
|
||||||
|
-
|
||||||
|
- if(IS_DIRECTORY ${openssl-source_BINARY_DIR})
|
||||||
|
- file(REMOVE_RECURSE ${openssl-source_BINARY_DIR})
|
||||||
|
- file(MAKE_DIRECTORY ${openssl-source_BINARY_DIR})
|
||||||
|
- endif()
|
||||||
|
- endif()
|
||||||
|
-
|
||||||
|
- # Override the FindOpenSSL module
|
||||||
|
- FetchContent_Declare(
|
||||||
|
- OpenSSL
|
||||||
|
- SOURCE_DIR ${openssl-source_SOURCE_DIR}
|
||||||
|
- BINARY_DIR ${openssl-source_BINARY_DIR}
|
||||||
|
- OVERRIDE_FIND_PACKAGE
|
||||||
|
- )
|
||||||
|
- FetchContent_MakeAvailable(OpenSSL)
|
||||||
|
-
|
||||||
|
- return(PROPAGATE openssl_SOURCE_DIR openssl_BINARY_DIR)
|
||||||
|
-endfunction()
|
||||||
|
diff --git a/cmake/GetCPM.cmake b/cmake/GetCPM.cmake
|
||||||
|
deleted file mode 100644
|
||||||
|
index bfc50f5..0000000
|
||||||
|
--- a/cmake/GetCPM.cmake
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,5 +0,0 @@
|
||||||
|
-file(
|
||||||
|
- DOWNLOAD https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/get_cpm.cmake
|
||||||
|
- ${CMAKE_CURRENT_BINARY_DIR}/get_cpm.cmake
|
||||||
|
-)
|
||||||
|
-include(${CMAKE_CURRENT_BINARY_DIR}/get_cpm.cmake)
|
||||||
|
--
|
||||||
|
2.54.0
|
||||||
|
|
||||||
54
.patch/openssl-cmake/0002-use-ccache.patch
Normal file
|
|
@ -0,0 +1,54 @@
|
||||||
|
From d46675fbb61eb6d51e478023ce4075e545ad4cfd Mon Sep 17 00:00:00 2001
|
||||||
|
From: crueter <crueter@eden-emu.dev>
|
||||||
|
Date: Sat, 30 May 2026 21:11:55 -0400
|
||||||
|
Subject: [PATCH] use ccache
|
||||||
|
|
||||||
|
---
|
||||||
|
CMakeLists.txt | 1 -
|
||||||
|
cmake/ConfigureOpenSSL.cmake | 12 +++---------
|
||||||
|
2 files changed, 3 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||||
|
index 9ffd5a0..9ff14c8 100644
|
||||||
|
--- a/CMakeLists.txt
|
||||||
|
+++ b/CMakeLists.txt
|
||||||
|
@@ -28,7 +28,6 @@ option(OPENSSL_ENABLE_PARALLEL "Build and test in parallel if possible" ON)
|
||||||
|
option(OPENSSL_INSTALL "Install OpenSSL components to the <prefix> directory" OFF)
|
||||||
|
option(OPENSSL_INSTALL_CERT "Install cert.pem to the <openssldir> directory" OFF)
|
||||||
|
option(OPENSSL_TEST "Enable testing and build OpenSSL self tests" OFF)
|
||||||
|
-option(OPENSSL_USE_CCACHE "Use ccache if available" ON)
|
||||||
|
|
||||||
|
if("${OPENSSL_BUILD_TARGET}" STREQUAL "")
|
||||||
|
# Makefile target for build
|
||||||
|
diff --git a/cmake/ConfigureOpenSSL.cmake b/cmake/ConfigureOpenSSL.cmake
|
||||||
|
index 211c18b..3d8cbed 100644
|
||||||
|
--- a/cmake/ConfigureOpenSSL.cmake
|
||||||
|
+++ b/cmake/ConfigureOpenSSL.cmake
|
||||||
|
@@ -69,15 +69,9 @@ function(apply_ccache FILE)
|
||||||
|
message(FATAL_ERROR "Couldn't find Makefile")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
- if(OPENSSL_USE_CCACHE)
|
||||||
|
- find_program(CCACHE ccache)
|
||||||
|
-
|
||||||
|
- if(NOT CCACHE)
|
||||||
|
- return()
|
||||||
|
- endif()
|
||||||
|
-
|
||||||
|
+ if(USE_CCACHE)
|
||||||
|
file(READ ${FILE} MAKEFILE)
|
||||||
|
- string(REPLACE "\nCC=" "\nCC=ccache " MAKEFILE "${MAKEFILE}")
|
||||||
|
+ string(REPLACE "\nCC=" "\nCC=${CCACHE_BINARY} " MAKEFILE "${MAKEFILE}")
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
string(REPLACE "/Zi /Fdossl_static.pdb " "" MAKEFILE "${MAKEFILE}")
|
||||||
|
@@ -171,4 +165,4 @@ function(configure_openssl)
|
||||||
|
string(REPLACE "/W3" "/W0" MAKEFILE "${MAKEFILE}")
|
||||||
|
file(WRITE ${OPENSSL_MAKEFILE} "${MAKEFILE}")
|
||||||
|
endif()
|
||||||
|
-endfunction()
|
||||||
|
\ No newline at end of file
|
||||||
|
+endfunction()
|
||||||
|
--
|
||||||
|
2.54.0
|
||||||
|
|
||||||
28
.patch/openssl-cmake/0003-use-cmake-compiler-flags.patch
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
From 4a3cc92a7abad403529ed1cb4255ca63d9252de4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: crueter <crueter@eden-emu.dev>
|
||||||
|
Date: Sat, 30 May 2026 21:48:42 -0400
|
||||||
|
Subject: [PATCH 2/2] use cmake compiler flags
|
||||||
|
|
||||||
|
---
|
||||||
|
cmake/ConfigureOpenSSL.cmake | 5 ++++-
|
||||||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/cmake/ConfigureOpenSSL.cmake b/cmake/ConfigureOpenSSL.cmake
|
||||||
|
index 3d8cbed..3012e05 100644
|
||||||
|
--- a/cmake/ConfigureOpenSSL.cmake
|
||||||
|
+++ b/cmake/ConfigureOpenSSL.cmake
|
||||||
|
@@ -135,7 +135,10 @@ function(configure_openssl)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
- COMMAND ${CONFIGURE_COMMAND}
|
||||||
|
+ COMMAND ${CMAKE_COMMAND} -E env
|
||||||
|
+ "CFLAGS=${CMAKE_C_FLAGS}"
|
||||||
|
+ "CXXFLAGS=${CMAKE_CXX_FLAGS}"
|
||||||
|
+ ${CONFIGURE_COMMAND}
|
||||||
|
WORKING_DIRECTORY ${CONFIGURE_BUILD_DIR}
|
||||||
|
${VERBOSE_OPTION}
|
||||||
|
COMMAND_ERROR_IS_FATAL ANY
|
||||||
|
--
|
||||||
|
2.54.0
|
||||||
|
|
||||||
39
.patch/openssl-cmake/0004-use-shell-wrapper.patch
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
--- a/CMakeLists.txt 2026-06-01 23:53:16.498043856 -0400
|
||||||
|
+++ b/CMakeLists.txt 2026-06-01 23:53:23.910543615 -0400
|
||||||
|
@@ -312,13 +312,29 @@
|
||||||
|
${OPENSSL_SHARED_CRYPTO_LIBRARY}
|
||||||
|
${OPENSSL_SHARED_SSL_LIBRARY}
|
||||||
|
)
|
||||||
|
-add_custom_command(
|
||||||
|
- OUTPUT ${OPENSSL_BUILD_OUTPUT}
|
||||||
|
- COMMAND ${OPENSSL_BUILD_COMMAND}
|
||||||
|
- DEPENDS ${OPENSSL_SOURCES}
|
||||||
|
- WORKING_DIRECTORY ${OpenSSL_BINARY_DIR}
|
||||||
|
- VERBATIM
|
||||||
|
-)
|
||||||
|
+if (WIN32)
|
||||||
|
+ add_custom_command(
|
||||||
|
+ OUTPUT ${OPENSSL_BUILD_OUTPUT}
|
||||||
|
+ COMMAND ${OPENSSL_BUILD_COMMAND}
|
||||||
|
+ DEPENDS ${OPENSSL_SOURCES}
|
||||||
|
+ WORKING_DIRECTORY ${OpenSSL_BINARY_DIR}
|
||||||
|
+ VERBATIM)
|
||||||
|
+else()
|
||||||
|
+ set(_openssl_build_script "${CMAKE_CURRENT_BINARY_DIR}/BuildOpenSSL.cmake")
|
||||||
|
+ file(WRITE ${_openssl_build_script}
|
||||||
|
+ "execute_process(\n"
|
||||||
|
+ " COMMAND ${OPENSSL_BUILD_COMMAND}\n"
|
||||||
|
+ " WORKING_DIRECTORY ${OpenSSL_BINARY_DIR}\n"
|
||||||
|
+ " RESULT_VARIABLE _r)\n"
|
||||||
|
+ "if(_r)\n"
|
||||||
|
+ " message(FATAL_ERROR \"OpenSSL build failed: \${_r}\")\n"
|
||||||
|
+ "endif()\n")
|
||||||
|
+ add_custom_command(
|
||||||
|
+ OUTPUT ${OPENSSL_BUILD_OUTPUT}
|
||||||
|
+ COMMAND ${CMAKE_COMMAND} -P ${_openssl_build_script}
|
||||||
|
+ DEPENDS ${OPENSSL_SOURCES}
|
||||||
|
+ VERBATIM)
|
||||||
|
+endif()
|
||||||
|
|
||||||
|
if(PROJECT_IS_TOP_LEVEL)
|
||||||
|
add_custom_target(openssl-build ALL DEPENDS ${OPENSSL_BUILD_OUTPUT})
|
||||||
3665
.patch/openssl/0001-add-bundled-cert.patch
Normal file
|
|
@ -1,7 +1,7 @@
|
||||||
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
cmake_minimum_required(VERSION 3.22)
|
cmake_minimum_required(VERSION 3.31)
|
||||||
|
|
||||||
project(yuzu)
|
project(yuzu)
|
||||||
|
|
||||||
|
|
@ -10,6 +10,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modul
|
||||||
|
|
||||||
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
|
set(CPM_SOURCE_CACHE ${CMAKE_SOURCE_DIR}/.cache/cpm)
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
set(CMAKE_CXX_SCAN_FOR_MODULES 0)
|
||||||
|
|
||||||
include(DetectPlatform)
|
include(DetectPlatform)
|
||||||
include(DetectArchitecture)
|
include(DetectArchitecture)
|
||||||
|
|
@ -75,6 +76,8 @@ cmake_dependent_option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet im
|
||||||
set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries")
|
set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries")
|
||||||
cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
||||||
|
|
||||||
|
option(ENABLE_DEBUG_TOOLS "Enable debugging tools (maxwell disassembler, SPIRV translator, etc)" OFF)
|
||||||
|
|
||||||
# non-linux bundled qt are static
|
# non-linux bundled qt are static
|
||||||
if (YUZU_USE_BUNDLED_QT AND (APPLE OR NOT UNIX))
|
if (YUZU_USE_BUNDLED_QT AND (APPLE OR NOT UNIX))
|
||||||
set(YUZU_STATIC_BUILD ON)
|
set(YUZU_STATIC_BUILD ON)
|
||||||
|
|
@ -119,13 +122,13 @@ if (YUZU_STATIC_BUILD)
|
||||||
set(QuaZip-Qt6_FORCE_BUNDLED ON)
|
set(QuaZip-Qt6_FORCE_BUNDLED ON)
|
||||||
|
|
||||||
set(YUZU_USE_BUNDLED_FFMPEG ON)
|
set(YUZU_USE_BUNDLED_FFMPEG ON)
|
||||||
set(YUZU_USE_BUNDLED_SDL2 ON)
|
set(YUZU_USE_BUNDLED_SDL3 ON)
|
||||||
set(YUZU_USE_BUNDLED_OPENSSL ON)
|
set(YUZU_USE_BUNDLED_OPENSSL ON)
|
||||||
|
|
||||||
set(HTTPLIB_USE_BROTLI_IF_AVAILABLE OFF)
|
set(HTTPLIB_USE_BROTLI_IF_AVAILABLE OFF)
|
||||||
elseif(APPLE)
|
elseif(APPLE)
|
||||||
set(YUZU_USE_BUNDLED_FFMPEG ON)
|
set(YUZU_USE_BUNDLED_FFMPEG ON)
|
||||||
set(YUZU_USE_BUNDLED_SDL2 ON)
|
set(YUZU_USE_BUNDLED_SDL3 ON)
|
||||||
set(YUZU_USE_BUNDLED_OPENSSL ON)
|
set(YUZU_USE_BUNDLED_OPENSSL ON)
|
||||||
|
|
||||||
# these libs do not properly provide static libs/let you do it with cmake
|
# these libs do not properly provide static libs/let you do it with cmake
|
||||||
|
|
@ -190,13 +193,11 @@ if(MSVC)
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:$<$<CONFIG:Debug>:/${libflag}d>>
|
$<$<COMPILE_LANGUAGE:C,CXX>:$<$<CONFIG:Debug>:/${libflag}d>>
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:$<$<CONFIG:Release>:/${libflag}>>
|
$<$<COMPILE_LANGUAGE:C,CXX>:$<$<CONFIG:Release>:/${libflag}>>
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:$<$<CONFIG:RelWithDebInfo>:/${libflag}>>
|
$<$<COMPILE_LANGUAGE:C,CXX>:$<$<CONFIG:RelWithDebInfo>:/${libflag}>>
|
||||||
$<$<COMPILE_LANGUAGE:C,CXX>:$<$<CONFIG:MinSizeRel>:/${libflag}>>
|
$<$<COMPILE_LANGUAGE:C,CXX>:$<$<CONFIG:MinSizeRel>:/${libflag}>>)
|
||||||
)
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
|
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
|
||||||
cmake_dependent_option(YUZU_USE_EXTERNAL_SDL2 "Build SDL2 from external source" OFF "NOT MSVC;NOT ANDROID" OFF)
|
cmake_dependent_option(YUZU_USE_BUNDLED_SDL3 "Download bundled SDL3 build" "${MSVC}" "NOT ANDROID" OFF)
|
||||||
cmake_dependent_option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}" "NOT ANDROID" OFF)
|
|
||||||
|
|
||||||
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
||||||
|
|
||||||
|
|
@ -230,6 +231,10 @@ cmake_dependent_option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF
|
||||||
|
|
||||||
option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
|
option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
|
||||||
|
|
||||||
|
# Install udev rules on Linux (mainly for gyros)
|
||||||
|
# Only acts on joysticks and nothing else.
|
||||||
|
cmake_dependent_option(YUZU_INSTALL_UDEV_RULES "Install udev rules for gyro access" OFF "PLATFORM_LINUX" OFF)
|
||||||
|
|
||||||
option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON)
|
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)
|
option(YUZU_LEGACY "Apply patches that improve compatibility with older GPUs (e.g. Snapdragon 865) at the cost of performance" OFF)
|
||||||
|
|
@ -302,7 +307,7 @@ if (YUZU_ROOM)
|
||||||
add_compile_definitions(YUZU_ROOM)
|
add_compile_definitions(YUZU_ROOM)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if ((ANDROID OR APPLE OR UNIX) AND (NOT PLATFORM_LINUX OR ANDROID) AND NOT WIN32)
|
if (UNIX AND NOT (PLATFORM_LINUX OR WIN32))
|
||||||
if(CXX_APPLE OR CXX_CLANG)
|
if(CXX_APPLE OR CXX_CLANG)
|
||||||
# libc++ has stop_token and jthread as experimental
|
# libc++ has stop_token and jthread as experimental
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library")
|
||||||
|
|
@ -358,10 +363,6 @@ if (CXX_GCC OR CXX_CLANG)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Other presets, e.g. steamdeck
|
|
||||||
# TODO(crueter): Just have every Linux/Windows use old sdl2
|
|
||||||
set(YUZU_SYSTEM_PROFILE "generic" CACHE STRING "CMake and Externals profile to use. One of: generic, steamdeck")
|
|
||||||
|
|
||||||
# Configure C++ standard
|
# Configure C++ standard
|
||||||
# ===========================
|
# ===========================
|
||||||
|
|
||||||
|
|
@ -383,13 +384,20 @@ find_package(RenderDoc MODULE)
|
||||||
# openssl funniness
|
# openssl funniness
|
||||||
if (YUZU_USE_BUNDLED_OPENSSL)
|
if (YUZU_USE_BUNDLED_OPENSSL)
|
||||||
set(BUILD_SHARED_LIBS OFF)
|
set(BUILD_SHARED_LIBS OFF)
|
||||||
|
AddJsonPackage(openssl-ci)
|
||||||
|
else()
|
||||||
AddJsonPackage(openssl)
|
AddJsonPackage(openssl)
|
||||||
|
set(OPENSSL_BUILD_VERBOSE ON)
|
||||||
|
set(OPENSSL_CONFIGURE_VERBOSE ON)
|
||||||
|
|
||||||
if (OpenSSL_ADDED)
|
if (OpenSSL_ADDED)
|
||||||
add_compile_definitions(YUZU_BUNDLED_OPENSSL)
|
AddJsonPackage(openssl-cmake)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(OpenSSL 3 REQUIRED)
|
if (OpenSSL_ADDED)
|
||||||
|
add_compile_definitions(YUZU_BUNDLED_OPENSSL)
|
||||||
|
endif()
|
||||||
|
|
||||||
message(STATUS "Fetching needed dependencies with CPM")
|
message(STATUS "Fetching needed dependencies with CPM")
|
||||||
|
|
||||||
|
|
@ -505,7 +513,7 @@ endfunction()
|
||||||
# =============================================
|
# =============================================
|
||||||
|
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
foreach(fw Carbon Metal Cocoa IOKit CoreVideo CoreMedia Security)
|
foreach(fw Carbon Metal Cocoa IOKit CoreVideo CoreMedia Security UniformTypeIdentifiers)
|
||||||
find_library(${fw}_LIBRARY ${fw} REQUIRED)
|
find_library(${fw}_LIBRARY ${fw} REQUIRED)
|
||||||
list(APPEND PLATFORM_LIBRARIES ${${fw}_LIBRARY})
|
list(APPEND PLATFORM_LIBRARIES ${${fw}_LIBRARY})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
@ -517,6 +525,8 @@ elseif (WIN32)
|
||||||
# PSAPI is the Process Status API
|
# PSAPI is the Process Status API
|
||||||
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version crypt32 rpcrt4 gdi32 wldap32 mswsock)
|
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} psapi imm32 version crypt32 rpcrt4 gdi32 wldap32 mswsock)
|
||||||
endif()
|
endif()
|
||||||
|
elseif (PLATFORM_MANAGARM)
|
||||||
|
set(PLATFORM_LIBRARIES iconv intl)
|
||||||
elseif (PLATFORM_HAIKU)
|
elseif (PLATFORM_HAIKU)
|
||||||
# Haiku is so special :)
|
# Haiku is so special :)
|
||||||
set(PLATFORM_LIBRARIES bsd /boot/system/lib/libnetwork.so)
|
set(PLATFORM_LIBRARIES bsd /boot/system/lib/libnetwork.so)
|
||||||
|
|
@ -559,7 +569,7 @@ if (NOT YUZU_STATIC_ROOM)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT ANDROID)
|
if (NOT ANDROID)
|
||||||
find_package(SDL2)
|
find_package(SDL3)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (USE_DISCORD_PRESENCE)
|
if (USE_DISCORD_PRESENCE)
|
||||||
|
|
@ -584,8 +594,6 @@ if (ENABLE_QT)
|
||||||
else()
|
else()
|
||||||
AddQt(6.9.3)
|
AddQt(6.9.3)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(YUZU_STATIC_BUILD ON)
|
|
||||||
else()
|
else()
|
||||||
message(STATUS "Using system Qt")
|
message(STATUS "Using system Qt")
|
||||||
if (NOT Qt6_DIR)
|
if (NOT Qt6_DIR)
|
||||||
|
|
@ -594,23 +602,7 @@ if (ENABLE_QT)
|
||||||
list(APPEND CMAKE_PREFIX_PATH "${Qt6_DIR}")
|
list(APPEND CMAKE_PREFIX_PATH "${Qt6_DIR}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(Qt6 CONFIG REQUIRED COMPONENTS Widgets Charts Concurrent)
|
find_package(Qt6 REQUIRED COMPONENTS Core)
|
||||||
|
|
||||||
if (YUZU_USE_QT_MULTIMEDIA)
|
|
||||||
find_package(Qt6 REQUIRED COMPONENTS Multimedia)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (PLATFORM_LINUX OR PLATFORM_FREEBSD)
|
|
||||||
# yes Qt, we get it
|
|
||||||
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
|
||||||
find_package(Qt6 REQUIRED COMPONENTS DBus OPTIONAL_COMPONENTS GuiPrivate)
|
|
||||||
elseif (UNIX AND NOT APPLE)
|
|
||||||
find_package(Qt6 REQUIRED COMPONENTS DBus Gui)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ENABLE_QT_TRANSLATION)
|
|
||||||
find_package(Qt6 REQUIRED COMPONENTS LinguistTools)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT DEFINED QT_TARGET_PATH)
|
if (NOT DEFINED QT_TARGET_PATH)
|
||||||
get_target_property(qtcore_path Qt6::Core LOCATION_Release)
|
get_target_property(qtcore_path Qt6::Core LOCATION_Release)
|
||||||
|
|
@ -633,21 +625,27 @@ if (ENABLE_QT)
|
||||||
## Components ##
|
## Components ##
|
||||||
|
|
||||||
# Best practice is to ask for all components at once, so they are from the same version
|
# Best practice is to ask for all components at once, so they are from the same version
|
||||||
set(YUZU_QT_COMPONENTS Core Widgets Charts Concurrent)
|
set(YUZU_QT_COMPONENTS Core Widgets Charts Concurrent Gui)
|
||||||
if (PLATFORM_LINUX)
|
if (PLATFORM_LINUX OR PLATFORM_FREEBSD)
|
||||||
list(APPEND YUZU_QT_COMPONENTS DBus)
|
list(APPEND YUZU_QT_COMPONENTS DBus)
|
||||||
|
# yes Qt, we get it
|
||||||
|
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
||||||
|
list(APPEND YUZU_QT_OPTIONAL GuiPrivate)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (YUZU_USE_QT_MULTIMEDIA)
|
if (YUZU_USE_QT_MULTIMEDIA)
|
||||||
list(APPEND YUZU_QT_COMPONENTS Multimedia)
|
list(APPEND YUZU_QT_COMPONENTS Multimedia)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (YUZU_USE_QT_WEB_ENGINE)
|
if (YUZU_USE_QT_WEB_ENGINE)
|
||||||
list(APPEND YUZU_QT_COMPONENTS WebEngineCore WebEngineWidgets)
|
list(APPEND YUZU_QT_COMPONENTS WebEngineCore WebEngineWidgets)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_QT_TRANSLATION)
|
if (ENABLE_QT_TRANSLATION)
|
||||||
list(APPEND YUZU_QT_COMPONENTS LinguistTools)
|
list(APPEND YUZU_QT_COMPONENTS LinguistTools)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(Qt6 REQUIRED COMPONENTS ${YUZU_QT_COMPONENTS})
|
find_package(Qt6 REQUIRED COMPONENTS ${YUZU_QT_COMPONENTS} OPTIONAL_COMPONENTS ${YUZU_QT_OPTIONAL})
|
||||||
set(QT_MAJOR_VERSION 6)
|
set(QT_MAJOR_VERSION 6)
|
||||||
# Qt6 sets cxx_std_17 and we need to undo that
|
# Qt6 sets cxx_std_17 and we need to undo that
|
||||||
set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "")
|
set_target_properties(Qt6::Platform PROPERTIES INTERFACE_COMPILE_FEATURES "")
|
||||||
|
|
@ -715,6 +713,12 @@ endif()
|
||||||
|
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
|
if (ENABLE_DEBUG_TOOLS)
|
||||||
|
add_subdirectory(tools/maxwell-disas)
|
||||||
|
add_subdirectory(tools/maxwell-spirv)
|
||||||
|
add_subdirectory(tools/maxwell-ir)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Set yuzu project or yuzu-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not
|
# Set yuzu project or yuzu-cmd project as default StartUp Project in Visual Studio depending on whether QT is enabled or not
|
||||||
if(ENABLE_QT)
|
if(ENABLE_QT)
|
||||||
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu)
|
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT yuzu)
|
||||||
|
|
@ -730,6 +734,8 @@ endif()
|
||||||
# https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
|
# https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
|
||||||
# https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
|
# https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
|
||||||
# https://www.freedesktop.org/software/appstream/docs/
|
# https://www.freedesktop.org/software/appstream/docs/
|
||||||
|
|
||||||
|
# TODO: Icon/install handling n such should be put into dist/CMakeLists.txt
|
||||||
if(ENABLE_QT AND UNIX AND NOT APPLE)
|
if(ENABLE_QT AND UNIX AND NOT APPLE)
|
||||||
install(FILES "dist/dev.eden_emu.eden.desktop"
|
install(FILES "dist/dev.eden_emu.eden.desktop"
|
||||||
DESTINATION "share/applications")
|
DESTINATION "share/applications")
|
||||||
|
|
@ -742,3 +748,10 @@ if(ENABLE_QT AND UNIX AND NOT APPLE)
|
||||||
install(FILES "dist/dev.eden_emu.eden.metainfo.xml"
|
install(FILES "dist/dev.eden_emu.eden.metainfo.xml"
|
||||||
DESTINATION "share/metainfo")
|
DESTINATION "share/metainfo")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (YUZU_INSTALL_UDEV_RULES)
|
||||||
|
include(GNUInstallDirs)
|
||||||
|
|
||||||
|
install(FILES "dist/72-eden-input.rules"
|
||||||
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/udev/rules.d")
|
||||||
|
endif()
|
||||||
|
|
|
||||||
|
|
@ -715,8 +715,8 @@ function(AddCIPackage)
|
||||||
"${${ARTIFACT_PACKAGE}_SOURCE_DIR}" PARENT_SCOPE)
|
"${${ARTIFACT_PACKAGE}_SOURCE_DIR}" PARENT_SCOPE)
|
||||||
|
|
||||||
if (PKG_ARGS_MODULE)
|
if (PKG_ARGS_MODULE)
|
||||||
list(APPEND CMAKE_PREFIX_PATH "${${ARTIFACT_PACKAGE}_SOURCE_DIR}")
|
list(PREPEND CMAKE_PREFIX_PATH "${${ARTIFACT_PACKAGE}_SOURCE_DIR}")
|
||||||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
Propagate(CMAKE_PREFIX_PATH)
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
find_package(${ARTIFACT_PACKAGE} ${ARTIFACT_MIN_VERSION} REQUIRED)
|
find_package(${ARTIFACT_PACKAGE} ${ARTIFACT_MIN_VERSION} REQUIRED)
|
||||||
|
|
@ -730,7 +730,7 @@ function(AddQt version)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
AddCIPackage(
|
AddCIPackage(
|
||||||
NAME Qt
|
NAME qt
|
||||||
PACKAGE Qt6
|
PACKAGE Qt6
|
||||||
VERSION ${version}
|
VERSION ${version}
|
||||||
MIN_VERSION 6
|
MIN_VERSION 6
|
||||||
|
|
@ -740,5 +740,8 @@ function(AddQt version)
|
||||||
freebsd-amd64 solaris-amd64 openbsd-amd64
|
freebsd-amd64 solaris-amd64 openbsd-amd64
|
||||||
MODULE)
|
MODULE)
|
||||||
|
|
||||||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
find_package(Qt6 REQUIRED PATHS ${Qt6_SOURCE_DIR} NO_DEFAULT_PATH)
|
||||||
|
|
||||||
|
Propagate(CMAKE_PREFIX_PATH)
|
||||||
|
Propagate(Qt6_SOURCE_DIR)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
# SPDX-FileCopyrightText: 2023 Alexandre Bouvier <contact@amb.tf>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
@ -13,7 +16,8 @@ endif()
|
||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
find_package_handle_standard_args(LLVM HANDLE_COMPONENTS CONFIG_MODE)
|
find_package_handle_standard_args(LLVM HANDLE_COMPONENTS CONFIG_MODE)
|
||||||
|
|
||||||
if (LLVM_FOUND AND LLVM_Demangle_FOUND AND NOT TARGET LLVM::Demangle)
|
# Demangle only for Windows targets
|
||||||
|
if (WIN32 AND LLVM_FOUND AND LLVM_Demangle_FOUND AND NOT TARGET LLVM::Demangle)
|
||||||
add_library(LLVM::Demangle INTERFACE IMPORTED)
|
add_library(LLVM::Demangle INTERFACE IMPORTED)
|
||||||
target_compile_definitions(LLVM::Demangle INTERFACE ${LLVM_DEFINITIONS})
|
target_compile_definitions(LLVM::Demangle INTERFACE ${LLVM_DEFINITIONS})
|
||||||
target_include_directories(LLVM::Demangle INTERFACE ${LLVM_INCLUDE_DIRS})
|
target_include_directories(LLVM::Demangle INTERFACE ${LLVM_INCLUDE_DIRS})
|
||||||
|
|
|
||||||
33
cpmfile.json
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"openssl": {
|
"openssl-ci": {
|
||||||
"ci": true,
|
"ci": true,
|
||||||
"package": "OpenSSL",
|
"package": "OpenSSL",
|
||||||
"name": "openssl",
|
"name": "openssl",
|
||||||
|
|
@ -7,6 +7,34 @@
|
||||||
"version": "3.6.0-1cb0d36b39",
|
"version": "3.6.0-1cb0d36b39",
|
||||||
"min_version": "3"
|
"min_version": "3"
|
||||||
},
|
},
|
||||||
|
"openssl-cmake": {
|
||||||
|
"repo": "jimmy-park/openssl-cmake",
|
||||||
|
"hash": "2cc185c924fd70e7d886257ca0caa42b3b8f7f712f2052b4f94dde74759e27022de76178460e18c9bdfc57c366583999e198fbb6052d4e7d91c099d15a0ca63e",
|
||||||
|
"git_version": "3.6.2",
|
||||||
|
"tag": "%VERSION%",
|
||||||
|
"bundled": true,
|
||||||
|
"options": [
|
||||||
|
"OPENSSL_CONFIGURE_OPTIONS threads"
|
||||||
|
],
|
||||||
|
"patches": [
|
||||||
|
"0001-cpmutil-compat.patch",
|
||||||
|
"0002-use-ccache.patch",
|
||||||
|
"0003-use-cmake-compiler-flags.patch",
|
||||||
|
"0004-use-shell-wrapper.patch"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"openssl": {
|
||||||
|
"repo": "openssl/openssl",
|
||||||
|
"package": "OpenSSL",
|
||||||
|
"min_version": "3",
|
||||||
|
"version": "3",
|
||||||
|
"hash": "29002ce50cb95a4f4f1d0e9d3f684401fbd4eac34203dc2eef3b6334af5d44aa46bf788b63a6f5c139c383eafb7269ae87a58a9a3ad5912903b9773e545ccc0a",
|
||||||
|
"git_version": "3.6.2",
|
||||||
|
"tag": "openssl-%VERSION%",
|
||||||
|
"patches": [
|
||||||
|
"0001-add-bundled-cert.patch"
|
||||||
|
]
|
||||||
|
},
|
||||||
"boost": {
|
"boost": {
|
||||||
"package": "Boost",
|
"package": "Boost",
|
||||||
"repo": "boostorg/boost",
|
"repo": "boostorg/boost",
|
||||||
|
|
@ -112,7 +140,8 @@
|
||||||
"options": [
|
"options": [
|
||||||
"QUAZIP_QT_MAJOR_VERSION 6",
|
"QUAZIP_QT_MAJOR_VERSION 6",
|
||||||
"QUAZIP_INSTALL OFF",
|
"QUAZIP_INSTALL OFF",
|
||||||
"QUAZIP_ENABLE_QTEXTCODEC OFF"
|
"QUAZIP_ENABLE_QTEXTCODEC OFF",
|
||||||
|
"QUAZIP_BZIP2 OFF"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
8
dist/72-eden-input.rules
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
# Allow systemd-logind to manage user access to hidraw with this file
|
||||||
|
# On most systems, this file should be installed to /etc/udev/rules.d/72-eden-input.rules
|
||||||
|
# Consult your distro if this is not the case
|
||||||
|
|
||||||
|
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ENV{ID_INPUT_JOYSTICK}=="1", MODE="0660", TAG+="uaccess"
|
||||||
19
dist/72-yuzu-input.rules
vendored
|
|
@ -1,19 +0,0 @@
|
||||||
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
# Allow systemd-logind to manage user access to hidraw with this file
|
|
||||||
# On most systems, this file should be installed to /etc/udev/rules.d/72-yuzu-input.rules
|
|
||||||
# Consult your distro if this is not the case
|
|
||||||
|
|
||||||
# Switch Pro Controller (USB/Bluetooth)
|
|
||||||
KERNEL=="hidraw*", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="2009", MODE="0660", TAG+="uaccess"
|
|
||||||
KERNEL=="hidraw*", KERNELS=="*057e:2009*", MODE="0660", TAG+="uaccess"
|
|
||||||
|
|
||||||
# Joy-Con L (Bluetooth)
|
|
||||||
KERNEL=="hidraw*", KERNELS=="*057e:2006*", MODE="0660", TAG+="uaccess"
|
|
||||||
|
|
||||||
# Joy-Con R (Bluetooth)
|
|
||||||
KERNEL=="hidraw*", KERNELS=="*057e:2007*", MODE="0660", TAG+="uaccess"
|
|
||||||
|
|
||||||
# Joy-Con Charging Grip (USB)
|
|
||||||
KERNEL=="hidraw*", ATTRS{idVendor}=="057e", ATTRS{idProduct}=="200e", MODE="0660", TAG+="uaccess"
|
|
||||||
207
dist/dev.eden_emu.eden.svg
vendored
|
|
@ -6,8 +6,8 @@
|
||||||
viewBox="0 0 512 512"
|
viewBox="0 0 512 512"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg7"
|
id="svg7"
|
||||||
sodipodi:docname="1stanni.svg"
|
sodipodi:docname="base.svg.2026_01_12_14_43_47.0.svg"
|
||||||
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
|
inkscape:version="1.4.2 (ebf0e94, 2025-05-08)"
|
||||||
inkscape:export-filename="base.svg.2026_01_12_14_43_47.0.svg"
|
inkscape:export-filename="base.svg.2026_01_12_14_43_47.0.svg"
|
||||||
inkscape:export-xdpi="96"
|
inkscape:export-xdpi="96"
|
||||||
inkscape:export-ydpi="96"
|
inkscape:export-ydpi="96"
|
||||||
|
|
@ -19,34 +19,36 @@
|
||||||
<defs
|
<defs
|
||||||
id="defs7">
|
id="defs7">
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="linearGradient34"
|
id="linearGradient1"
|
||||||
inkscape:collect="always">
|
inkscape:collect="always">
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#ffd700;stop-opacity:1;"
|
style="stop-color:#ff2e88;stop-opacity:0.5;"
|
||||||
offset="0"
|
offset="0"
|
||||||
id="stop34" />
|
id="stop3" />
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#ffd700;stop-opacity:0.48031053;"
|
style="stop-color:#bf42f6;stop-opacity:0.5;"
|
||||||
offset="1"
|
offset="0.44631511"
|
||||||
id="stop35" />
|
id="stop4" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5da5ed;stop-opacity:0.5;"
|
||||||
|
offset="0.90088946"
|
||||||
|
id="stop2" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<rect
|
|
||||||
x="20.999999"
|
|
||||||
y="287.30493"
|
|
||||||
width="487.07235"
|
|
||||||
height="134.69506"
|
|
||||||
id="rect22" />
|
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="linearGradient21"
|
id="linearGradient138"
|
||||||
inkscape:collect="always">
|
inkscape:collect="always">
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#3a0057;stop-opacity:1;"
|
style="stop-color:#ff2e88;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
id="stop21" />
|
id="stop152" />
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#830091;stop-opacity:1;"
|
style="stop-color:#bf42f6;stop-opacity:1;"
|
||||||
offset="1"
|
offset="0.44971901"
|
||||||
id="stop22" />
|
id="stop137" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5da5ed;stop-opacity:1;"
|
||||||
|
offset="0.89793283"
|
||||||
|
id="stop138" />
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="swatch37"
|
id="swatch37"
|
||||||
|
|
@ -114,6 +116,33 @@
|
||||||
width="521.34025"
|
width="521.34025"
|
||||||
height="248.94868"
|
height="248.94868"
|
||||||
id="rect24" />
|
id="rect24" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient11"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ff2e88;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop11" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#bf42f6;stop-opacity:1;"
|
||||||
|
offset="0.44971901"
|
||||||
|
id="stop154" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#5da5ed;stop-opacity:1;"
|
||||||
|
offset="0.89793283"
|
||||||
|
id="stop12" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient138"
|
||||||
|
id="linearGradient6"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.118028,0,0,1.116699,-46.314723,-42.388667)"
|
||||||
|
x1="270.39996"
|
||||||
|
y1="40.000019"
|
||||||
|
x2="270.39996"
|
||||||
|
y2="494.39996"
|
||||||
|
spreadMethod="pad" />
|
||||||
<clipPath
|
<clipPath
|
||||||
clipPathUnits="userSpaceOnUse"
|
clipPathUnits="userSpaceOnUse"
|
||||||
id="clipPath18">
|
id="clipPath18">
|
||||||
|
|
@ -136,6 +165,16 @@
|
||||||
inkscape:label="Circle"
|
inkscape:label="Circle"
|
||||||
r="191.89999" />
|
r="191.89999" />
|
||||||
</clipPath>
|
</clipPath>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient11"
|
||||||
|
id="linearGradient27"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="translate(-6.9401139e-5,-2.8678628)"
|
||||||
|
x1="256.00012"
|
||||||
|
y1="102.94693"
|
||||||
|
x2="256.00012"
|
||||||
|
y2="409.05307" />
|
||||||
<clipPath
|
<clipPath
|
||||||
clipPathUnits="userSpaceOnUse"
|
clipPathUnits="userSpaceOnUse"
|
||||||
id="clipPath128">
|
id="clipPath128">
|
||||||
|
|
@ -148,106 +187,14 @@
|
||||||
</clipPath>
|
</clipPath>
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
xlink:href="#linearGradient21"
|
xlink:href="#linearGradient1"
|
||||||
id="linearGradient22"
|
id="linearGradient2"
|
||||||
x1="256"
|
x1="256"
|
||||||
y1="0"
|
y1="64"
|
||||||
x2="256"
|
x2="256"
|
||||||
y2="512"
|
y2="448"
|
||||||
gradientUnits="userSpaceOnUse" />
|
gradientUnits="userSpaceOnUse"
|
||||||
<linearGradient
|
gradientTransform="matrix(1.3229974,0,0,1.3214002,-82.687336,-82.290326)" />
|
||||||
inkscape:collect="always"
|
|
||||||
xlink:href="#linearGradient34"
|
|
||||||
id="linearGradient35"
|
|
||||||
x1="256"
|
|
||||||
y1="-0.048701428"
|
|
||||||
x2="256"
|
|
||||||
y2="512.04932"
|
|
||||||
gradientUnits="userSpaceOnUse" />
|
|
||||||
<filter
|
|
||||||
inkscape:label="Glowing Bubble"
|
|
||||||
inkscape:menu="Ridges"
|
|
||||||
inkscape:menu-tooltip="Bubble effect with refraction and glow"
|
|
||||||
x="-0.19420711"
|
|
||||||
y="-0.11239541"
|
|
||||||
width="1.3884142"
|
|
||||||
height="1.2247908"
|
|
||||||
style="color-interpolation-filters:sRGB;"
|
|
||||||
id="filter61">
|
|
||||||
<feGaussianBlur
|
|
||||||
stdDeviation="1"
|
|
||||||
result="result1"
|
|
||||||
id="feGaussianBlur56" />
|
|
||||||
<feGaussianBlur
|
|
||||||
stdDeviation="10"
|
|
||||||
result="result6"
|
|
||||||
in="result1"
|
|
||||||
id="feGaussianBlur57" />
|
|
||||||
<feComposite
|
|
||||||
operator="atop"
|
|
||||||
in="result6"
|
|
||||||
in2="result1"
|
|
||||||
result="result8"
|
|
||||||
id="feComposite57" />
|
|
||||||
<feComposite
|
|
||||||
operator="xor"
|
|
||||||
result="fbSourceGraphic"
|
|
||||||
in="result6"
|
|
||||||
in2="result8"
|
|
||||||
id="feComposite58" />
|
|
||||||
<feColorMatrix
|
|
||||||
result="fbSourceGraphicAlpha"
|
|
||||||
in="fbSourceGraphic"
|
|
||||||
values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 2 0 "
|
|
||||||
id="feColorMatrix58" />
|
|
||||||
<feGaussianBlur
|
|
||||||
result="result0"
|
|
||||||
in="fbSourceGraphicAlpha"
|
|
||||||
stdDeviation="1"
|
|
||||||
id="feGaussianBlur58" />
|
|
||||||
<feSpecularLighting
|
|
||||||
specularExponent="35"
|
|
||||||
specularConstant="1.5"
|
|
||||||
surfaceScale="-2"
|
|
||||||
lighting-color="rgb(255,255,255)"
|
|
||||||
result="result1"
|
|
||||||
in="result0"
|
|
||||||
id="feSpecularLighting58">
|
|
||||||
<feDistantLight
|
|
||||||
azimuth="230"
|
|
||||||
elevation="60"
|
|
||||||
id="feDistantLight58" />
|
|
||||||
</feSpecularLighting>
|
|
||||||
<feComposite
|
|
||||||
operator="in"
|
|
||||||
result="result2"
|
|
||||||
in="result1"
|
|
||||||
in2="fbSourceGraphicAlpha"
|
|
||||||
id="feComposite59" />
|
|
||||||
<feComposite
|
|
||||||
k3="1.2"
|
|
||||||
k2="1.1"
|
|
||||||
operator="arithmetic"
|
|
||||||
result="result4"
|
|
||||||
in="fbSourceGraphic"
|
|
||||||
in2="result2"
|
|
||||||
id="feComposite60" />
|
|
||||||
<feGaussianBlur
|
|
||||||
result="result80"
|
|
||||||
in="result4"
|
|
||||||
stdDeviation="0.5"
|
|
||||||
id="feGaussianBlur60" />
|
|
||||||
<feComposite
|
|
||||||
operator="atop"
|
|
||||||
in="result9"
|
|
||||||
in2="result80"
|
|
||||||
result="result91"
|
|
||||||
id="feComposite61" />
|
|
||||||
<feBlend
|
|
||||||
mode="multiply"
|
|
||||||
in2="result91"
|
|
||||||
id="feBlend61" />
|
|
||||||
</filter>
|
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="namedview7"
|
id="namedview7"
|
||||||
|
|
@ -258,29 +205,23 @@
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pagecheckerboard="0"
|
inkscape:pagecheckerboard="0"
|
||||||
inkscape:deskcolor="#d1d1d1"
|
inkscape:deskcolor="#d1d1d1"
|
||||||
inkscape:zoom="1"
|
inkscape:zoom="1.4142136"
|
||||||
inkscape:cx="213.49999"
|
inkscape:cx="261.62951"
|
||||||
inkscape:cy="248.99999"
|
inkscape:cy="230.87036"
|
||||||
inkscape:window-width="1600"
|
inkscape:window-width="1920"
|
||||||
inkscape:window-height="849"
|
inkscape:window-height="1008"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="1080"
|
||||||
inkscape:window-y="27"
|
inkscape:window-y="351"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:current-layer="svg7" />
|
inkscape:current-layer="svg7" />
|
||||||
<circle
|
|
||||||
style="fill:url(#linearGradient22);fill-opacity:1;stroke:none;stroke-width:8"
|
|
||||||
id="path21"
|
|
||||||
cx="256"
|
|
||||||
cy="256"
|
|
||||||
r="256" />
|
|
||||||
<path
|
<path
|
||||||
id="path8-7"
|
id="path8-7"
|
||||||
style="display:inline;mix-blend-mode:normal;fill:url(#linearGradient35);fill-opacity:1;fill-rule:nonzero;stroke:#320081;stroke-width:4.067;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
style="display:inline;mix-blend-mode:multiply;fill:url(#linearGradient6);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient2);stroke-width:3.9666;stroke-dasharray:none;stroke-opacity:0.566238;paint-order:stroke fill markers"
|
||||||
inkscape:label="Circle"
|
inkscape:label="Circle"
|
||||||
d="M 256,2.2792898 A 254.0155,253.71401 0 0 0 150.68475,25.115202 c 19.54414,1.070775 38.74692,5.250294 51.56848,11.647658 14.14361,7.056691 28.63804,19.185961 39.4212,29.347551 h 40.60981 c 1.03847,-0.68139 2.10297,-1.36938 3.1938,-2.05957 5.45602,-15.78533 14.79164,-43.183497 19.49612,-57.0097682 A 254.0155,253.71401 0 0 0 256,2.2792898 Z m 61.57106,7.567234 -18.26098,46.1544672 c 7.79702,-4.13918 16.35655,-7.87447 25.20671,-10.87081 23.1229,-7.828433 43.96931,-10.170904 54.94058,-10.868226 A 254.0155,253.71401 0 0 0 317.57106,9.8465238 Z m 65.39277,26.4001532 c -9.68256,4.806644 -33.05532,16.642034 -55.68217,29.863734 H 424.4677 A 254.0155,253.71401 0 0 0 382.96383,36.246677 Z M 113.90698,45.690231 A 254.0155,253.71401 0 0 0 87.532302,66.110411 H 194.2739 c -1.47402,-0.80231 -2.35141,-1.25949 -2.35141,-1.25949 l 10.4496,-11.83348 -38.40568,7.01234 c 0,1e-5 -12.21537,-4.60266 -40.17313,-12.27223 -3.45336,-0.94731 -6.75329,-1.61824 -9.8863,-2.06732 z m -36.803618,30.18635 a 254.0155,253.71401 0 0 0 -34.88372,43.090929 h 59.976738 c 18.11461,-12.04145 40.14252,-22.882149 62.31266,-24.534159 52.93006,-3.9444 70.16538,1.86342 70.16538,1.86342 0,0 -4.612,-4.8206 -14.51938,-13.36656 -2.72366,-2.34942 -6.0844,-4.77373 -9.52455,-7.05363 z m 174.472868,0 c 4.57322,4.7186 7.29716,7.83565 7.29716,7.83565 0,0 3.53501,-3.18484 9.62532,-7.83565 z m 60.27649,0 c -21.56573,15.45339 -25.4703,27.979669 -25.4703,27.979669 0,0 54.83326,-19.215729 100.70543,-0.31228 11.63986,4.79661 21.58481,10.13159 29.94832,15.42354 h 52.74419 A 254.0155,253.71401 0 0 0 434.89664,75.876581 Z M 36.250648,128.73367 A 254.0155,253.71401 0 0 0 16.372095,171.82459 H 147.45478 c 1.45695,-2.5815 3.06539,-5.08648 4.83979,-7.48982 14.23694,-19.28301 27.92088,-30.0088 36.86047,-35.6011 h -30.25323 c -5.87346,0.93472 -12.04945,1.99094 -18.28166,3.16937 -30.12936,5.69727 -81.157618,22.78945 -81.157618,22.78945 0,0 11.47125,-12.39249 29.11369,-25.95882 z m 265.630492,0 c 33.48676,11.2434 52.42799,26.78443 62.7752,43.09092 h 130.97157 a 254.0155,253.71401 0 0 0 -19.87856,-43.09092 h -44.81136 c 14.85233,11.5863 21.59948,20.9854 21.59948,20.9854 0,0 -33.5226,-12.37087 -66.0646,-20.9854 z m -45.96641,16.27007 c -1.00419,0.0106 -10.12705,0.72026 -44.98966,20.64729 -3.12132,1.78406 -6.25434,3.86182 -9.37468,6.17356 h 41.81911 c 7.17181,-17.34774 12.64083,-26.82085 12.64083,-26.82085 0,0 -0.0287,-7.1e-4 -0.0957,0 z m 14.18088,0.0465 c 0,0 -3.31228,9.32762 -7.30492,26.77438 h 51.78554 C 287.6577,146.14158 270.09561,145.0502 270.09561,145.0502 Z M 13.152456,181.59075 A 254.0155,253.71401 0 0 0 3.927651,224.68167 H 134.1447 c 0.56161,-12.72411 2.67825,-28.50188 8.61499,-43.09092 z m 176.661504,0 c -14.27121,13.10564 -27.60733,29.58761 -37.56073,43.09092 h 73.3721 c 4.47018,-16.79061 9.35068,-31.26371 13.86562,-43.09092 z m 70.85787,0 c -2.41384,11.76417 -4.9032,26.20707 -6.94831,43.09092 H 360.4832 c -8.32133,-10.88917 -20.66988,-26.17008 -36.35141,-43.09092 z m 109.17313,0 c 6.63611,15.24089 6.92441,30.5373 5.57882,43.09092 h 132.64857 a 254.0155,253.71401 0 0 0 -9.22481,-43.09092 z M 2.90181,234.44783 A 254.0155,253.71401 0 0 0 1.984498,255.9933 254.0155,253.71401 0 0 0 2.90181,277.53876 h 211.89923 c 2.25762,-15.52555 5.14325,-29.93448 8.3385,-43.09093 h -77.8863 c -6.46396,9.27617 -10.33076,15.56549 -10.33076,15.56549 0,0 -0.82623,-6.14945 -0.9354,-15.56549 z m 249.72093,0 c -1.3692,13.09684 -2.4456,27.49209 -3.02068,43.09093 h 259.49613 a 254.0155,253.71401 0 0 0 0.91731,-21.54546 254.0155,253.71401 0 0 0 -0.91731,-21.54547 H 374.02584 c -0.445,2.5469 -0.90878,4.89768 -1.32817,7.01751 0,0 -1.69726,-2.53821 -4.94056,-7.01751 z M 3.927651,287.30493 a 254.0155,253.71401 0 0 0 9.224805,43.09091 H 214.04393 c -1.29238,-15.40742 -1.57503,-30.04388 -0.41861,-43.09091 z m 245.385009,0 c -0.30355,13.54349 -0.22032,27.92598 0.36951,43.09091 h 249.16537 a 254.0155,253.71401 0 0 0 9.22481,-43.09091 z M 16.369511,340.16201 a 254.0155,253.71401 0 0 0 19.878554,43.09091 H 221.4677 c -2.69781,-14.4523 -4.96108,-29.01285 -6.4832,-43.09091 z m 233.842379,0 c 1.15864,15.47765 3.81286,29.83979 7.51679,43.09091 h 218.02325 a 254.0155,253.71401 0 0 0 19.87856,-43.09091 z M 42.217052,393.01909 a 254.0155,253.71401 0 0 0 34.88372,43.09093 H 233.09561 c -3.40902,-13.67281 -6.76794,-28.2531 -9.73902,-43.09093 z m 218.490958,0 c 5.34985,16.15926 12.22007,30.51982 19.68733,43.09093 h 154.50389 a 254.0155,253.71401 0 0 0 34.88371,-43.09093 z M 87.529722,445.87618 a 254.0155,253.71401 0 0 0 166.229968,63.8208 c -3.67805,-12.0825 -10.85464,-35.49828 -18.18088,-63.8208 z m 199.010328,0 c 17.5887,26.43772 36.99259,43.60598 47.33592,51.61309 a 254.0155,253.71401 0 0 0 90.59431,-51.61309 z" />
|
d="M 256,2.2792898 A 254.0155,253.71401 0 0 0 150.68475,25.115202 c 19.54414,1.070775 38.74692,5.250294 51.56848,11.647658 14.14361,7.056691 28.63804,19.185961 39.4212,29.347551 h 40.60981 c 1.03847,-0.68139 2.10297,-1.36938 3.1938,-2.05957 5.45602,-15.78533 14.79164,-43.183497 19.49612,-57.0097682 A 254.0155,253.71401 0 0 0 256,2.2792898 Z m 61.57106,7.567234 -18.26098,46.1544672 c 7.79702,-4.13918 16.35655,-7.87447 25.20671,-10.87081 23.1229,-7.828433 43.96931,-10.170904 54.94058,-10.868226 A 254.0155,253.71401 0 0 0 317.57106,9.8465238 Z m 65.39277,26.4001532 c -9.68256,4.806644 -33.05532,16.642034 -55.68217,29.863734 H 424.4677 A 254.0155,253.71401 0 0 0 382.96383,36.246677 Z M 113.90698,45.690231 A 254.0155,253.71401 0 0 0 87.532302,66.110411 H 194.2739 c -1.47402,-0.80231 -2.35141,-1.25949 -2.35141,-1.25949 l 10.4496,-11.83348 -38.40568,7.01234 c 0,1e-5 -12.21537,-4.60266 -40.17313,-12.27223 -3.45336,-0.94731 -6.75329,-1.61824 -9.8863,-2.06732 z m -36.803618,30.18635 a 254.0155,253.71401 0 0 0 -34.88372,43.090929 h 59.976738 c 18.11461,-12.04145 40.14252,-22.882149 62.31266,-24.534159 52.93006,-3.9444 70.16538,1.86342 70.16538,1.86342 0,0 -4.612,-4.8206 -14.51938,-13.36656 -2.72366,-2.34942 -6.0844,-4.77373 -9.52455,-7.05363 z m 174.472868,0 c 4.57322,4.7186 7.29716,7.83565 7.29716,7.83565 0,0 3.53501,-3.18484 9.62532,-7.83565 z m 60.27649,0 c -21.56573,15.45339 -25.4703,27.979669 -25.4703,27.979669 0,0 54.83326,-19.215729 100.70543,-0.31228 11.63986,4.79661 21.58481,10.13159 29.94832,15.42354 h 52.74419 A 254.0155,253.71401 0 0 0 434.89664,75.876581 Z M 36.250648,128.73367 A 254.0155,253.71401 0 0 0 16.372095,171.82459 H 147.45478 c 1.45695,-2.5815 3.06539,-5.08648 4.83979,-7.48982 14.23694,-19.28301 27.92088,-30.0088 36.86047,-35.6011 h -30.25323 c -5.87346,0.93472 -12.04945,1.99094 -18.28166,3.16937 -30.12936,5.69727 -81.157618,22.78945 -81.157618,22.78945 0,0 11.47125,-12.39249 29.11369,-25.95882 z m 265.630492,0 c 33.48676,11.2434 52.42799,26.78443 62.7752,43.09092 h 130.97157 a 254.0155,253.71401 0 0 0 -19.87856,-43.09092 h -44.81136 c 14.85233,11.5863 21.59948,20.9854 21.59948,20.9854 0,0 -33.5226,-12.37087 -66.0646,-20.9854 z m -45.96641,16.27007 c -1.00419,0.0106 -10.12705,0.72026 -44.98966,20.64729 -3.12132,1.78406 -6.25434,3.86182 -9.37468,6.17356 h 41.81911 c 7.17181,-17.34774 12.64083,-26.82085 12.64083,-26.82085 0,0 -0.0287,-7.1e-4 -0.0957,0 z m 14.18088,0.0465 c 0,0 -3.31228,9.32762 -7.30492,26.77438 h 51.78554 C 287.6577,146.14158 270.09561,145.0502 270.09561,145.0502 Z M 13.152456,181.59075 A 254.0155,253.71401 0 0 0 3.927651,224.68167 H 134.1447 c 0.56161,-12.72411 2.67825,-28.50188 8.61499,-43.09092 z m 176.661504,0 c -14.27121,13.10564 -27.60733,29.58761 -37.56073,43.09092 h 73.3721 c 4.47018,-16.79061 9.35068,-31.26371 13.86562,-43.09092 z m 70.85787,0 c -2.41384,11.76417 -4.9032,26.20707 -6.94831,43.09092 H 360.4832 c -8.32133,-10.88917 -20.66988,-26.17008 -36.35141,-43.09092 z m 109.17313,0 c 6.63611,15.24089 6.92441,30.5373 5.57882,43.09092 h 132.64857 a 254.0155,253.71401 0 0 0 -9.22481,-43.09092 z M 2.90181,234.44783 A 254.0155,253.71401 0 0 0 1.984498,255.9933 254.0155,253.71401 0 0 0 2.90181,277.53876 h 211.89923 c 2.25762,-15.52555 5.14325,-29.93448 8.3385,-43.09093 h -77.8863 c -6.46396,9.27617 -10.33076,15.56549 -10.33076,15.56549 0,0 -0.82623,-6.14945 -0.9354,-15.56549 z m 249.72093,0 c -1.3692,13.09684 -2.4456,27.49209 -3.02068,43.09093 h 259.49613 a 254.0155,253.71401 0 0 0 0.91731,-21.54546 254.0155,253.71401 0 0 0 -0.91731,-21.54547 H 374.02584 c -0.445,2.5469 -0.90878,4.89768 -1.32817,7.01751 0,0 -1.69726,-2.53821 -4.94056,-7.01751 z M 3.927651,287.30493 a 254.0155,253.71401 0 0 0 9.224805,43.09091 H 214.04393 c -1.29238,-15.40742 -1.57503,-30.04388 -0.41861,-43.09091 z m 245.385009,0 c -0.30355,13.54349 -0.22032,27.92598 0.36951,43.09091 h 249.16537 a 254.0155,253.71401 0 0 0 9.22481,-43.09091 z M 16.369511,340.16201 a 254.0155,253.71401 0 0 0 19.878554,43.09091 H 221.4677 c -2.69781,-14.4523 -4.96108,-29.01285 -6.4832,-43.09091 z m 233.842379,0 c 1.15864,15.47765 3.81286,29.83979 7.51679,43.09091 h 218.02325 a 254.0155,253.71401 0 0 0 19.87856,-43.09091 z M 42.217052,393.01909 a 254.0155,253.71401 0 0 0 34.88372,43.09093 H 233.09561 c -3.40902,-13.67281 -6.76794,-28.2531 -9.73902,-43.09093 z m 218.490958,0 c 5.34985,16.15926 12.22007,30.51982 19.68733,43.09093 h 154.50389 a 254.0155,253.71401 0 0 0 34.88371,-43.09093 z M 87.529722,445.87618 a 254.0155,253.71401 0 0 0 166.229968,63.8208 c -3.67805,-12.0825 -10.85464,-35.49828 -18.18088,-63.8208 z m 199.010328,0 c 17.5887,26.43772 36.99259,43.60598 47.33592,51.61309 a 254.0155,253.71401 0 0 0 90.59431,-51.61309 z" />
|
||||||
<path
|
<path
|
||||||
id="path27"
|
id="path27"
|
||||||
style="display:inline;mix-blend-mode:multiply;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:3;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
|
style="display:inline;mix-blend-mode:multiply;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient27);stroke-width:3;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
|
||||||
d="m 318.98012,441.7375 c -9.87518,-6.73978 -64.39137,-49.0272 -67.68975,-127.81978 -3.69298,-88.21893 15.36468,-141.91029 15.36468,-141.91029 0,0 16.00378,0.99513 39.80316,26.53195 23.79939,25.53753 37.74965,46.43102 37.74965,46.43102 3.91262,-19.79992 12.84563,-66.32402 -60.72865,-87.55523 0,0 12.82326,-5.38883 39.3925,-3.81382 26.56907,1.57572 81.6822,21.93799 81.6822,21.93799 0,0 -14.79766,-20.63773 -49.47063,-34.94295 -34.67291,-14.30533 -76.1182,0.23644 -76.1182,0.23644 0,0 3.86959,-12.43127 27.22669,-26.38478 23.35718,-13.9537 49.27409,-26.501533 49.27409,-26.501533 0,0 -21.97854,-0.26548 -47.67725,8.44535 -6.68948,2.267506 -13.15863,5.094213 -19.05208,8.226563 l 16.05803,-40.634103 -4.4617,-1.89059 -5.1305,-0.95965 c 0,0 -11.24072,33.12428 -16.92051,49.576513 -12.13137,7.68489 -20.11005,14.87735 -20.11005,14.87735 0,0 -21.90573,-25.09227 -42.79668,-35.527803 -26.03412,-13.00525 -86.88249,-13.90359 -94.0044,10.401173 0,0 13.56804,-7.884703 34.70032,-2.080917 21.13214,5.803997 30.3644,9.287307 30.3644,9.287307 l 29.02989,-5.30681 -7.89811,8.95527 c 0,0 13.8496,7.21324 21.33822,13.68063 7.48859,6.46722 10.9757,10.11472 10.9757,10.11472 0,0 -13.02739,-4.39388 -53.03507,-1.40893 -40.00771,2.98473 -79.40016,45.60209 -79.40016,45.60209 0,0 38.57037,-12.93531 61.34393,-17.24677 22.77354,-4.31126 44.52166,-6.46757 44.52166,-6.46757 0,0 -17.23298,5.97003 -35.69792,31.00932 -18.46522,25.03987 -13.13146,64.83866 -13.13146,64.83866 0,0 29.33874,-47.7577 57.44675,-63.84249 28.10798,-16.08527 34.0799,-15.6238 34.0799,-15.6238 0,0 -22.56785,39.13486 -31.39017,101.98268 -8.03005,57.2039 26.77689,163.75449 31.1572,178.89699"
|
d="m 318.98012,441.7375 c -9.87518,-6.73978 -64.39137,-49.0272 -67.68975,-127.81978 -3.69298,-88.21893 15.36468,-141.91029 15.36468,-141.91029 0,0 16.00378,0.99513 39.80316,26.53195 23.79939,25.53753 37.74965,46.43102 37.74965,46.43102 3.91262,-19.79992 12.84563,-66.32402 -60.72865,-87.55523 0,0 12.82326,-5.38883 39.3925,-3.81382 26.56907,1.57572 81.6822,21.93799 81.6822,21.93799 0,0 -14.79766,-20.63773 -49.47063,-34.94295 -34.67291,-14.30533 -76.1182,0.23644 -76.1182,0.23644 0,0 3.86959,-12.43127 27.22669,-26.38478 23.35718,-13.9537 49.27409,-26.501533 49.27409,-26.501533 0,0 -21.97854,-0.26548 -47.67725,8.44535 -6.68948,2.267506 -13.15863,5.094213 -19.05208,8.226563 l 16.05803,-40.634103 -4.4617,-1.89059 -5.1305,-0.95965 c 0,0 -11.24072,33.12428 -16.92051,49.576513 -12.13137,7.68489 -20.11005,14.87735 -20.11005,14.87735 0,0 -21.90573,-25.09227 -42.79668,-35.527803 -26.03412,-13.00525 -86.88249,-13.90359 -94.0044,10.401173 0,0 13.56804,-7.884703 34.70032,-2.080917 21.13214,5.803997 30.3644,9.287307 30.3644,9.287307 l 29.02989,-5.30681 -7.89811,8.95527 c 0,0 13.8496,7.21324 21.33822,13.68063 7.48859,6.46722 10.9757,10.11472 10.9757,10.11472 0,0 -13.02739,-4.39388 -53.03507,-1.40893 -40.00771,2.98473 -79.40016,45.60209 -79.40016,45.60209 0,0 38.57037,-12.93531 61.34393,-17.24677 22.77354,-4.31126 44.52166,-6.46757 44.52166,-6.46757 0,0 -17.23298,5.97003 -35.69792,31.00932 -18.46522,25.03987 -13.13146,64.83866 -13.13146,64.83866 0,0 29.33874,-47.7577 57.44675,-63.84249 28.10798,-16.08527 34.0799,-15.6238 34.0799,-15.6238 0,0 -22.56785,39.13486 -31.39017,101.98268 -8.03005,57.2039 26.77689,163.75449 31.1572,178.89699"
|
||||||
sodipodi:nodetypes="cscsccscscscsccccccscscccscscscscscsc"
|
sodipodi:nodetypes="cscsccscscscsccccccscscccscscscscscsc"
|
||||||
inkscape:label="MainOutline"
|
inkscape:label="MainOutline"
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 13 KiB |
BIN
dist/eden.bmp
vendored
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
BIN
dist/eden.ico
vendored
|
Before Width: | Height: | Size: 556 KiB After Width: | Height: | Size: 335 KiB |
1468
dist/languages/ar.ts
vendored
1467
dist/languages/ca.ts
vendored
1467
dist/languages/cs.ts
vendored
1475
dist/languages/da.ts
vendored
1467
dist/languages/de.ts
vendored
1467
dist/languages/el.ts
vendored
1480
dist/languages/es.ts
vendored
1499
dist/languages/fi.ts
vendored
1465
dist/languages/fr.ts
vendored
1467
dist/languages/hu.ts
vendored
1467
dist/languages/id.ts
vendored
1465
dist/languages/it.ts
vendored
1467
dist/languages/ja_JP.ts
vendored
3375
dist/languages/ko_KR.ts
vendored
1467
dist/languages/nb.ts
vendored
1467
dist/languages/nl.ts
vendored
1467
dist/languages/pl.ts
vendored
1592
dist/languages/pt_BR.ts
vendored
1467
dist/languages/pt_PT.ts
vendored
1469
dist/languages/ru_RU.ts
vendored
1467
dist/languages/sv.ts
vendored
1469
dist/languages/tr_TR.ts
vendored
1468
dist/languages/uk.ts
vendored
1467
dist/languages/vi.ts
vendored
1467
dist/languages/vi_VN.ts
vendored
1467
dist/languages/zh_CN.ts
vendored
1469
dist/languages/zh_TW.ts
vendored
BIN
dist/qt_themes/default/icons/256x256/eden.png
vendored
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 35 KiB |
|
|
@ -136,6 +136,16 @@ cmake -S . -B build -G "<GENERATOR>" -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COM
|
||||||
<img src="https://user-images.githubusercontent.com/42481638/216899275-d514ec6a-e563-470e-81e2-3e04f0429b68.png" width="500">
|
<img src="https://user-images.githubusercontent.com/42481638/216899275-d514ec6a-e563-470e-81e2-3e04f0429b68.png" width="500">
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
#### Option D: Visual Studio with clang-cl
|
||||||
|
|
||||||
|
<details>
|
||||||
|
1. Install `"x64 Native Tools Command Prompt"` for VS from the installer and also install `cmake-gui`.
|
||||||
|
2. Open `"x64 Native Tools Command Prompt"` and type `cmake-gui`.
|
||||||
|
3. Click configure choose ninja generator > specify native compilers.
|
||||||
|
4. Put `"C:/Program Files/Microsoft Visual Studio/18/Community/VC/Tools/Llvm/x64/bin/clang-cl.exe"` as your C/C++ compiler path.
|
||||||
|
5. Open `Visual studio > Open project` or Solution > Change to search for the CMake project file (`CMakeList.txt`) file on the cloned directory, and then build.
|
||||||
|
</details>
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
||||||
If your initial configure failed:
|
If your initial configure failed:
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ Qt Widgets appears to be broken. For now, add `-DENABLE_QT=OFF` to your configur
|
||||||
This is needed for some dependencies that call cc directly (tz):
|
This is needed for some dependencies that call cc directly (tz):
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
echo '#!/bin/sh' >cc
|
echo '#!/bin/sh -e' >cc
|
||||||
echo 'gcc $@' >>cc
|
echo 'gcc $@' >>cc
|
||||||
chmod +x cc
|
chmod +x cc
|
||||||
export PATH="$PATH:$PWD"
|
export PATH="$PATH:$PWD"
|
||||||
|
|
@ -65,14 +65,13 @@ export LIBGL_ALWAYS_SOFTWARE=1
|
||||||
```
|
```
|
||||||
|
|
||||||
- Modify the generated ffmpeg.make (in build dir) if using multiple threads (base system `make` doesn't use `-j4`, so change for `gmake`).
|
- Modify the generated ffmpeg.make (in build dir) if using multiple threads (base system `make` doesn't use `-j4`, so change for `gmake`).
|
||||||
- If using OpenIndiana, due to a bug in SDL2's CMake configuration, audio driver defaults to SunOS `<sys/audioio.h>`, which does not exist on OpenIndiana. Using external or bundled SDL2 may solve this.
|
|
||||||
- System OpenSSL generally does not work. Instead, use `-DYUZU_USE_BUNDLED_OPENSSL=ON` to use a bundled static OpenSSL, or build a system dependency from source.
|
- System OpenSSL generally does not work. Instead, use `-DYUZU_USE_BUNDLED_OPENSSL=ON` to use a bundled static OpenSSL, or build a system dependency from source.
|
||||||
|
|
||||||
## OmniOS
|
## OmniOS
|
||||||
|
|
||||||
Install `developer/gcc14` on OmniOS using pkgsrc.
|
Install `developer/gcc14` on OmniOS using pkgsrc.
|
||||||
|
|
||||||
Since so many dependencies are missing on `OmniOS`, you may wish to use `-DCPMUTIL_FORCE_BUNDLED=ON -DYUZU_USE_EXTERNAL_SDL2=ON`
|
Since so many dependencies are missing on `OmniOS`, you may wish to use `-DCPMUTIL_FORCE_BUNDLED=ON`
|
||||||
|
|
||||||
For OmniOS you are required to build glslang yourself:
|
For OmniOS you are required to build glslang yourself:
|
||||||
```sh
|
```sh
|
||||||
|
|
|
||||||
|
|
@ -69,29 +69,6 @@ Expressions can be `variable_names` or `1234` (numbers) or `*var` (dereference o
|
||||||
|
|
||||||
For more information type `info gdb` and read [the man page](https://man7.org/linux/man-pages/man1/gdb.1.html).
|
For more information type `info gdb` and read [the man page](https://man7.org/linux/man-pages/man1/gdb.1.html).
|
||||||
|
|
||||||
## Simple checklist for debugging black screens using Renderdoc
|
# RenderDoc (Graphic Debugging Tool)
|
||||||
|
|
||||||
Renderdoc is a free, cross platform, multi-graphics API debugger. It is an invaluable tool for diagnosing issues with graphics applications, and includes support for Vulkan. Get it at [renderdoc.org](https://renderdoc.org).
|
Guidelines for graphical debugging using RenderDoc: **[RenderDoc usage](./RenderDoc.md)**
|
||||||
|
|
||||||
Before using renderdoc to diagnose issues, it is always good to make sure there are no validation errors. Any errors means the behavior of the application is undefined. That said, renderdoc can help debug validation errors if you do have them.
|
|
||||||
|
|
||||||
When debugging a black screen, there are many ways the application could have setup Vulkan wrong.
|
|
||||||
Here is a short checklist of items to look at to make sure are appropriate:
|
|
||||||
|
|
||||||
- Draw call counts are correct (aka not zero, or if rendering many triangles, not 3)
|
|
||||||
- Vertex buffers are bound
|
|
||||||
- vertex attributes are correct - Make sure the size & offset of each attribute matches what should it should be
|
|
||||||
- Any bound push constants and descriptors have the right data - including:
|
|
||||||
- Matrices have correct values - double check the model, view, & projection matrices are uploaded correctly
|
|
||||||
- Pipeline state is correct
|
|
||||||
- viewport range is correct - x,y are 0,0; width & height are screen dimensions, minDepth is 0, maxDepth is 1, NDCDepthRange is 0,1
|
|
||||||
- Fill mode matches expected - usually solid
|
|
||||||
- Culling mode makes sense - commonly back or none
|
|
||||||
- The winding direction is correct - typically CCW (counter clockwise)
|
|
||||||
- Scissor region is correct - usually same as viewport's x,y,width, &height
|
|
||||||
- Blend state is correct
|
|
||||||
- Depth state is correct - typically enabled with Function set to Less than or Equal
|
|
||||||
- Swapchain images are bound when rendering to the swapchain
|
|
||||||
- Image being rendered to is the same as the one being presented when rendering to the swapchain
|
|
||||||
|
|
||||||
Alternatively, a [RenderDoc Extension](https://github.com/baldurk/renderdoc-contrib/tree/main/baldurk/whereismydraw) ([Archive](https://web.archive.org/web/20250000000000*/https://github.com/baldurk/renderdoc-contrib/tree/main/baldurk/whereismydraw)) exists which automates doing a lot of these manual steps.
|
|
||||||
52
docs/Deps.md
|
|
@ -16,7 +16,7 @@ To build Eden, you MUST have a C++ compiler.
|
||||||
|
|
||||||
The following additional tools are also required:
|
The following additional tools are also required:
|
||||||
|
|
||||||
* **[CMake](https://www.cmake.org/)** 3.22+ - already included with the Android SDK
|
* **[CMake](https://www.cmake.org/)** 3.31+ - already included with the Android SDK
|
||||||
* **[Git](https://git-scm.com/)** for version control
|
* **[Git](https://git-scm.com/)** for version control
|
||||||
* **[Windows installer](https://gitforwindows.org)**
|
* **[Windows installer](https://gitforwindows.org)**
|
||||||
* **[Python3](https://www.python.org/downloads/)** 3.10+ - necessary to download external repositories
|
* **[Python3](https://www.python.org/downloads/)** 3.10+ - necessary to download external repositories
|
||||||
|
|
@ -35,6 +35,11 @@ If you are on desktop and plan to use the Qt frontend, you *must* install Qt 6,
|
||||||
|
|
||||||
* For help setting up Qt Creator, run `./install.sh -h qtcreator`
|
* For help setting up Qt Creator, run `./install.sh -h qtcreator`
|
||||||
|
|
||||||
|
* If you're using clang-cl and want to still use MSVC
|
||||||
|
* Check the option to add "C++ clang compiler for Windows" on Visual Studio installer and uncheck "x64/x86 build tool for MSVC" while selecting "C++ desktop developement tools" and change Visual Studio to 2026, from 2022.
|
||||||
|
* At qt creator section generator tab change Visual Studio 17 2022 to 2026.
|
||||||
|
* Finally, to use clang-cl: `cmake -S . -B build -G "Visual Studio 17 2026" -T ClangCL`
|
||||||
|
|
||||||
If you are on **Windows** and building with **MSVC** or **clang-cl**, 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
|
## Externals
|
||||||
|
|
@ -42,7 +47,7 @@ If you are on **Windows** and building with **MSVC** or **clang-cl**, you may go
|
||||||
The following are handled by Eden's externals:
|
The following are handled by Eden's externals:
|
||||||
|
|
||||||
* [FFmpeg](https://ffmpeg.org/) (should use `-DYUZU_USE_EXTERNAL_FFMPEG=ON`)
|
* [FFmpeg](https://ffmpeg.org/) (should use `-DYUZU_USE_EXTERNAL_FFMPEG=ON`)
|
||||||
* [SDL2](https://www.libsdl.org/download-2.0.php) 2.0.18+ (should use `-DYUZU_USE_EXTERNAL_SDL2=ON` OR `-DYUZU_USE_BUNDLED_SDL2=ON` to reduce compile time)
|
* [SDL3](https://www.libsdl.org/download-2.0.php) 3.2.10+ (Use `-DYUZU_USE_BUNDLED_SDL2=ON` to reduce compile time)
|
||||||
|
|
||||||
All other dependencies will be downloaded and built by [CPM](https://github.com/cpm-cmake/CPM.cmake/) if `YUZU_USE_CPM` is on, but will always use system dependencies if available (UNIX-like only):
|
All other dependencies will be downloaded and built by [CPM](https://github.com/cpm-cmake/CPM.cmake/) if `YUZU_USE_CPM` is on, but will always use system dependencies if available (UNIX-like only):
|
||||||
|
|
||||||
|
|
@ -118,7 +123,7 @@ sudo emerge -a \
|
||||||
dev-util/spirv-tools dev-util/spirv-headers dev-util/vulkan-headers \
|
dev-util/spirv-tools dev-util/spirv-headers dev-util/vulkan-headers \
|
||||||
dev-util/vulkan-utility-libraries dev-util/glslang \
|
dev-util/vulkan-utility-libraries dev-util/glslang \
|
||||||
media-gfx/renderdoc media-libs/libva media-libs/opus media-video/ffmpeg \
|
media-gfx/renderdoc media-libs/libva media-libs/opus media-video/ffmpeg \
|
||||||
media-libs/VulkanMemoryAllocator media-libs/libsdl2 media-libs/cubeb \
|
media-libs/VulkanMemoryAllocator media-libs/libsdl3 media-libs/cubeb \
|
||||||
net-libs/enet \
|
net-libs/enet \
|
||||||
sys-libs/zlib \
|
sys-libs/zlib \
|
||||||
dev-cpp/nlohmann_json dev-cpp/simpleini dev-cpp/cpp-httplib dev-cpp/cpp-jwt \
|
dev-cpp/nlohmann_json dev-cpp/simpleini dev-cpp/cpp-httplib dev-cpp/cpp-jwt \
|
||||||
|
|
@ -137,7 +142,8 @@ Required USE flags:
|
||||||
|
|
||||||
* `dev-qt/qtbase network concurrent dbus gui widgets`
|
* `dev-qt/qtbase network concurrent dbus gui widgets`
|
||||||
* `dev-libs/quazip qt6`
|
* `dev-libs/quazip qt6`
|
||||||
* `media-libs/libsdl2 haptic joystick sound video`
|
* `media-libs/libsdl3 haptic joystick sound video`
|
||||||
|
* Adding `X vulkan udev opengl` is recommended but not required
|
||||||
* `dev-cpp/cpp-httplib ssl`
|
* `dev-cpp/cpp-httplib ssl`
|
||||||
|
|
||||||
[Caveats](./Caveats.md#gentoo-linux)
|
[Caveats](./Caveats.md#gentoo-linux)
|
||||||
|
|
@ -148,7 +154,7 @@ Required USE flags:
|
||||||
<summary>Arch Linux</summary>
|
<summary>Arch Linux</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 ninja nlohmann-json openssl opus qt6-base qt6-multimedia qt6-charts sdl2 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers
|
sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glslang libzip lz4 ninja nlohmann-json openssl opus qt6-base qt6-multimedia qt6-charts sdl3 zlib zstd zip unzip vulkan-headers vulkan-utility-libraries libusb spirv-tools spirv-headers
|
||||||
```
|
```
|
||||||
|
|
||||||
* Building with QT Web Engine requires `qt6-webengine` as well.
|
* Building with QT Web Engine requires `qt6-webengine` as well.
|
||||||
|
|
@ -161,10 +167,10 @@ sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glsl
|
||||||
<summary>Ubuntu, Debian, Mint Linux</summary>
|
<summary>Ubuntu, Debian, Mint Linux</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev qt6-charts-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl2-dev libopus-dev libasound2t64 vulkan-utility-libraries-dev
|
sudo apt-get install autoconf cmake g++ gcc git glslang-tools libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev qt6-charts-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev libboost-dev libboost-fiber-dev libboost-context-dev libsdl3-dev libopus-dev libasound2t64 vulkan-utility-libraries-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
* Ubuntu 22.04, Linux Mint 20, or Debian 12 or later is required.
|
* Ubuntu 26.04, Linux Mint 22.3, or Debian 13 or later is required.
|
||||||
* To enable QT Web Engine, add `-DYUZU_USE_QT_WEB_ENGINE=ON` when running CMake.
|
* To enable QT Web Engine, add `-DYUZU_USE_QT_WEB_ENGINE=ON` when running CMake.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -185,13 +191,13 @@ AlmaLinux (use `YUZU_USE_CPM=ON`):
|
||||||
sudo dnf install epel-release dnf-utils
|
sudo dnf install epel-release dnf-utils
|
||||||
# (run rpmfusion installation afterwards)
|
# (run rpmfusion installation afterwards)
|
||||||
# vvv - This will work for most systems
|
# vvv - This will work for most systems
|
||||||
sudo dnf install autoconf cmake libtool libudev cmake gcc gcc-c++ qt6-qtbase-devel zlib-devel openssl-devel boost SDL2 ffmpeg-devel libdrm glslang jq patch
|
sudo dnf install autoconf cmake libtool libudev cmake gcc gcc-c++ qt6-qtbase-devel zlib-devel openssl-devel boost SDL3 ffmpeg-devel libdrm glslang jq patch
|
||||||
# Qt6 private GUI must be taken from CRB repos
|
# Qt6 private GUI must be taken from CRB repos
|
||||||
sudo dnf config-manager --enable crb
|
sudo dnf config-manager --enable crb
|
||||||
sudo dnf install qt6-qtbase-private-devel
|
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`.
|
For systems like OpenEuler or derivates, don't forget to also install: `SDL3-devel pkg-config fmt-dev nlohmann-json-dev`.
|
||||||
|
|
||||||
* [RPM Fusion](https://rpmfusion.org/Configuration) is required for `ffmpeg-devel`
|
* [RPM Fusion](https://rpmfusion.org/Configuration) is required for `ffmpeg-devel`
|
||||||
* Fedora 32 or later is required.
|
* Fedora 32 or later is required.
|
||||||
|
|
@ -208,7 +214,7 @@ First, enable the community repository; [see here](https://wiki.alpinelinux.org/
|
||||||
# Enable the community repository
|
# Enable the community repository
|
||||||
setup-apkrepos -c
|
setup-apkrepos -c
|
||||||
# Install
|
# Install
|
||||||
apk add g++ git cmake make mesa-dev qt6-qtbase-dev qt6-qtbase-private-dev libquazip1-qt6 ffmpeg-dev qt6-charts-dev libusb-dev libtool boost-dev sdl2-dev zstd-dev vulkan-utility-libraries spirv-tools-dev openssl-dev nlohmann-json lz4-dev opus-dev jq patch
|
apk add g++ git cmake make mesa-dev qt6-qtbase-dev qt6-qtbase-private-dev libquazip1-qt6 ffmpeg-dev qt6-charts-dev libusb-dev libtool boost-dev sdl3-dev zstd-dev vulkan-utility-libraries spirv-tools-dev openssl-dev nlohmann-json lz4-dev opus-dev jq patch
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
@ -216,7 +222,7 @@ apk add g++ git cmake make mesa-dev qt6-qtbase-dev qt6-qtbase-private-dev libqua
|
||||||
<summary>Void Linux</summary>
|
<summary>Void Linux</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
xbps-install -Su git make cmake clang pkg-config patch SPIRV-Tools-devel SPIRV-Headers lz4 liblz4-devel boost-devel ffmpeg6-devel catch2 Vulkan-Utility-Libraries Vulkan-Headers glslang openssl-devel SDL2-devel quazip-qt6-devel qt6-base-devel qt6-qt5compat-devel qt6-charts-devel fmt-devel json-c++ libenet-devel libusb-devel
|
xbps-install -Su git make cmake clang pkg-config patch SPIRV-Tools-devel SPIRV-Headers lz4 liblz4-devel boost-devel ffmpeg6-devel catch2 Vulkan-Utility-Libraries Vulkan-Headers glslang openssl-devel SDL3-devel quazip-qt6-devel qt6-base-devel qt6-qt5compat-devel qt6-charts-devel fmt-devel json-c++ libenet-devel libusb-devel
|
||||||
```
|
```
|
||||||
|
|
||||||
Yes, `nlohmann-json` is just named `json-c++`. Why?
|
Yes, `nlohmann-json` is just named `json-c++`. Why?
|
||||||
|
|
@ -237,7 +243,7 @@ If you're going for a pure build (i.e no downloaded deps), use `-DYUZU_USE_CPM=O
|
||||||
Install dependencies from **[Homebrew](https://brew.sh/)**
|
Install dependencies from **[Homebrew](https://brew.sh/)**
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
brew install autoconf automake boost ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl2 speexdsp zlib zstd cmake Catch2 molten-vk vulkan-loader spirv-tools
|
brew install autoconf automake boost ffmpeg fmt glslang hidapi libtool libusb lz4 ninja nlohmann-json openssl pkg-config qt@6 sdl3 speexdsp zlib zstd cmake Catch2 molten-vk vulkan-loader spirv-tools
|
||||||
```
|
```
|
||||||
|
|
||||||
If you are compiling on Intel Mac, or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` with `/usr/local`.
|
If you are compiling on Intel Mac, or are using a Rosetta Homebrew installation, you must replace all references of `/opt/homebrew` with `/usr/local`.
|
||||||
|
|
@ -254,7 +260,7 @@ brew install molten-vk
|
||||||
<details>
|
<details>
|
||||||
<summary>FreeBSD</summary>
|
<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/qt6-charts devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/unordered-dense vulkan-headers quazip-qt6`
|
As root run: `pkg install devel/cmake sdl3 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/qt6-charts devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/unordered-dense vulkan-headers quazip-qt6`
|
||||||
|
|
||||||
If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
|
If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
|
||||||
|
|
||||||
|
|
@ -264,7 +270,11 @@ If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
|
||||||
<details>
|
<details>
|
||||||
<summary>NetBSD</summary>
|
<summary>NetBSD</summary>
|
||||||
|
|
||||||
For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv-headers spirv-tools ffmpeg7 libva nlohmann-json jq libopus qt6 cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx`.
|
For NetBSD +10.1:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pkgin install git cmake boost fmtlib SDL3 catch2 libjwt spirv-headers spirv-tools ffmpeg7 libva nlohmann-json jq libopus qt6 cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx frozen
|
||||||
|
```
|
||||||
|
|
||||||
[Caveats](./Caveats.md#netbsd).
|
[Caveats](./Caveats.md#netbsd).
|
||||||
|
|
||||||
|
|
@ -274,7 +284,7 @@ For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pkg_add -u
|
pkg_add -u
|
||||||
pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gmake qt6 jq fmt nlohmann-json enet boost vulkan-utility-libraries vulkan-headers spirv-headers spirv-tools catch2 sdl2 libusb1-1.0.29
|
pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gmake qt6 jq fmt nlohmann-json enet boost vulkan-utility-libraries vulkan-headers spirv-headers spirv-tools catch2 sdl3 libusb1-1.0.29 quazip-qt6
|
||||||
```
|
```
|
||||||
|
|
||||||
[Caveats](./Caveats.md#openbsd).
|
[Caveats](./Caveats.md#openbsd).
|
||||||
|
|
@ -284,7 +294,7 @@ pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gm
|
||||||
<summary>DragonFlyBSD</summary>
|
<summary>DragonFlyBSD</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pkg install gcc14 git cmake unzip nasm autoconf bash pkgconf ffmpeg glslang gmake jq nlohmann-json enet spirv-tools sdl2 vulkan-utility-libraries vulkan-headers catch2 libfmt openssl liblz4 boost-libs cpp-httplib qt6-base qt6-charts quazip-qt6 unordered-dense libva-vdpau-driver libva-utils libva-intel-driver
|
pkg install gcc14 git cmake unzip nasm autoconf bash pkgconf ffmpeg glslang gmake jq nlohmann-json enet spirv-tools sdl3 vulkan-utility-libraries vulkan-headers catch2 libfmt openssl liblz4 boost-libs cpp-httplib qt6-base qt6-charts quazip-qt6 unordered-dense libva-vdpau-driver libva-utils libva-intel-driver
|
||||||
```
|
```
|
||||||
|
|
||||||
[Caveats](./Caveats.md#dragonflybsd).
|
[Caveats](./Caveats.md#dragonflybsd).
|
||||||
|
|
@ -294,7 +304,7 @@ pkg install gcc14 git cmake unzip nasm autoconf bash pkgconf ffmpeg glslang gmak
|
||||||
<summary>OpenIndiana</summary>
|
<summary>OpenIndiana</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo pkg install git cmake 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
|
sudo pkg install git cmake qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl opus sdl3 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt
|
||||||
```
|
```
|
||||||
|
|
||||||
[Caveats](./Caveats.md#openindiana).
|
[Caveats](./Caveats.md#openindiana).
|
||||||
|
|
@ -318,7 +328,7 @@ sudo pkgin install git cmake autoconf build-essential libusb-1 nasm gcc13
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
BASE="git make autoconf libtool automake-wrapper jq patch"
|
BASE="git make autoconf libtool automake-wrapper jq patch"
|
||||||
MINGW="qt6-base qt6-charts qt6-tools qt6-translations qt6-svg cmake toolchain clang python-pip openssl vulkan-memory-allocator vulkan-devel glslang boost fmt lz4 nlohmann-json zlib zstd enet opus libusb unordered_dense openssl SDL2"
|
MINGW="qt6-base qt6-charts qt6-tools qt6-translations qt6-svg cmake toolchain clang python-pip openssl vulkan-memory-allocator vulkan-devel glslang boost fmt lz4 nlohmann-json zlib zstd enet opus libusb unordered_dense openssl SDL3"
|
||||||
# Either x86_64 or clang-aarch64 (Windows on ARM)
|
# Either x86_64 or clang-aarch64 (Windows on ARM)
|
||||||
packages="$BASE"
|
packages="$BASE"
|
||||||
for pkg in $MINGW; do
|
for pkg in $MINGW; do
|
||||||
|
|
@ -344,7 +354,7 @@ pacman -Syuu --needed --noconfirm $packages
|
||||||
<summary>HaikuOS</summary>
|
<summary>HaikuOS</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.90_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel
|
pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.90_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl3_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel glslang qt6_devel qt6_charts_devel cubeb_devel simpleini quazip_qt6_devel
|
||||||
```
|
```
|
||||||
|
|
||||||
[Caveats](./Caveats.md#haikuos).
|
[Caveats](./Caveats.md#haikuos).
|
||||||
|
|
@ -355,9 +365,11 @@ pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel b
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo pkg update
|
sudo pkg update
|
||||||
sudo pkg install git cmake ffmpeg6 sdl2 zlib llvm18
|
sudo pkg install git cmake ffmpeg6 zlib llvm18
|
||||||
```
|
```
|
||||||
|
|
||||||
|
RedoxOS currently does not support SDL3. You will have to compile it yourself and pray.
|
||||||
|
|
||||||
[Caveats](./Caveats.md#redoxos).
|
[Caveats](./Caveats.md#redoxos).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
||||||
31
docs/HosKernel.md
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
# HOS Kernel
|
||||||
|
|
||||||
|
In brief, the HOS kernel is a microkernel, all services and programs run in userspace, the primary way to do communication between these is via `HIPC` (not covered here); otherwise most of the primitives reside in the forms of syscalls invoked via `svc #imm`. The kernel supports both 32-bit and 64-bit programs, and has the capacity to use 32, 36 and 39 bits of address space for spawned processes. Most of the networking stack is based off FreeBSD's network stack.
|
||||||
|
|
||||||
|
The emulator implements the majority of the syscalls pertaining to the HOS kernel itself. When we talk about the HOS Kernel (in the context of the emulator) we are strictly speaking about the mechanisms from which syscalls are handled (and it's subsequent side effects, such as the page table book-keeping). The emulator at it's current state is unable to load a custom low-level kernel and do supervisor-level emulation.
|
||||||
|
|
||||||
|
Most programs in NX eventually invoke an `svc`, which, depending on it's immediate value, will go on to be dispatched into one of the specific syscall handlers.
|
||||||
|
|
||||||
|
These can be seen in [svc.cpp](/src/core/hle/kernel/svc.cpp). All of these correspond to syscalls which userspace programs may perform.
|
||||||
|
|
||||||
|
In turn, these syscalls create the mechanisms that allows programs to use CMIF/TIPC as their primary IPC form to contact other services/processes running on the system, the details of which will not be covered here, but you can consult the relevant [SwitchBrew article: 'HIPC'](https://switchbrew.org/wiki/HIPC).
|
||||||
|
|
||||||
|
From the point of view of the programs, no special devices (such as PCIE, Realtek drivers, Bluetooth or USB) has to be handled by the emulator; this is because most of the fun occurs in specialized services such as `usb:u` or `pcie` services. Which aren't emulated (yet).
|
||||||
|
|
||||||
|
Due to the nature of syscalls, many of them interact with memory. The emulated kernel has an internal tree-like structure, borrowed from FreeBSD's intrusive red-black tree; this is used to track and find mappings added or removed. Thus most of the process space is emulated in this way.
|
||||||
|
|
||||||
|
The kernel keeps it's own separate pagetable, in a traditional sense, each process has it's own pagetable, this is true for HOS as well.
|
||||||
|
|
||||||
|
Every process keeps it's own tracking of the following structures:
|
||||||
|
- Name (13 characters)
|
||||||
|
- 64-bit ID
|
||||||
|
- A handle table
|
||||||
|
- Exclusive monitor
|
||||||
|
- Threads
|
||||||
|
- Held locks
|
||||||
|
- Thread local pages
|
||||||
|
- A page table for each process
|
||||||
|
|
||||||
|
The emulator willingly restricts itself to only use 4 threads (to emulate 4 cores), this is because most existing applications do not benefit greatly from the added core count, and in fact can be detrimental due to extra contention. This translates equitatively to about 4 `ArmInterface` slots for each process, these are then redirected to whatever is the last `pc` of the last thread running on the core is meant to be; proceed to run it, then when returning (due to halt or interruption), proceed to reschedule the thread.
|
||||||
|
|
||||||
|
The scheduler as-is isn't 100% faithful to the original (for example the original is cooperative and not preemptive), and has great timing variance (especially due to the fact the emulator can run in systems with wildly different timings).
|
||||||
|
|
@ -853,6 +853,8 @@ Texture Query.
|
||||||
|
|
||||||
Vote Across SIMD Thread Group
|
Vote Across SIMD Thread Group
|
||||||
|
|
||||||
|
`VOTE_vtg` is a kepler leftover.
|
||||||
|
|
||||||
# VSET
|
# VSET
|
||||||
`0100 000- ---- ----`
|
`0100 000- ---- ----`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,8 +29,7 @@ These options control dependencies.
|
||||||
- `YUZU_TZDB_PATH` (string) Path to a pre-downloaded timezone database (useful for nixOS and Gentoo)
|
- `YUZU_TZDB_PATH` (string) Path to a pre-downloaded timezone database (useful for nixOS and Gentoo)
|
||||||
- `YUZU_USE_BUNDLED_MOLTENVK` (ON, macOS only) Download bundled MoltenVK lib
|
- `YUZU_USE_BUNDLED_MOLTENVK` (ON, macOS only) Download bundled MoltenVK lib
|
||||||
- `YUZU_USE_BUNDLED_OPENSSL` (ON for MSVC, Android, Solaris, and OpenBSD) Download bundled OpenSSL build
|
- `YUZU_USE_BUNDLED_OPENSSL` (ON for MSVC, Android, Solaris, and OpenBSD) Download bundled OpenSSL build
|
||||||
- `YUZU_USE_EXTERNAL_SDL2` (OFF) Compiles SDL2 from source
|
- `YUZU_USE_BUNDLED_SDL3` (ON for MSVC) Download a prebuilt SDL3
|
||||||
- `YUZU_USE_BUNDLED_SDL2` (ON for MSVC) Download a prebuilt SDL2
|
|
||||||
|
|
||||||
### Miscellaneous
|
### Miscellaneous
|
||||||
|
|
||||||
|
|
@ -44,6 +43,9 @@ These options control dependencies.
|
||||||
- UNIX may be better off appending `-flto=thin` to compiler args
|
- UNIX may be better off appending `-flto=thin` to compiler args
|
||||||
- `USE_FASTER_LINKER` (OFF) Check if a faster linker is available
|
- `USE_FASTER_LINKER` (OFF) Check if a faster linker is available
|
||||||
- Not recommended outside of Linux
|
- Not recommended outside of Linux
|
||||||
|
- `YUZU_INSTALL_UDEV_RULES` (OFF) Install udev rules to enable hidraw access
|
||||||
|
- Needed for gyroscopes
|
||||||
|
- Only available on Linux
|
||||||
|
|
||||||
### Flavors
|
### Flavors
|
||||||
|
|
||||||
|
|
@ -60,7 +62,7 @@ These options control executables and build flavors.
|
||||||
|
|
||||||
**Desktop only**:
|
**Desktop only**:
|
||||||
|
|
||||||
- `YUZU_CMD` (ON) Compile the SDL2 frontend (eden-cli)
|
- `YUZU_CMD` (ON) Compile the SDL-based frontend (eden-cli)
|
||||||
- `YUZU_ROOM` (OFF) Compile dedicated room functionality into the main executable
|
- `YUZU_ROOM` (OFF) Compile dedicated room functionality into the main executable
|
||||||
- `YUZU_ROOM_STANDALONE` (OFF) Compile a separate executable for room functionality
|
- `YUZU_ROOM_STANDALONE` (OFF) Compile a separate executable for room functionality
|
||||||
- `YUZU_STATIC_ROOM` (OFF) Compile the room executable *only* as a static, portable executable
|
- `YUZU_STATIC_ROOM` (OFF) Compile the room executable *only* as a static, portable executable
|
||||||
|
|
@ -96,5 +98,6 @@ The following options were a part of Eden at one point, but have since been reti
|
||||||
- `ENABLE_SDL2` - While technically possible to *not* use SDL2 on desktop, this is **NOT** a supported configuration under any means, and adding this matrix to our build system was not worth the effort.
|
- `ENABLE_SDL2` - While technically possible to *not* use SDL2 on desktop, this is **NOT** a supported configuration under any means, and adding this matrix to our build system was not worth the effort.
|
||||||
- `YUZU_USE_CPM` - This option once had a purpose, but that purpose has long since passed us by. *All* builds use CPMUtil to manage dependencies now.
|
- `YUZU_USE_CPM` - This option once had a purpose, but that purpose has long since passed us by. *All* builds use CPMUtil to manage dependencies now.
|
||||||
- If you want to *force* the usage of system dependencies, use `-DCPMUTIL_FORCE_SYSTEM=ON`.
|
- If you want to *force* the usage of system dependencies, use `-DCPMUTIL_FORCE_SYSTEM=ON`.
|
||||||
|
- `YUZU_USE_EXTERNAL_SDL` - This is now handled automatically. It was included even after CPM for purposes that have not applied for a very long time.
|
||||||
|
|
||||||
See `src/dynarmic/CMakeLists.txt` for additional options--usually, these don't need changed
|
See `src/dynarmic/CMakeLists.txt` for additional options--usually, these don't need changed
|
||||||
|
|
|
||||||
|
|
@ -2,21 +2,27 @@
|
||||||
|
|
||||||
Are you just a casual user? Take a look at our [User Handbook](./user) then!
|
Are you just a casual user? Take a look at our [User Handbook](./user) then!
|
||||||
|
|
||||||
|
If you want to register/signup as a contributor, take a gander at the [signup guide](./SIGNUP.md).
|
||||||
|
|
||||||
This contains documentation created by developers. This contains build instructions, guidelines, instructions/layouts for [cool stuff we made](./CPMUtil), and more.
|
This contains documentation created by developers. This contains build instructions, guidelines, instructions/layouts for [cool stuff we made](./CPMUtil), and more.
|
||||||
|
|
||||||
- **[General Build Instructions](Build.md)**
|
- **[General Build Instructions](./Build.md)**
|
||||||
- **[CMake Options](Options.md)**
|
- **[CMake Options](./Options.md)**
|
||||||
- **[Cross Compiling](CrossCompile.md)**
|
- **[Cross Compiling](./CrossCompile.md)**
|
||||||
- **[Development Guidelines](Development.md)**
|
- **[Development Guidelines](./Development.md)**
|
||||||
- **[Dependencies](Deps.md)**
|
- **[Dependencies](./Deps.md)**
|
||||||
- **[Debug Guidelines](./Debug.md)**
|
- **[Debug Guidelines](./Debug.md)**
|
||||||
|
- **[RenderDoc usage](./RenderDoc.md)**
|
||||||
- **[CPM - CMake Package Manager](./CPMUtil)**
|
- **[CPM - CMake Package Manager](./CPMUtil)**
|
||||||
- **[Platform-Specific Caveats](Caveats.md)**
|
- **[Platform-Specific Caveats](./Caveats.md)**
|
||||||
- **[The NVIDIA SM86 (Maxwell) GPU](./NvidiaGpu.md)**
|
- **[The NVIDIA SM86 (Maxwell) GPU](./NvidiaGpu.md)**
|
||||||
- **[Dynarmic](./dynarmic)**
|
|
||||||
- **[Cross compilation](./CrossCompile.md)**
|
- **[Cross compilation](./CrossCompile.md)**
|
||||||
- **[Driver Bugs](./DriverBugs.md)**
|
- **[Driver Bugs](./DriverBugs.md)**
|
||||||
- **[Building Older Commits](./build/OlderCommits.md)**
|
- **[Building Older Commits](./build/OlderCommits.md)**
|
||||||
|
- Subsystems:
|
||||||
|
- **[Dynarmic](./dynarmic/README.md)**
|
||||||
|
- **[HOS Kernel](./HosKernel.md)**
|
||||||
|
- **[Settings](./Settings.md)**
|
||||||
|
|
||||||
## Policies
|
## Policies
|
||||||
|
|
||||||
|
|
@ -25,3 +31,12 @@ Policies and information on development.
|
||||||
- **[AI and LLM Usage](./policies/AI.md)**
|
- **[AI and LLM Usage](./policies/AI.md)**
|
||||||
- **[Release Policy](./policies/Release.md)**
|
- **[Release Policy](./policies/Release.md)**
|
||||||
- **[Coding guidelines](./policies/Coding.md)**
|
- **[Coding guidelines](./policies/Coding.md)**
|
||||||
|
- **[Coding Style guidelines](./policies/CodingStyle.md)**
|
||||||
|
|
||||||
|
## Externals
|
||||||
|
|
||||||
|
Other useful resources in general, take a quick read if you need.
|
||||||
|
|
||||||
|
- **[SwitchBrew](https://switchbrew.org/wiki/Main_Page)**
|
||||||
|
- **[IPS file format](https://zerosoft.zophar.net/ips.php)**
|
||||||
|
- **[IPSwitch file format](https://github.com/3096/ipswitch)**
|
||||||
|
|
|
||||||
52
docs/RenderDoc.md
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
# RenderDoc
|
||||||
|
|
||||||
|
Renderdoc is a free, cross platform, multi-graphics API debugger. It is an invaluable tool for diagnosing issues with graphics applications, and includes support for Vulkan. Get it at [renderdoc.org](https://renderdoc.org).
|
||||||
|
|
||||||
|
RenderDoc can capture Eden's Vulkan output when its Vulkan layer is loaded before Eden creates the Vulkan device. Before using renderdoc to diagnose issues, it is always good to make sure there are no validation errors. Any errors means the behavior of the application is undefined. That said, renderdoc can help debug validation errors if you do have them.
|
||||||
|
|
||||||
|
## Usage on Windows
|
||||||
|
|
||||||
|
You can either use RenderDoc UI to launch eden, or you can make eden attach it internally:
|
||||||
|
|
||||||
|
On Windows PowerShell:
|
||||||
|
```powershell
|
||||||
|
$env:ENABLE_VULKAN_RENDERDOC_CAPTURE='1'
|
||||||
|
.\eden.exe
|
||||||
|
```
|
||||||
|
When RenderDoc is attached, Eden logs the default Windows capture folder:
|
||||||
|
```text
|
||||||
|
%LOCALAPPDATA%\Temp\RenderDoc
|
||||||
|
```
|
||||||
|
|
||||||
|
Press RenderDoc's capture hotkey, usually `F12`, to capture a frame. To stop using RenderDoc, close Eden and launch it again without `ENABLE_VULKAN_RENDERDOC_CAPTURE`.
|
||||||
|
|
||||||
|
## Eden Hotkey
|
||||||
|
|
||||||
|
Eden also has a separate `Toggle Renderdoc Capture` hotkey behind the debug setting `renderdoc_hotkey`.
|
||||||
|
That hotkey does not load or unload RenderDoc. It only toggles Eden's own manual capture through RenderDoc's API:
|
||||||
|
|
||||||
|
- first press: starts a capture
|
||||||
|
- second press: ends that capture
|
||||||
|
|
||||||
|
## Simple checklist for debugging black screens using Renderdoc
|
||||||
|
|
||||||
|
When debugging a black screen, there are many ways the application could have setup Vulkan wrong.
|
||||||
|
Here is a short checklist of items to look at to make sure are appropriate:
|
||||||
|
|
||||||
|
- Draw call counts are correct (aka not zero, or if rendering many triangles, not 3)
|
||||||
|
- Vertex buffers are bound
|
||||||
|
- vertex attributes are correct - Make sure the size & offset of each attribute matches what should it should be
|
||||||
|
- Any bound push constants and descriptors have the right data - including:
|
||||||
|
- Matrices have correct values - double check the model, view, & projection matrices are uploaded correctly
|
||||||
|
- Pipeline state is correct
|
||||||
|
- viewport range is correct - x,y are 0,0; width & height are screen dimensions, minDepth is 0, maxDepth is 1, NDCDepthRange is 0,1
|
||||||
|
- Fill mode matches expected - usually solid
|
||||||
|
- Culling mode makes sense - commonly back or none
|
||||||
|
- The winding direction is correct - typically CCW (counter clockwise)
|
||||||
|
- Scissor region is correct - usually same as viewport's x,y,width, &height
|
||||||
|
- Blend state is correct
|
||||||
|
- Depth state is correct - typically enabled with Function set to Less than or Equal
|
||||||
|
- Swapchain images are bound when rendering to the swapchain
|
||||||
|
- Image being rendered to is the same as the one being presented when rendering to the swapchain
|
||||||
|
|
||||||
|
Alternatively, a [RenderDoc Extension](https://github.com/baldurk/renderdoc-contrib/tree/main/baldurk/whereismydraw) ([Archive](https://web.archive.org/web/20250000000000*/https://github.com/baldurk/renderdoc-contrib/tree/main/baldurk/whereismydraw)) exists which automates doing a lot of these manual steps.
|
||||||
327
docs/Settings.md
Normal file
|
|
@ -0,0 +1,327 @@
|
||||||
|
# Settings
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> This guide is intended for developers ONLY. If you're looking for configuring the emulator itself, please read **[the user handbook](./user/README.md)**.
|
||||||
|
|
||||||
|
Settings on the emulator are very important, toggles and such can be used to guard and/or add branches to paths where some games may crash while others won't, and viceversa.
|
||||||
|
|
||||||
|
However, this process can be tedious for those unfamiliar; this document serves as a outline/documentation for the settings subsystem.
|
||||||
|
|
||||||
|
## Index
|
||||||
|
|
||||||
|
* [Adding Debug Knobs](#adding-debug-knobs)
|
||||||
|
* [Advantages](#advantages)
|
||||||
|
* [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)
|
||||||
|
* [Terminology and user communication](#terminology-and-user-communication)
|
||||||
|
* [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)
|
||||||
|
* [Best Practices](#best-practices)
|
||||||
|
* [Adding Boolean Settings Toggles](#adding-boolean-settings-toggles)
|
||||||
|
* [Step 1 - Common Setting](#step-1-common-setting)
|
||||||
|
* [Step 2 - Qt Toggle](#step-2-qt-toggle)
|
||||||
|
* [Step 3 - Kotlin (Android)](#step-3-kotlin-android)
|
||||||
|
* [Step 3.1 - BooleanSetting.kt](#step-3-1-booleansetting-kt)
|
||||||
|
* [Step 3.2 - SettingsItem.kt](#step-3-2-settingsitem-kt)
|
||||||
|
* [Step 3.3 - SettingsFragmentPresenter.kt](#step-3-3-settingsfragmentpresenter-kt)
|
||||||
|
* [Step 3.4 - Localization](#step-3-4-localization)
|
||||||
|
* [Step 4 - Use Your Toggle](#step-4-use-your-toggle)
|
||||||
|
* [Best Practices](#best-practices)
|
||||||
|
|
||||||
|
## Adding Boolean Settings Toggles
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 1 - Common Setting
|
||||||
|
|
||||||
|
Firstly add your desired toggle:
|
||||||
|
|
||||||
|
Example: `src/common/setting.h`
|
||||||
|
```cpp
|
||||||
|
SwitchableSetting<bool> your_setting_name{linkage, false, "your_setting_name", Category::RendererExtensions};
|
||||||
|
```
|
||||||
|
|
||||||
|
Remember to add your toggle to the appropriate category, for example:
|
||||||
|
|
||||||
|
Common Categories:
|
||||||
|
|
||||||
|
* Category::Renderer
|
||||||
|
* Category::RendererAdvanced
|
||||||
|
* Category::RendererExtensions
|
||||||
|
* Category::System
|
||||||
|
* Category::Core
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> If you wish for your toggle to be `on by default` then change `false` to `true` after `linkage,`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 2 - Qt Toggle
|
||||||
|
|
||||||
|
Add the toggle to the Qt UI, where you wish for it to appear and place it there.
|
||||||
|
|
||||||
|
Example: `src/qt_common/config/shared_translation.cpp`
|
||||||
|
```cpp
|
||||||
|
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
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Step 3 - Kotlin (Android)
|
||||||
|
|
||||||
|
#### Step 3.1 - BooleanSetting.kt
|
||||||
|
|
||||||
|
Add where it should be in the settings.
|
||||||
|
|
||||||
|
Example: `src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt`
|
||||||
|
```kts
|
||||||
|
RENDERER_YOUR_SETTING_NAME("your_setting_name"),
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Make sure to:
|
||||||
|
|
||||||
|
* Ensure the prefix naming matches the intended category.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Step 3.2 - SettingsItem.kt
|
||||||
|
|
||||||
|
Add the toggle to the Kotlin (Android) UI
|
||||||
|
|
||||||
|
Example: `src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt`
|
||||||
|
```kts
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.RENDERER_YOUR_SETTING_NAME,
|
||||||
|
titleId = R.string.your_setting_name,
|
||||||
|
descriptionId = R.string.your_setting_name_description
|
||||||
|
)
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Step 3.3 - SettingsFragmentPresenter.kt
|
||||||
|
|
||||||
|
Add your setting within the right category.
|
||||||
|
|
||||||
|
Example: `src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt`
|
||||||
|
```kts
|
||||||
|
add(BooleanSetting.RENDERER_YOUR_SETTING_NAME.key)
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!WARNING]
|
||||||
|
> Remember, placing matters! Settings appear in the order of where you add them.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Step 3.4 - Localization
|
||||||
|
|
||||||
|
Add your setting and description in the appropriate place.
|
||||||
|
|
||||||
|
Example: `src/android/app/src/main/res/values/strings.xml`
|
||||||
|
```xml
|
||||||
|
<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 4 - 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:
|
||||||
|
```cpp
|
||||||
|
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!
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 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
|
||||||
|
//cpp side
|
||||||
|
#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);
|
||||||
|
```
|
||||||
|
|
||||||
|
```kts
|
||||||
|
//kotlin side
|
||||||
|
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
||||||
|
|
||||||
|
// Check if bit x is set
|
||||||
|
bool feature_enabled = Settings.getDebugKnobAt(x); //x as integer from 0 to 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)
|
||||||
|
|
||||||
|
### Terminology and user communication
|
||||||
|
|
||||||
|
There are two main confusions when talking about knobs:
|
||||||
|
|
||||||
|
#### Whether it's zero-based or one-based
|
||||||
|
|
||||||
|
Sometimes when an user reports: knobs 1 and 2 gets better performance, dev may get confuse whether he means the knobs 1 and 2 literally, or the 1st and 2nd knobs (knobs 0 and 1).
|
||||||
|
|
||||||
|
Debug knobs are **zero-based**, which means:
|
||||||
|
* The first knob is the knob(0) (or knob0 henceforth), and the last one is the 15 (knob15, likewise)
|
||||||
|
* You can talk: "knob0 is enabled/disabled", "In this video i was using only knobs 0 and 2", etc.
|
||||||
|
|
||||||
|
#### Whether one is talking about the knob itself or about the entire parameter value (which represents all knobs)
|
||||||
|
|
||||||
|
Sometimes when an user reports: knob 3 results, it's unclear whether he's referring to knob setting with value 3 (which means both knob 0 and 1 are enabled), or to knob(3) specifically.
|
||||||
|
Whenever you're instructing tests or reporting results, be precise about whether one you're talking to avoid confusion:
|
||||||
|
|
||||||
|
#### Setting based terminology
|
||||||
|
|
||||||
|
ALWAYS use the word in PLURAL (knobs), without mentioning which one, to refer to the setting, aka multiple knobs at once:
|
||||||
|
Examples:
|
||||||
|
- **knobs=0**: no knobs enabled
|
||||||
|
- **knobs=1**: knob0 enabled, others disabled
|
||||||
|
- **knobs=2**: knob1 enabled, others disabled
|
||||||
|
- **knobs=3**: knobs 0 and 1 enabled, others disabled
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
#### Knob based terminology
|
||||||
|
|
||||||
|
Use the word in SINGULAR (knob), or in plural but referring which ones, when meaning multiple knobs at once:
|
||||||
|
Examples:
|
||||||
|
- **knob0**: knob 0 enabled, others disabled
|
||||||
|
- **knob1**: knob 1 enabled, others disabled
|
||||||
|
- **knobs 0 and 1**: knobs 0 and 1 enabled, others disabled
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
### 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
|
||||||
|
|
@ -1,126 +1,70 @@
|
||||||
# Coding guidelines
|
# Coding guidelines
|
||||||
|
|
||||||
These are mostly "suggestions", if you feel like your code is readable, comprehensible to others; and most importantly doesn't result in unreadable spaghetti you're fine to go.
|
These are **not** stylistic guidelines, they're, for the most part, suggestions on how to architecture new systems or improve upon the existing codebase.
|
||||||
|
|
||||||
But for new developers you may find that following these guidelines will make everything x10 easier.
|
# Foreword
|
||||||
|
|
||||||
## Naming conventions
|
Don't try to micro-optimize out of the get go, while yes, most of the code is pretty, subpar, most of these are aftertoughts and details that can be glossed over **generally**.
|
||||||
|
|
||||||
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`.
|
Architectural issues are more important, for example an API returning a `std::string` is not as efficient as one that operates on `std::string_view` directly (cost of constructing an `std::string` w/o small-string optimization and all of that).
|
||||||
|
|
||||||
Except for Qt MOC where `functionName` is preferred.
|
Regardless of the details, try to keep things simple. As a general rule of thumb.
|
||||||
|
|
||||||
Template typenames prefer short names like `T`, `I`, `U`, if a longer name is required either `Iterator` or `perform_action` are fine as well. Do not use names like `SS` as systems like solaris define it for registers, in general do not use any of the following for short names:
|
# C++ guidelines
|
||||||
|
|
||||||
- `SS`, `DS`, `GS`, `FS`: Segment registers, defined by Solaris `<ucontext.h>`
|
Everyone has their own way of viewing good/bad C++ practices, my general outline:
|
||||||
- `EAX`, `EBX`, `ECX`, `EDX`, `ESI`, `EDI`, `ESP`, `EBP`, `EIP`: Registers, defined by Solaris.
|
|
||||||
- `X`: Defined by some utility headers, avoid.
|
|
||||||
- `_`: Defined by gettext, avoid.
|
|
||||||
- `N`, `M`, `S`: Preferably don't use this for types, use it for numeric constants.
|
|
||||||
- `TR`: Used by some weird `<ucontext.h>` whom define the Task Register as a logical register to provide to the user... (Need to remember which OS in specific).
|
|
||||||
|
|
||||||
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`.
|
- At your disposal you may use `boost::container::static_vector<>` (beware it has a ctor/initialization cost which goes up the more elements you add).
|
||||||
|
- Or you may use `boost::container::small_vector<>` (which has an initialization cost as well, and will use extra book-keeping for heap, try to keep a balance).
|
||||||
|
- Don't use `[[likely]]` or `[[unlikely]]`; PGO builds exist for that.
|
||||||
|
- Don't use inline assembly to try to outsmart the compiler unless you're 100% sure the assembly you're writing is actually good.
|
||||||
|
- And if so, try to restructure your C++ code so the compiler vectorizes it/makes it better, right?
|
||||||
|
- Or if that fails, use intrinsics instead of raw `asm volatile`.
|
||||||
|
- Use `std::optional<>` instead of `std::unique_ptr<>` if possible.
|
||||||
|
- `std::unique_ptr<>` carries indirection cost due to it being memory allocated on the heap.
|
||||||
|
- It isn't often that objects that contain `std::unique_ptr<>`, are allocated on the heap themselves, allocating even more things on the heap seems redundant.
|
||||||
|
- Avoid `std::recursive_mutex` at all costs.
|
||||||
|
- It's basically implemented as a linked list most of the time and has HEAVY performance penalties.
|
||||||
|
- Exploit the fact `std::atomic<uint32_t>/std::atomic<int32_t>` is basically free on most arches that matter.
|
||||||
|
- In x86_64, an atomic `uint32_t` is basically `mov [m32], r32`, which is essentially free/cheap.
|
||||||
|
- Avoid template parameters unless you really need them.
|
||||||
|
- For small inlineable functions this is fine, for more complex ones, please consider the generated assembly.
|
||||||
|
- Dont make your own memcpy/memset/strcpy/strncpy/etc.
|
||||||
|
- Seriously DON'T DO THIS. You will NOT beat the compiler.
|
||||||
|
- Nor 30 years of writing optimized `mem*`.
|
||||||
|
- If your code is slow, don't blame `mem*`, blame your code.
|
||||||
|
- Try to avoid using `virtual` since vtable indirection has a cost
|
||||||
|
- Avoid `dynamic_cast` and `typeid` at all costs.
|
||||||
|
- The reason is because the project has `-fno-rtti` disabled by default, due to the costs of dynamic polymorphism.
|
||||||
|
- Always copy-on-value for objects with `sizeof(void *) >= sizeof(T) * 2`, i.e objects sized as 2 pointers or less, for bigger objects you can use ref/pointer as usual.
|
||||||
|
- Try using move semantics instead of references, whenever possible.
|
||||||
|
- Remember function parameters are extremelly cheap as fuck, don't be afraid to place upto 8 parameters on a given function.
|
||||||
|
- Don't save a reference in structures of a parent object, i.e:
|
||||||
|
```c++
|
||||||
|
struct Child {
|
||||||
|
Parent& parent;
|
||||||
|
void Mehod() {
|
||||||
|
parent.Something();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
- Instead you can do the following:
|
||||||
|
```c++
|
||||||
|
struct Child {
|
||||||
|
void Mehod(Parent& parent) {
|
||||||
|
parent.Something();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
```
|
||||||
|
- This reduces the amount of pointers you have lying around, and also works better because of the aforementioned cheapness of parameter functions.
|
||||||
|
|
||||||
Try not using hungarian notation, if you're able.
|
# Engineering guidelines
|
||||||
|
|
||||||
## Formatting
|
Coding isn't also writing stuff but architecturing stuff, consider the following:
|
||||||
|
|
||||||
Formatting is extremelly lax, the general rule of thumb is: Don't add new lines just to increase line count. The less lines we have to look at, the better. This means also packing densely your code while not making it a clusterfuck. Strike a balance of "this is a short and comprehensible piece of code" and "my eyes are actually happy to see this!". Don't just drop the entire thing in a single line and call it "dense code", that's just spaghetti posing as code. In general, be mindful of what other devs need to look at.
|
- Try to reduce dependency on... dependencies
|
||||||
|
- While some dependencies are useful `boost::container` and `fmt` to name a few, remember each dependency added incurs a cost.
|
||||||
Do not put if/while/etc braces after lines:
|
- It may also be subpar with a hand rolled implementation, biggest exemplar of this is `spirv-tools` providing subpar SPIRV optimizations in comparison to the in-house optimizer.
|
||||||
|
- Try to rely less on indirection for architecturing systems
|
||||||
```c++
|
- If the underlying HLE kernel emulation requires it, try making a solution that keeps things local
|
||||||
// no dont do this
|
- For example, there isn't a need for file descriptors to each be a pointer, when they could be a fixed table size with elements that may be emplaced at will.
|
||||||
// this is more lines of code for no good reason (why braces need their separate lines?)
|
|
||||||
// and those take space in someone's screen, cumulatively
|
|
||||||
if (thing)
|
|
||||||
{ //<--
|
|
||||||
some(); // ...
|
|
||||||
} //<-- 2 lines of code for basically "opening" and "closing" an statment
|
|
||||||
|
|
||||||
// do this
|
|
||||||
if (thing) { //<-- [...] and with your brain you can deduce it's this piece of code
|
|
||||||
// that's being closed
|
|
||||||
some(); // ...
|
|
||||||
} //<-- only one line, and it's clearer since you know its closing something [...]
|
|
||||||
|
|
||||||
// or this, albeit the extra line isn't needed (at your discretion of course)
|
|
||||||
if (thing)
|
|
||||||
some(); // ...
|
|
||||||
|
|
||||||
// this is also ok, keeps things in one line and makes it extremely clear
|
|
||||||
if (thing) some();
|
|
||||||
|
|
||||||
// NOT ok, don't be "clever" and use the comma operator to stash a bunch of statments
|
|
||||||
// in a single line, doing this will definitely ruin someone's day - just do the thing below
|
|
||||||
// vvv
|
|
||||||
if (thing) some(), thing(), a2(a1(), y1(), j1()), do_complex_shit(wa(), wo(), ploo());
|
|
||||||
// ... and in general don't use the comma operator for "multiple statments", EXCEPT if you think
|
|
||||||
// that it makes the code more readable (the situation may be rare however)
|
|
||||||
|
|
||||||
// Wow so much clearer! Now I can actually see what each statment is meant to do!
|
|
||||||
if (thing) {
|
|
||||||
some();
|
|
||||||
thing();
|
|
||||||
a2(a1(), y1(), j1());
|
|
||||||
do_complex_shit(wa(), wo(), ploo());
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Brace rules are lax, if you can get the point across, do it:
|
|
||||||
|
|
||||||
```c++
|
|
||||||
// this is fine
|
|
||||||
do {
|
|
||||||
if (thing) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} while (other);
|
|
||||||
|
|
||||||
// this is also ok --- albeit a bit more dense
|
|
||||||
do if (thing) return 0; while (other);
|
|
||||||
|
|
||||||
// ok as well
|
|
||||||
do {
|
|
||||||
if (thing) return 0;
|
|
||||||
} while (other);
|
|
||||||
```
|
|
||||||
|
|
||||||
There is no 80-column limit but preferably be mindful of other developer's readability (like don't just put everything onto one line).
|
|
||||||
|
|
||||||
```c++
|
|
||||||
// someone is going to be mad due to this
|
|
||||||
SDL_AudioSpec obtained;
|
|
||||||
device_name.empty() ? device = SDL_OpenAudioDevice(nullptr, capture, &spec, &obtained, false) : device = SDL_OpenAudioDevice(device_name.c_str(), capture, &spec, &obtained, false);
|
|
||||||
|
|
||||||
// maybe consider this
|
|
||||||
SDL_AudioSpec obtained;
|
|
||||||
if (device_name.empty()) {
|
|
||||||
device = SDL_OpenAudioDevice(nullptr, capture, &spec, &obtained, false);
|
|
||||||
} else {
|
|
||||||
device = SDL_OpenAudioDevice(device_name.c_str(), capture, &spec, &obtained, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// or this is fine as well
|
|
||||||
SDL_AudioSpec obtained;
|
|
||||||
device = SDL_OpenAudioDevice(device_name.empty() ? nullptr : device_name.c_str(), capture, &spec, &obtained, false);
|
|
||||||
```
|
|
||||||
|
|
||||||
A note about operators: Use them sparingly, yes, the language is lax on them, but some usages can be... tripping to say the least.
|
|
||||||
|
|
||||||
```c++
|
|
||||||
a, b, c; //<-- NOT OK multiple statments with comma operator is definitely a recipe for disaster
|
|
||||||
return c ? a : b; //<-- OK ternaries at end of return statments are clear and fine
|
|
||||||
return a, b; //<-- NOT OK return will take value of `b` but also evaluate `a`, just use a separate statment
|
|
||||||
void f(int a[]) //<-- OK? if you intend to use the pointer as an array, otherwise just mark it as *
|
|
||||||
```
|
|
||||||
|
|
||||||
And about templates, use them sparingly, don't just do meta-templating for the sake of it, do it when you actually need it. This isn't a competition to see who can make the most complicated and robust meta-templating system. Just use what works, and preferably stick to the standard libary instead of reinventing the wheel. Additionally:
|
|
||||||
|
|
||||||
```c++
|
|
||||||
// NOT OK This will create (T * N * C * P) versions of the same function. DO. NOT. DO. THIS.
|
|
||||||
template<typename T, size_t N, size_t C, size_t P> inline void what() const noexcept;
|
|
||||||
|
|
||||||
// OK use parameters like a normal person, don't be afraid to use them :)
|
|
||||||
template<typename T> inline void what(size_t n, size_t c, size_t p) const noexcept;
|
|
||||||
```
|
|
||||||
|
|
|
||||||
126
docs/policies/CodingStyle.md
Normal file
|
|
@ -0,0 +1,126 @@
|
||||||
|
# Coding Style guidelines
|
||||||
|
|
||||||
|
These are mostly "suggestions", if you feel like your code is readable, comprehensible to others; and most importantly doesn't result in unreadable spaghetti you're fine to go.
|
||||||
|
|
||||||
|
But for new developers you may find that following these guidelines will make everything x10 easier.
|
||||||
|
|
||||||
|
## Naming conventions
|
||||||
|
|
||||||
|
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. Do not use names like `SS` as systems like solaris define it for registers, in general do not use any of the following for short names:
|
||||||
|
|
||||||
|
- `SS`, `DS`, `GS`, `FS`: Segment registers, defined by Solaris `<ucontext.h>`
|
||||||
|
- `EAX`, `EBX`, `ECX`, `EDX`, `ESI`, `EDI`, `ESP`, `EBP`, `EIP`: Registers, defined by Solaris.
|
||||||
|
- `X`: Defined by some utility headers, avoid.
|
||||||
|
- `_`: Defined by gettext, avoid.
|
||||||
|
- `N`, `M`, `S`: Preferably don't use this for types, use it for numeric constants.
|
||||||
|
- `TR`: Used by some weird `<ucontext.h>` whom define the Task Register as a logical register to provide to the user... (Need to remember which OS in specific).
|
||||||
|
|
||||||
|
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`.
|
||||||
|
|
||||||
|
Try not using hungarian notation, if you're able.
|
||||||
|
|
||||||
|
## Formatting
|
||||||
|
|
||||||
|
Formatting is extremelly lax, the general rule of thumb is: Don't add new lines just to increase line count. The less lines we have to look at, the better. This means also packing densely your code while not making it a clusterfuck. Strike a balance of "this is a short and comprehensible piece of code" and "my eyes are actually happy to see this!". Don't just drop the entire thing in a single line and call it "dense code", that's just spaghetti posing as code. In general, be mindful of what other devs need to look at.
|
||||||
|
|
||||||
|
Do not put if/while/etc braces after lines:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// no dont do this
|
||||||
|
// this is more lines of code for no good reason (why braces need their separate lines?)
|
||||||
|
// and those take space in someone's screen, cumulatively
|
||||||
|
if (thing)
|
||||||
|
{ //<--
|
||||||
|
some(); // ...
|
||||||
|
} //<-- 2 lines of code for basically "opening" and "closing" an statment
|
||||||
|
|
||||||
|
// do this
|
||||||
|
if (thing) { //<-- [...] and with your brain you can deduce it's this piece of code
|
||||||
|
// that's being closed
|
||||||
|
some(); // ...
|
||||||
|
} //<-- only one line, and it's clearer since you know its closing something [...]
|
||||||
|
|
||||||
|
// or this, albeit the extra line isn't needed (at your discretion of course)
|
||||||
|
if (thing)
|
||||||
|
some(); // ...
|
||||||
|
|
||||||
|
// this is also ok, keeps things in one line and makes it extremely clear
|
||||||
|
if (thing) some();
|
||||||
|
|
||||||
|
// NOT ok, don't be "clever" and use the comma operator to stash a bunch of statments
|
||||||
|
// in a single line, doing this will definitely ruin someone's day - just do the thing below
|
||||||
|
// vvv
|
||||||
|
if (thing) some(), thing(), a2(a1(), y1(), j1()), do_complex_shit(wa(), wo(), ploo());
|
||||||
|
// ... and in general don't use the comma operator for "multiple statments", EXCEPT if you think
|
||||||
|
// that it makes the code more readable (the situation may be rare however)
|
||||||
|
|
||||||
|
// Wow so much clearer! Now I can actually see what each statment is meant to do!
|
||||||
|
if (thing) {
|
||||||
|
some();
|
||||||
|
thing();
|
||||||
|
a2(a1(), y1(), j1());
|
||||||
|
do_complex_shit(wa(), wo(), ploo());
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Brace rules are lax, if you can get the point across, do it:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// this is fine
|
||||||
|
do {
|
||||||
|
if (thing) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
} while (other);
|
||||||
|
|
||||||
|
// this is also ok --- albeit a bit more dense
|
||||||
|
do if (thing) return 0; while (other);
|
||||||
|
|
||||||
|
// ok as well
|
||||||
|
do {
|
||||||
|
if (thing) return 0;
|
||||||
|
} while (other);
|
||||||
|
```
|
||||||
|
|
||||||
|
There is no 80-column limit but preferably be mindful of other developer's readability (like don't just put everything onto one line).
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// someone is going to be mad due to this
|
||||||
|
SDL_AudioSpec obtained;
|
||||||
|
device_name.empty() ? device = SDL_OpenAudioDevice(nullptr, capture, &spec, &obtained, false) : device = SDL_OpenAudioDevice(device_name.c_str(), capture, &spec, &obtained, false);
|
||||||
|
|
||||||
|
// maybe consider this
|
||||||
|
SDL_AudioSpec obtained;
|
||||||
|
if (device_name.empty()) {
|
||||||
|
device = SDL_OpenAudioDevice(nullptr, capture, &spec, &obtained, false);
|
||||||
|
} else {
|
||||||
|
device = SDL_OpenAudioDevice(device_name.c_str(), capture, &spec, &obtained, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// or this is fine as well
|
||||||
|
SDL_AudioSpec obtained;
|
||||||
|
device = SDL_OpenAudioDevice(device_name.empty() ? nullptr : device_name.c_str(), capture, &spec, &obtained, false);
|
||||||
|
```
|
||||||
|
|
||||||
|
A note about operators: Use them sparingly, yes, the language is lax on them, but some usages can be... tripping to say the least.
|
||||||
|
|
||||||
|
```c++
|
||||||
|
a, b, c; //<-- NOT OK multiple statments with comma operator is definitely a recipe for disaster
|
||||||
|
return c ? a : b; //<-- OK ternaries at end of return statments are clear and fine
|
||||||
|
return a, b; //<-- NOT OK return will take value of `b` but also evaluate `a`, just use a separate statment
|
||||||
|
void f(int a[]) //<-- OK? if you intend to use the pointer as an array, otherwise just mark it as *
|
||||||
|
```
|
||||||
|
|
||||||
|
And about templates, use them sparingly, don't just do meta-templating for the sake of it, do it when you actually need it. This isn't a competition to see who can make the most complicated and robust meta-templating system. Just use what works, and preferably stick to the standard libary instead of reinventing the wheel. Additionally:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// NOT OK This will create (T * N * C * P) versions of the same function. DO. NOT. DO. THIS.
|
||||||
|
template<typename T, size_t N, size_t C, size_t P> inline void what() const noexcept;
|
||||||
|
|
||||||
|
// OK use parameters like a normal person, don't be afraid to use them :)
|
||||||
|
template<typename T> inline void what(size_t n, size_t c, size_t p) const noexcept;
|
||||||
|
```
|
||||||
|
|
@ -1,159 +0,0 @@
|
||||||
# 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 - Common Setting](#step-1-common-setting)
|
|
||||||
2. [Step 2 - Qt Toggle](#step-2-qt-toggle)
|
|
||||||
3. [Step 3 - Kotlin (Android)](#step-3-kotlin-android)
|
|
||||||
|
|
||||||
* [Step 3.1 - BooleanSetting.kt](#step-3-1-booleansetting-kt)
|
|
||||||
* [Step 3.2 - SettingsItem.kt](#step-3-2-settingsitem-kt)
|
|
||||||
* [Step 3.3 - SettingsFragmentPresenter.kt](#step-3-3-settingsfragmentpresenter-kt)
|
|
||||||
* [Step 3.4 - Localization](#step-3-4-localization)
|
|
||||||
4. [Step 4 - Use Your Toggle](#step-4-use-your-toggle)
|
|
||||||
5. [Best Practices](#best-practices)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Step 1 - Common Setting
|
|
||||||
|
|
||||||
Firstly add your desired toggle:
|
|
||||||
|
|
||||||
Example: `src/common/setting.h`
|
|
||||||
```cpp
|
|
||||||
SwitchableSetting<bool> your_setting_name{linkage, false, "your_setting_name", Category::RendererExtensions};
|
|
||||||
```
|
|
||||||
|
|
||||||
### Remember to add your toggle to the appropriate category, for example:
|
|
||||||
|
|
||||||
Common Categories:
|
|
||||||
|
|
||||||
* Category::Renderer
|
|
||||||
* Category::RendererAdvanced
|
|
||||||
* Category::RendererExtensions
|
|
||||||
* Category::System
|
|
||||||
* Category::Core
|
|
||||||
|
|
||||||
> [!WARNING]
|
|
||||||
> If you wish for your toggle to be `on by default` then change `false` to `true` after `linkage,`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Step 2 - Qt Toggle
|
|
||||||
|
|
||||||
Add the toggle to the Qt UI, where you wish for it to appear and place it there.
|
|
||||||
|
|
||||||
Example: `src/qt_common/config/shared_translation.cpp`
|
|
||||||
```cpp
|
|
||||||
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
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Step 3 - Kotlin (Android)
|
|
||||||
|
|
||||||
### Step 3.1 - BooleanSetting.kt
|
|
||||||
|
|
||||||
Add where it should be in the settings.
|
|
||||||
|
|
||||||
Example: `src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt`
|
|
||||||
```kts
|
|
||||||
RENDERER_YOUR_SETTING_NAME("your_setting_name"),
|
|
||||||
```
|
|
||||||
|
|
||||||
### Make sure to:
|
|
||||||
|
|
||||||
* Ensure the prefix naming matches the intended category.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Step 3.2 - SettingsItem.kt
|
|
||||||
|
|
||||||
Add the toggle to the Kotlin (Android) UI
|
|
||||||
|
|
||||||
Example: `src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt`
|
|
||||||
```kts
|
|
||||||
put(
|
|
||||||
SwitchSetting(
|
|
||||||
BooleanSetting.RENDERER_YOUR_SETTING_NAME,
|
|
||||||
titleId = R.string.your_setting_name,
|
|
||||||
descriptionId = R.string.your_setting_name_description
|
|
||||||
)
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Step 3.3 - SettingsFragmentPresenter.kt
|
|
||||||
|
|
||||||
Add your setting within the right category.
|
|
||||||
|
|
||||||
Example: `src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt`
|
|
||||||
```kts
|
|
||||||
add(BooleanSetting.RENDERER_YOUR_SETTING_NAME.key)
|
|
||||||
```
|
|
||||||
|
|
||||||
> [!WARNING]
|
|
||||||
> Remember, placing matters! Settings appear in the order of where you add them.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Step 3.4 - Localization
|
|
||||||
|
|
||||||
Add your setting and description in the appropriate place.
|
|
||||||
|
|
||||||
Example: `src/android/app/src/main/res/values/strings.xml`
|
|
||||||
```xml
|
|
||||||
<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 4 - 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:
|
|
||||||
```cpp
|
|
||||||
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!
|
|
||||||
|
|
@ -1,167 +0,0 @@
|
||||||
# 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. [Terminology and user communication](#terminology-and-user-communication)
|
|
||||||
4. [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)
|
|
||||||
5. [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
|
|
||||||
//cpp side
|
|
||||||
#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);
|
|
||||||
```
|
|
||||||
|
|
||||||
```kts
|
|
||||||
//kotlin side
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.Settings
|
|
||||||
|
|
||||||
// Check if bit x is set
|
|
||||||
bool feature_enabled = Settings.getDebugKnobAt(x); //x as integer from 0 to 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)
|
|
||||||
|
|
||||||
## Terminology and user communication
|
|
||||||
|
|
||||||
There are two main confusions when talking about knobs:
|
|
||||||
|
|
||||||
### Whether it's zero-based or one-based
|
|
||||||
|
|
||||||
Sometimes when an user reports: knobs 1 and 2 gets better performance, dev may get confuse whether he means the knobs 1 and 2 literally, or the 1st and 2nd knobs (knobs 0 and 1).
|
|
||||||
|
|
||||||
Debug knobs are **zero-based**, which means:
|
|
||||||
* The first knob is the knob(0) (or knob0 henceforth), and the last one is the 15 (knob15, likewise)
|
|
||||||
* You can talk: "knob0 is enabled/disabled", "In this video i was using only knobs 0 and 2", etc.
|
|
||||||
|
|
||||||
### Whether one is talking about the knob itself or about the entire parameter value (which represents all knobs)
|
|
||||||
|
|
||||||
Sometimes when an user reports: knob 3 results, it's unclear whether he's referring to knob setting with value 3 (which means both knob 0 and 1 are enabled), or to knob(3) specifically.
|
|
||||||
Whenever you're instructing tests or reporting results, be precise about whether one you're talking to avoid confusion:
|
|
||||||
|
|
||||||
### Setting based terminology
|
|
||||||
|
|
||||||
ALWAYS use the word in PLURAL (knobs), without mentioning which one, to refer to the setting, aka multiple knobs at once:
|
|
||||||
Examples:
|
|
||||||
- **knobs=0**: no knobs enabled
|
|
||||||
- **knobs=1**: knob0 enabled, others disabled
|
|
||||||
- **knobs=2**: knob1 enabled, others disabled
|
|
||||||
- **knobs=3**: knobs 0 and 1 enabled, others disabled
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
### Knob based terminology
|
|
||||||
|
|
||||||
Use the word in SINGULAR (knob), or in plural but referring which ones, when meaning multiple knobs at once:
|
|
||||||
Examples:
|
|
||||||
- **knob0**: knob 0 enabled, others disabled
|
|
||||||
- **knob1**: knob 1 enabled, others disabled
|
|
||||||
- **knobs 0 and 1**: knobs 0 and 1 enabled, others disabled
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
## 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
|
|
||||||
|
|
@ -40,7 +40,7 @@ Windows/riscv64 doesn't exist, and may never (until corporate greed no longer co
|
||||||
|
|
||||||
Android/riscv64 is interesting. While support for it may be added if and when RISC-V phones/handhelds ever go mainstream, arm64 devices will always be preferred due to NCE.
|
Android/riscv64 is interesting. While support for it may be added if and when RISC-V phones/handhelds ever go mainstream, arm64 devices will always be preferred due to NCE.
|
||||||
|
|
||||||
Only Fedora/riscv64 has been tested, but in theory, every riscv64 distribution that has *at least* the standard build tools, Qt, FFmpeg, and SDL2 should work.
|
Only Fedora/riscv64 has been tested, but in theory, every riscv64 distribution that has *at least* the standard build tools, Qt, FFmpeg, and SDL3 should work.
|
||||||
|
|
||||||
## Other
|
## Other
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,3 +9,11 @@ At the moment of writing, we do not support CFW such as Atmosphere, due to:
|
||||||
We do however, maintain HLE compatibility with the former mentioned CFW, applications that require Atmosphere to run will run fine in the emulator without any adjustments.
|
We do however, maintain HLE compatibility with the former mentioned CFW, applications that require Atmosphere to run will run fine in the emulator without any adjustments.
|
||||||
|
|
||||||
If they don't run - then that's a bug!
|
If they don't run - then that's a bug!
|
||||||
|
|
||||||
|
## Atmosphere
|
||||||
|
|
||||||
|
Fusee Galee, the bootloader and other low-level mechanisms are not emulated at the moment.
|
||||||
|
|
||||||
|
Having OFW is recommended, but may not be required (untested).
|
||||||
|
|
||||||
|
Extract the contents of Atmosphere into `sdmc`. Then to launch simply use `-hlaunch` instead (orthogonal to `-qlaunch`).
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,22 @@
|
||||||
# User Handbook - Command Line
|
# 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.
|
There are two main applications, an SDL-based app (`eden-cli`) and a Qt based app (`eden`); both accept command line arguments.
|
||||||
|
|
||||||
## eden
|
## 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.
|
- `./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.
|
- `-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.
|
- `-f`: Use fullscreen.
|
||||||
- `-u <number>`: Select the index of the user to load as.
|
- `-u <number>`: Select the index of the user to load as.
|
||||||
- `-input-profile <name>`: Specifies input profile name to use (for player #0 only).
|
- `-input-profile <name>`: Specifies input profile name to use (for player #0 only).
|
||||||
- `-qlaunch`: Launch QLaunch.
|
- `-qlaunch`: Launch QLaunch.
|
||||||
|
- `-hlaunch`: Launch homebrew launcher `nx-hbloader`.
|
||||||
|
- Requires a copy of Atmosphere to be extracted onto `sdmc`.
|
||||||
|
- This is a shorthand for `<eden folder>/sdmc/atmosphere/hbl.nsp`.
|
||||||
- `-setup`: Launch setup applet.
|
- `-setup`: Launch setup applet.
|
||||||
|
|
||||||
## eden-cli
|
## eden-cli
|
||||||
|
|
||||||
- `--debug/-d`: Enter debug mode, allow gdb stub at port `1234`
|
- `--debug/-d`: Enter debug mode, allow gdb stub at port `1234`
|
||||||
- `--config/-c`: Specify alternate configuration file.
|
- `--config/-c`: Specify alternate configuration file.
|
||||||
- `--fullscreen/-f`: Set fullscreen.
|
- `--fullscreen/-f`: Set fullscreen.
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,10 @@ Various graphical filters exist - each of them aimed at a specific target/image
|
||||||
- **MMPX**: Nearest-neighbour filter aimed at providing higher pixel-art quality.
|
- **MMPX**: Nearest-neighbour filter aimed at providing higher pixel-art quality.
|
||||||
- **Pros**: Offers decent pixel-art upscaling.
|
- **Pros**: Offers decent pixel-art upscaling.
|
||||||
- **Cons**: Only works for pixel-art.
|
- **Cons**: Only works for pixel-art.
|
||||||
|
- **SGSR**: Uses Snapdragon Studios Game Super Resolution to enhance image quality (similar to FSR, but for Adreno devices).
|
||||||
|
- **Pros**: Optimized for Adreno devices.
|
||||||
|
- **Cons**: Doesn't play nicely with non-Adreno devices.
|
||||||
|
- **SGSR Edge**: Almost the same pipeline as SGSR, but with improved edge detection.
|
||||||
|
|
||||||
### Anisotropy values
|
### Anisotropy values
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
# Multiplayer
|
# User Handbook - Multiplayer
|
||||||
Use this guide to answer questions regarding and to start using the multiplayer functionality of Eden.
|
Use this guide to answer questions regarding and to start using the multiplayer functionality of Eden.
|
||||||
|
|
||||||
## Multiplayer FAQ
|
## Multiplayer FAQ
|
||||||
|
|
|
||||||
|
|
@ -25,12 +25,12 @@ A copy of this handbook is [available online](https://git.eden-emu.dev/eden-emu/
|
||||||
- **[Importing Saves](./ImportingSaves.md)**
|
- **[Importing Saves](./ImportingSaves.md)**
|
||||||
- **[Installing Atmosphere Mods](./InstallingAtmosphereMods.md)**
|
- **[Installing Atmosphere Mods](./InstallingAtmosphereMods.md)**
|
||||||
- **[Installing Updates & DLCs](./InstallingUpdatesDLC.md)**
|
- **[Installing Updates & DLCs](./InstallingUpdatesDLC.md)**
|
||||||
- **[Alter Date & Time](./AlterDateTime.md)**
|
- **[Multiplayer](./Multiplayer.md)**
|
||||||
|
|
||||||
## 3rd-party Integration
|
## 3rd-party Integration
|
||||||
|
|
||||||
- **[Configuring Steam ROM Manager](./SteamROM.md)**
|
- **[Configuring Steam ROM Manager](./SteamROM.md)**
|
||||||
- **[Server hosting](ServerHosting.md)**
|
- **[Server hosting](./ServerHosting.md)**
|
||||||
- **[Syncthing Guide](./SyncthingGuide.md)**
|
- **[Syncthing Guide](./SyncthingGuide.md)**
|
||||||
- **[Third Party](./ThirdParty.md)**
|
- **[Third Party](./ThirdParty.md)**
|
||||||
- **[Obtainium](./ThirdParty.md#configuring-obtainium)**
|
- **[Obtainium](./ThirdParty.md#configuring-obtainium)**
|
||||||
|
|
@ -40,12 +40,13 @@ A copy of this handbook is [available online](https://git.eden-emu.dev/eden-emu/
|
||||||
|
|
||||||
## Advanced
|
## Advanced
|
||||||
|
|
||||||
|
- **[Command Line](./CommandLine.md)**
|
||||||
- **[Custom Firmware](./CFW.md)**
|
- **[Custom Firmware](./CFW.md)**
|
||||||
|
- **[Alter Date & Time](./AlterDateTime.md)**
|
||||||
- **[How To Access Logs](./HowToAccessLogs.md)**
|
- **[How To Access Logs](./HowToAccessLogs.md)**
|
||||||
- **[Gyro Controls](./GyroControls.md)**
|
- **[Gyro Controls](./GyroControls.md)**
|
||||||
- **[Platforms and Architectures](Architectures.md)**
|
- **[Platforms and Architectures](./Architectures.md)**
|
||||||
- **[Command Line](CommandLine.md)**
|
- **[Native Application Development](./Native.md)**
|
||||||
- **[Native Application Development](Native.md)**
|
- **[Adding Boolean Settings Toggles](./AddingBooleanToggles.md)**
|
||||||
- **[Adding Boolean Settings Toggles](AddingBooleanToggles.md)**
|
|
||||||
- **[Adding Debug Knobs](./AddingDebugKnobs.md)**
|
- **[Adding Debug Knobs](./AddingDebugKnobs.md)**
|
||||||
- **[Testing](Testing.md)**
|
- **[Testing](./Testing.md)**
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,6 @@ Before touching the settings, please see the game boots with stock options. We t
|
||||||
|
|
||||||
## CPU
|
## CPU
|
||||||
|
|
||||||
- `CPU/Virtual table bouncing`: Some games have the tendency to crash on loading due to an indirect bad jump (Pokemon ZA being the worst offender); this option lies to the game and tells it to just pretend it never executed a given function. This is fine for most casual users, but developers of switch applications **must** disable this. This temporary "hack" should hopefully be gone in 6-7 months from now on.
|
|
||||||
- `Fastmem`, aka. `CPU/Enable Host MMU`: Enables "fastmem"; a detailed description of fastmem can be found [here](../dynarmic/Design.md#fast-memory-fastmem).
|
- `Fastmem`, aka. `CPU/Enable Host MMU`: Enables "fastmem"; a detailed description of fastmem can be found [here](../dynarmic/Design.md#fast-memory-fastmem).
|
||||||
- `CPU/Unsafe FMA`: Enables deliberate innacurate FMA behaviour which may affect how FMA returns any given operation - this may introduce tiny floating point errors which can cascade in sensitive code (i.e FFmpeg).
|
- `CPU/Unsafe FMA`: Enables deliberate innacurate FMA behaviour which may affect how FMA returns any given operation - this may introduce tiny floating point errors which can cascade in sensitive code (i.e FFmpeg).
|
||||||
- `CPU/Faster FRSQRTE and FRECPE`: Introduces accuracy errors on square root and reciprocals in exchange for less checks - this introduces inaccuracies with some cases but it's mostly safe.
|
- `CPU/Faster FRSQRTE and FRECPE`: Introduces accuracy errors on square root and reciprocals in exchange for less checks - this introduces inaccuracies with some cases but it's mostly safe.
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ EmuDeck will automatically create an *Emulators - Emulators* parser for ***Steam
|
||||||
4. Paste the following code into the contents of the file, save and close the file.
|
4. Paste the following code into the contents of the file, save and close the file.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
#!/bin/bash
|
#!/bin/sh -e
|
||||||
emuName="eden" #parameterize me
|
emuName="eden" #parameterize me
|
||||||
|
|
||||||
. "$HOME/.config/EmuDeck/backend/functions/all.sh"
|
. "$HOME/.config/EmuDeck/backend/functions/all.sh"
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ The main origin repository is always at https://git.eden-emu.dev/eden-emu/eden.
|
||||||
|
|
||||||
- https://github.com/eden-emulator/mirror
|
- https://github.com/eden-emulator/mirror
|
||||||
- https://git.crueter.xyz/mirror/eden
|
- https://git.crueter.xyz/mirror/eden
|
||||||
|
- https://codeberg.org/eden-emu/eden
|
||||||
- https://collective.taymaerz.de/eden/eden
|
- https://collective.taymaerz.de/eden/eden
|
||||||
|
|
||||||
Other mirrors obviously exist on the internet, but we can't guarantee their reliability and/or availability.
|
Other mirrors obviously exist on the internet, but we can't guarantee their reliability and/or availability.
|
||||||
|
|
|
||||||
37
externals/CMakeLists.txt
vendored
|
|
@ -49,8 +49,8 @@ if (NOT TARGET stb::headers)
|
||||||
add_library(stb::headers ALIAS stb)
|
add_library(stb::headers ALIAS stb)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ItaniumDemangle
|
# ItaniumDemangle (Windows only)
|
||||||
if (NOT TARGET LLVM::Demangle)
|
if (WIN32 AND NOT TARGET LLVM::Demangle)
|
||||||
add_library(demangle demangle/ItaniumDemangle.cpp)
|
add_library(demangle demangle/ItaniumDemangle.cpp)
|
||||||
target_include_directories(demangle PUBLIC ./demangle)
|
target_include_directories(demangle PUBLIC ./demangle)
|
||||||
if (NOT MSVC)
|
if (NOT MSVC)
|
||||||
|
|
@ -82,6 +82,11 @@ if (ARCHITECTURE_riscv64)
|
||||||
AddJsonPackage(biscuit)
|
AddJsonPackage(biscuit)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Lagoon
|
||||||
|
if (ARCHITECTURE_loongarch64)
|
||||||
|
AddJsonPackage(lagoon)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Vulkan stuff
|
# Vulkan stuff
|
||||||
AddDependentPackages(vulkan-headers vulkan-utility-libraries)
|
AddDependentPackages(vulkan-headers vulkan-utility-libraries)
|
||||||
|
|
||||||
|
|
@ -136,8 +141,7 @@ if(ENABLE_CUBEB)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT ANDROID)
|
if (NOT ANDROID)
|
||||||
if (YUZU_USE_EXTERNAL_SDL2)
|
if (NOT YUZU_USE_BUNDLED_SDL3)
|
||||||
message(STATUS "Using SDL2 from externals.")
|
|
||||||
if (NOT WIN32)
|
if (NOT WIN32)
|
||||||
# Yuzu itself needs: Atomic Audio Events Joystick Haptic Sensor Threads Timers
|
# Yuzu itself needs: Atomic Audio Events Joystick Haptic Sensor Threads Timers
|
||||||
# Since 2.0.18 Atomic+Threads required for HIDAPI/libusb (see https://github.com/libsdl-org/SDL/issues/5095)
|
# Since 2.0.18 Atomic+Threads required for HIDAPI/libusb (see https://github.com/libsdl-org/SDL/issues/5095)
|
||||||
|
|
@ -158,21 +162,26 @@ if (NOT ANDROID)
|
||||||
set(SDL_FILE ON)
|
set(SDL_FILE ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck")
|
AddJsonPackage(sdl3)
|
||||||
set(SDL_PIPEWIRE OFF) # build errors out with this on
|
else()
|
||||||
AddJsonPackage("sdl2_steamdeck")
|
message(STATUS "Using bundled SDL3")
|
||||||
else()
|
|
||||||
AddJsonPackage("sdl2_generic")
|
|
||||||
endif()
|
|
||||||
elseif (YUZU_USE_BUNDLED_SDL2)
|
|
||||||
message(STATUS "Using bundled SDL2")
|
|
||||||
if (PLATFORM_FREEBSD)
|
if (PLATFORM_FREEBSD)
|
||||||
set(BUILD_SHARED_LIBS ON)
|
set(BUILD_SHARED_LIBS ON)
|
||||||
endif()
|
endif()
|
||||||
AddJsonPackage(sdl2)
|
AddJsonPackage(sdl3-ci)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(SDL2 2.26.4 REQUIRED)
|
# Normalize SDL3 link target across package variants.
|
||||||
|
# Some SDL3 packages export only SDL3::SDL3-shared or SDL3::SDL3-static.
|
||||||
|
if (NOT TARGET SDL3::SDL3)
|
||||||
|
if (TARGET SDL3::SDL3-shared)
|
||||||
|
add_library(SDL3::SDL3 ALIAS SDL3::SDL3-shared)
|
||||||
|
elseif (TARGET SDL3::SDL3-static)
|
||||||
|
add_library(SDL3::SDL3 ALIAS SDL3::SDL3-static)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "SDL3 package found, but no usable SDL3 target was exported")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(BUILD_SHARED_LIBS OFF)
|
set(BUILD_SHARED_LIBS OFF)
|
||||||
|
|
|
||||||
38
externals/cpmfile.json
vendored
|
|
@ -30,7 +30,6 @@
|
||||||
"tag": "v%VERSION%",
|
"tag": "v%VERSION%",
|
||||||
"hash": "5efa8140aadffe105dcf39935b732476e95755f6c7473ada3d0b64df2bc02c557633ae3948a25b45e1cf67e89a3ff6329fb30362e4ac033b9a1d1e453aa2eded",
|
"hash": "5efa8140aadffe105dcf39935b732476e95755f6c7473ada3d0b64df2bc02c557633ae3948a25b45e1cf67e89a3ff6329fb30362e4ac033b9a1d1e453aa2eded",
|
||||||
"git_version": "0.37.0",
|
"git_version": "0.37.0",
|
||||||
"version": "0.18.7",
|
|
||||||
"find_args": "MODULE GLOBAL",
|
"find_args": "MODULE GLOBAL",
|
||||||
"patches": [
|
"patches": [
|
||||||
"0001-mingw.patch",
|
"0001-mingw.patch",
|
||||||
|
|
@ -68,6 +67,12 @@
|
||||||
"tag": "v%VERSION%",
|
"tag": "v%VERSION%",
|
||||||
"hash": "9697e80a7d5d9bcb3ce51051a9a24962fb90ca79d215f1f03ae6b58da8ba13a63b5dda1b4dde3d26ac6445029696b8ef2883f4e5a777b342bba01283ed293856"
|
"hash": "9697e80a7d5d9bcb3ce51051a9a24962fb90ca79d215f1f03ae6b58da8ba13a63b5dda1b4dde3d26ac6445029696b8ef2883f4e5a777b342bba01283ed293856"
|
||||||
},
|
},
|
||||||
|
"lagoon": {
|
||||||
|
"repo": "loongson-community/lagoon",
|
||||||
|
"tag": "%VERSION%",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"hash": "b9380f99c6effaeccc6d8f81d4942e852c11ad28613df637e155451556ae5826f93765bee57a5c87a9740d2bd1db463ad0f55a947772fe9d57eeabae3efa373e"
|
||||||
|
},
|
||||||
"libadrenotools": {
|
"libadrenotools": {
|
||||||
"repo": "eden-emulator/libadrenotools",
|
"repo": "eden-emulator/libadrenotools",
|
||||||
"sha": "8ba23b42d7",
|
"sha": "8ba23b42d7",
|
||||||
|
|
@ -123,13 +128,13 @@
|
||||||
"BUNDLE_SPEEX ON"
|
"BUNDLE_SPEEX ON"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sdl2": {
|
"sdl3-ci": {
|
||||||
"ci": true,
|
"ci": true,
|
||||||
"package": "SDL2",
|
"package": "SDL3",
|
||||||
"name": "SDL2",
|
"name": "SDL3",
|
||||||
"repo": "crueter-ci/SDL2",
|
"repo": "crueter-ci/SDL3",
|
||||||
"version": "2.32.10-3c28e8ecc0",
|
"version": "3.4.8-d57c3b685c",
|
||||||
"min_version": "2.26.4"
|
"min_version": "3.2.10"
|
||||||
},
|
},
|
||||||
"catch2": {
|
"catch2": {
|
||||||
"package": "Catch2",
|
"package": "Catch2",
|
||||||
|
|
@ -157,22 +162,13 @@
|
||||||
"find_args": "MODULE",
|
"find_args": "MODULE",
|
||||||
"git_version": "4.25"
|
"git_version": "4.25"
|
||||||
},
|
},
|
||||||
"sdl2_generic": {
|
"sdl3": {
|
||||||
"package": "SDL2",
|
"package": "SDL3",
|
||||||
"repo": "libsdl-org/SDL",
|
"repo": "libsdl-org/SDL",
|
||||||
"tag": "release-%VERSION%",
|
"tag": "release-%VERSION%",
|
||||||
"hash": "d5622d6bb7266f7942a7b8ad43e8a22524893bf0c2ea1af91204838d9b78d32768843f6faa248757427b8404b8c6443776d4afa6b672cd8571a4e0c03a829383",
|
"hash": "df5a323af7ac366661a3c0e887969c72584d232f3cc211419d59b0487b620b6b2859d4549c9e8df002ee489290062e466fcfddf7edc0872a37b1f2845e81c0f3",
|
||||||
"bundled": true,
|
"git_version": "3.4.8",
|
||||||
"git_version": "2.32.10",
|
"version": "3.2.10"
|
||||||
"skip_updates": true
|
|
||||||
},
|
|
||||||
"sdl2_steamdeck": {
|
|
||||||
"package": "SDL2",
|
|
||||||
"repo": "libsdl-org/SDL",
|
|
||||||
"sha": "cc016b0046",
|
|
||||||
"hash": "b8d9873446cdb922387471df9968e078714683046674ef0d0edddf8e25da65a539a3bae83d635496b970237f90b07b36a69f8d7855d450de59311d6d6e8c3dbc",
|
|
||||||
"bundled": true,
|
|
||||||
"skip_updates": "true"
|
|
||||||
},
|
},
|
||||||
"moltenvk": {
|
"moltenvk": {
|
||||||
"repo": "V380-Ori/Ryujinx.MoltenVK",
|
"repo": "V380-Ori/Ryujinx.MoltenVK",
|
||||||
|
|
|
||||||
27
externals/nx_tzdb/NxTzdbCreateHeader.cmake
vendored
|
|
@ -1,3 +1,6 @@
|
||||||
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
# SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -16,15 +19,24 @@ if (NOT FILE_LIST)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(DIRECTORY_NAME ${HEADER_NAME})
|
set(DIRECTORY_NAME ${HEADER_NAME})
|
||||||
|
|
||||||
set(FILE_DATA "")
|
set(FILE_DATA "")
|
||||||
|
|
||||||
|
string(APPEND FILE_DATA "[[nodiscard]] static inline std::vector<FileSys::VirtualFile> CollectFiles_${DIRECTORY_NAME}() {\n")
|
||||||
|
string(APPEND FILE_DATA [[
|
||||||
|
std::vector<FileSys::VirtualFile> vfs_files;
|
||||||
|
auto const fn = [&](std::string_view name, std::span<const u8> data) {
|
||||||
|
vfs_files.push_back(std::make_shared<FileSys::VectorVfsFile>(
|
||||||
|
std::vector<u8>(data.begin(), data.end()),
|
||||||
|
std::string{name}
|
||||||
|
));
|
||||||
|
};
|
||||||
|
]])
|
||||||
foreach(ZONE_FILE ${FILE_LIST})
|
foreach(ZONE_FILE ${FILE_LIST})
|
||||||
if (ZONE_FILE STREQUAL "\n")
|
if (ZONE_FILE STREQUAL "\n")
|
||||||
continue()
|
continue()
|
||||||
endif()
|
endif()
|
||||||
|
string(APPEND FILE_DATA " {\n")
|
||||||
string(APPEND FILE_DATA "{\"${ZONE_FILE}\",\n{")
|
string(APPEND FILE_DATA " constexpr uint8_t tzdb_data[] = {\n")
|
||||||
|
|
||||||
file(READ ${ZONE_PATH}/${ZONE_FILE} ZONE_DATA HEX)
|
file(READ ${ZONE_PATH}/${ZONE_FILE} ZONE_DATA HEX)
|
||||||
string(LENGTH "${ZONE_DATA}" ZONE_DATA_LEN)
|
string(LENGTH "${ZONE_DATA}" ZONE_DATA_LEN)
|
||||||
foreach(I RANGE 0 ${ZONE_DATA_LEN} 2)
|
foreach(I RANGE 0 ${ZONE_DATA_LEN} 2)
|
||||||
|
|
@ -42,9 +54,12 @@ foreach(ZONE_FILE ${FILE_LIST})
|
||||||
string(APPEND FILE_DATA " ")
|
string(APPEND FILE_DATA " ")
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
string(APPEND FILE_DATA " };\n")
|
||||||
string(APPEND FILE_DATA "}},\n")
|
string(APPEND FILE_DATA " fn(\"${ZONE_FILE}\", tzdb_data);\n")
|
||||||
|
string(APPEND FILE_DATA " }\n")
|
||||||
endforeach()
|
endforeach()
|
||||||
|
string(APPEND FILE_DATA " return vfs_files;\n")
|
||||||
|
string(APPEND FILE_DATA "}\n")
|
||||||
|
|
||||||
file(READ ${NX_TZDB_SOURCE_DIR}/tzdb_template.h.in NX_TZDB_TEMPLATE_H_IN)
|
file(READ ${NX_TZDB_SOURCE_DIR}/tzdb_template.h.in NX_TZDB_TEMPLATE_H_IN)
|
||||||
file(CONFIGURE OUTPUT ${NX_TZDB_INCLUDE_DIR}/nx_tzdb/${HEADER_NAME}.h CONTENT "${NX_TZDB_TEMPLATE_H_IN}")
|
file(CONFIGURE OUTPUT ${NX_TZDB_INCLUDE_DIR}/nx_tzdb/${HEADER_NAME}.h CONTENT "${NX_TZDB_TEMPLATE_H_IN}")
|
||||||
|
|
|
||||||
9
externals/nx_tzdb/tzdb_template.h.in
vendored
|
|
@ -1,3 +1,6 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -9,10 +12,10 @@
|
||||||
|
|
||||||
namespace NxTzdb {
|
namespace NxTzdb {
|
||||||
|
|
||||||
|
// @DIRECTORY_NAME@
|
||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
const static std::map<const char*, const std::vector<uint8_t>> @DIRECTORY_NAME@ =
|
@FILE_DATA@
|
||||||
{
|
|
||||||
@FILE_DATA@};
|
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
} // namespace NxTzdb
|
} // namespace NxTzdb
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
# SPDX-FileCopyrightText: 2015 Citra Emulator Project
|
# SPDX-FileCopyrightText: 2015 Citra Emulator Project
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
@ -10,20 +12,19 @@ paths_to_check="src/ CMakeLists.txt"
|
||||||
|
|
||||||
# If there are whitespace errors, print the offending file names and fail.
|
# If there are whitespace errors, print the offending file names and fail.
|
||||||
if ! git diff --cached --check -- $paths_to_check ; then
|
if ! git diff --cached --check -- $paths_to_check ; then
|
||||||
cat<<END
|
cat<<EOF
|
||||||
|
|
||||||
Error: This commit would contain trailing spaces or tabs, which is against this repo's policy.
|
Error: This commit would contain trailing spaces or tabs, which is against this repo's policy.
|
||||||
Please correct those issues before committing. (Use 'git diff --check' for more details)
|
Please correct those issues before committing. (Use 'git diff --check' for more details)
|
||||||
If you know what you are doing, you can try 'git commit --no-verify' to bypass the check
|
If you know what you are doing, you can try 'git commit --no-verify' to bypass the check
|
||||||
END
|
EOF
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check for tabs, since tab-in-indent catches only those at the beginning of a line
|
# Check for tabs, since tab-in-indent catches only those at the beginning of a line
|
||||||
if git diff --cached -- $paths_to_check | egrep '^\+.* '; then
|
if git diff --cached -- $paths_to_check | egrep '^\+.* '; then
|
||||||
cat<<END
|
cat<<EOF
|
||||||
Error: This commit would contain a tab, which is against this repo's policy.
|
Error: This commit would contain a tab, which is against this repo's policy.
|
||||||
If you know what you are doing, you can try 'git commit --no-verify' to bypass the check.
|
If you know what you are doing, you can try 'git commit --no-verify' to bypass the check.
|
||||||
END
|
EOF
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
6
shell.nix
Normal file → Executable file
|
|
@ -1,3 +1,7 @@
|
||||||
|
#!/usr/bin/nix-shell
|
||||||
|
# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
let
|
let
|
||||||
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.05";
|
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.05";
|
||||||
pkgs = import nixpkgs { config = {}; overlays = []; };
|
pkgs = import nixpkgs { config = {}; overlays = []; };
|
||||||
|
|
@ -16,7 +20,7 @@ pkgs.mkShellNoCC {
|
||||||
qt6.qtbase qt6.qtmultimedia qt6.qtwayland qt6.qttools
|
qt6.qtbase qt6.qtmultimedia qt6.qtwayland qt6.qttools
|
||||||
qt6.qtwebengine qt6.qt5compat
|
qt6.qtwebengine qt6.qt5compat
|
||||||
# eden-cli
|
# eden-cli
|
||||||
SDL2
|
SDL3
|
||||||
# optional components
|
# optional components
|
||||||
discord-rpc gamemode
|
discord-rpc gamemode
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
include_directories(.)
|
include_directories(.)
|
||||||
|
|
||||||
# Dynarmic
|
# Dynarmic
|
||||||
if ((ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64 OR ARCHITECTURE_riscv64) AND NOT YUZU_STATIC_ROOM)
|
if ((ARCHITECTURE_x86_64 OR ARCHITECTURE_arm64 OR ARCHITECTURE_riscv64 OR ARCHITECTURE_loongarch64) AND NOT YUZU_STATIC_ROOM)
|
||||||
add_subdirectory(dynarmic)
|
add_subdirectory(dynarmic)
|
||||||
add_library(dynarmic::dynarmic ALIAS dynarmic)
|
add_library(dynarmic::dynarmic ALIAS dynarmic)
|
||||||
endif()
|
endif()
|
||||||
|
|
@ -21,20 +21,41 @@ if (YUZU_STATIC_BUILD)
|
||||||
add_compile_definitions(QT_STATICPLUGIN)
|
add_compile_definitions(QT_STATICPLUGIN)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Build identifiers
|
||||||
if (NIGHTLY_BUILD)
|
if (NIGHTLY_BUILD)
|
||||||
add_compile_definitions(NIGHTLY_BUILD)
|
add_compile_definitions(NIGHTLY_BUILD)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Legacy (android only)
|
||||||
if (YUZU_LEGACY)
|
if (YUZU_LEGACY)
|
||||||
message(WARNING "Making legacy build. Performance may suffer.")
|
message(WARNING "Making legacy build. Performance may suffer.")
|
||||||
add_compile_definitions(YUZU_LEGACY)
|
add_compile_definitions(YUZU_LEGACY)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Genshin Spoof (android only)
|
||||||
if (GENSHIN_SPOOF)
|
if (GENSHIN_SPOOF)
|
||||||
message(WARNING "Making Genshin spoof build")
|
message(WARNING "Making Genshin spoof build")
|
||||||
add_compile_definitions(GENSHIN_SPOOF)
|
add_compile_definitions(GENSHIN_SPOOF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Build ID (mingw only right now)
|
||||||
|
# Pretty much just refers to the CI "target" for this build
|
||||||
|
if (NOT BUILD_ID)
|
||||||
|
if (ARCHITECTURE_x86_64)
|
||||||
|
set(BUILD_ID amd64)
|
||||||
|
elseif(ARCHITECTURE_arm64)
|
||||||
|
if (WIN32)
|
||||||
|
set(BUILD_ID arm64)
|
||||||
|
else()
|
||||||
|
set(BUILD_ID aarch64)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(BUILD_ID "${ARCHITECTURE}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_compile_definitions(BUILD_ID="${BUILD_ID}")
|
||||||
|
|
||||||
# Set compilation flags
|
# Set compilation flags
|
||||||
if (MSVC AND NOT CXX_CLANG)
|
if (MSVC AND NOT CXX_CLANG)
|
||||||
set(CMAKE_CONFIGURATION_TYPES Debug Release CACHE STRING "" FORCE)
|
set(CMAKE_CONFIGURATION_TYPES Debug Release CACHE STRING "" FORCE)
|
||||||
|
|
@ -159,7 +180,10 @@ else()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86_64)
|
||||||
add_compile_options(-mcx16)
|
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:-mcx16>)
|
||||||
|
if (PLATFORM_LINUX OR PLATFORM_FREEBSD)
|
||||||
|
add_compile_options($<$<COMPILE_LANGUAGE:C,CXX>:-mtls-dialect=gnu2>)
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (APPLE AND CXX_CLANG)
|
if (APPLE AND CXX_CLANG)
|
||||||
|
|
|
||||||
|
|
@ -256,7 +256,7 @@ android {
|
||||||
|
|
||||||
externalNativeBuild {
|
externalNativeBuild {
|
||||||
cmake {
|
cmake {
|
||||||
version = "3.22.1"
|
version = "3.31.6"
|
||||||
path = file("${edenDir}/CMakeLists.txt")
|
path = file("${edenDir}/CMakeLists.txt")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,6 @@ import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
import android.content.pm.PackageManager
|
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.graphics.Rect
|
import android.graphics.Rect
|
||||||
import android.graphics.drawable.Icon
|
import android.graphics.drawable.Icon
|
||||||
|
|
@ -101,7 +100,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager
|
||||||
private var romSwapGeneration = 0
|
private var romSwapGeneration = 0
|
||||||
private var hasEmulationSession = processHasEmulationSession
|
private var hasEmulationSession = processHasEmulationSession
|
||||||
private val romSwapStopTimeoutRunnable = Runnable { onRomSwapStopTimeout() }
|
private val romSwapStopTimeoutRunnable = Runnable { onRomSwapStopTimeout() }
|
||||||
private val pictureInPictureFailureActions: MutableSet<String> = mutableSetOf()
|
|
||||||
|
|
||||||
private fun onRomSwapStopTimeout() {
|
private fun onRomSwapStopTimeout() {
|
||||||
if (!isWaitingForRomSwapStop) {
|
if (!isWaitingForRomSwapStop) {
|
||||||
|
|
@ -127,6 +125,8 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager
|
||||||
|
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
|
||||||
|
NativeConfig.reloadGlobalConfig()
|
||||||
|
|
||||||
InputHandler.updateControllerData()
|
InputHandler.updateControllerData()
|
||||||
val players = NativeConfig.getInputSettings(true)
|
val players = NativeConfig.getInputSettings(true)
|
||||||
var hasConfiguredControllers = false
|
var hasConfiguredControllers = false
|
||||||
|
|
@ -268,18 +268,12 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onUserLeaveHint() {
|
override fun onUserLeaveHint() {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
|
||||||
!isPictureInPictureSupported() ||
|
if (BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && !isInPictureInPictureMode) {
|
||||||
!BooleanSetting.PICTURE_IN_PICTURE.getBoolean() ||
|
val pictureInPictureParamsBuilder = PictureInPictureParams.Builder()
|
||||||
isInPictureInPictureMode
|
.getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder()
|
||||||
) {
|
enterPictureInPictureMode(pictureInPictureParamsBuilder.build())
|
||||||
return
|
}
|
||||||
}
|
|
||||||
|
|
||||||
val pictureInPictureParamsBuilder = PictureInPictureParams.Builder()
|
|
||||||
.getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder()
|
|
||||||
runPictureInPictureAction("enter picture-in-picture mode") {
|
|
||||||
enterPictureInPictureMode(pictureInPictureParamsBuilder.build())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -659,29 +653,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager
|
||||||
return this.apply { setActions(pictureInPictureActions) }
|
return this.apply { setActions(pictureInPictureActions) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isPictureInPictureSupported() =
|
|
||||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
|
|
||||||
packageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)
|
|
||||||
|
|
||||||
private fun runPictureInPictureAction(actionName: String, action: () -> Unit) {
|
|
||||||
try {
|
|
||||||
action()
|
|
||||||
} catch (e: IllegalStateException) {
|
|
||||||
if (pictureInPictureFailureActions.add(actionName)) {
|
|
||||||
Log.warning("[PiP] Failed to $actionName: ${e.message}")
|
|
||||||
}
|
|
||||||
} catch (e: UnsupportedOperationException) {
|
|
||||||
if (pictureInPictureFailureActions.add(actionName)) {
|
|
||||||
Log.warning("[PiP] Failed to $actionName: ${e.message}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun buildPictureInPictureParams() {
|
fun buildPictureInPictureParams() {
|
||||||
if (!isPictureInPictureSupported()) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val pictureInPictureParamsBuilder = PictureInPictureParams.Builder()
|
val pictureInPictureParamsBuilder = PictureInPictureParams.Builder()
|
||||||
.getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder()
|
.getPictureInPictureActionsBuilder().getPictureInPictureAspectBuilder()
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
|
@ -691,9 +663,7 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager
|
||||||
BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && isEmulationActive
|
BooleanSetting.PICTURE_IN_PICTURE.getBoolean() && isEmulationActive
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
runPictureInPictureAction("set picture-in-picture params") {
|
setPictureInPictureParams(pictureInPictureParamsBuilder.build())
|
||||||
setPictureInPictureParams(pictureInPictureParamsBuilder.build())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun displayMultiplayerDialog() {
|
fun displayMultiplayerDialog() {
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
||||||
RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
|
RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
|
||||||
USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"),
|
USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"),
|
||||||
SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"),
|
SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"),
|
||||||
|
ANTIFLICKER("antiflicker"),
|
||||||
FIX_BLOOM_EFFECTS("fix_bloom_effects"),
|
FIX_BLOOM_EFFECTS("fix_bloom_effects"),
|
||||||
EMULATE_BGR565("emulate_bgr565"),
|
EMULATE_BGR565("emulate_bgr565"),
|
||||||
RESCALE_HACK("rescale_hack"),
|
RESCALE_HACK("rescale_hack"),
|
||||||
|
|
|
||||||
|
|
@ -750,6 +750,13 @@ abstract class SettingsItem(
|
||||||
descriptionId = R.string.skip_cpu_inner_invalidation_description
|
descriptionId = R.string.skip_cpu_inner_invalidation_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.ANTIFLICKER,
|
||||||
|
titleId = R.string.antiflicker,
|
||||||
|
descriptionId = R.string.antiflicker_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.FIX_BLOOM_EFFECTS,
|
BooleanSetting.FIX_BLOOM_EFFECTS,
|
||||||
|
|
|
||||||
|
|
@ -76,18 +76,25 @@ class SettingsFragmentPresenter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isFsrScalingFilterSelected(): Boolean {
|
private fun isSharpnessScalingFilterSelected(): Boolean {
|
||||||
val fsrFilterValue = resolveFsrScalingFilterValue() ?: return false
|
|
||||||
val needsGlobal = getNeedsGlobalForKey(IntSetting.RENDERER_SCALING_FILTER.key)
|
val needsGlobal = getNeedsGlobalForKey(IntSetting.RENDERER_SCALING_FILTER.key)
|
||||||
val selectedFilter = IntSetting.RENDERER_SCALING_FILTER.getInt(needsGlobal)
|
val selectedFilter = IntSetting.RENDERER_SCALING_FILTER.getInt(needsGlobal)
|
||||||
return selectedFilter == fsrFilterValue
|
return selectedFilter in resolveSharpnessScalingFilterValues()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun resolveFsrScalingFilterValue(): Int? {
|
private fun resolveSharpnessScalingFilterValues(): Set<Int> {
|
||||||
val names = context.resources.getStringArray(R.array.rendererScalingFilterNames)
|
val names = context.resources.getStringArray(R.array.rendererScalingFilterNames)
|
||||||
val values = context.resources.getIntArray(R.array.rendererScalingFilterValues)
|
val values = context.resources.getIntArray(R.array.rendererScalingFilterValues)
|
||||||
val fsrIndex = names.indexOf(context.getString(R.string.scaling_filter_fsr))
|
val sharpnessFilterNames = setOf(
|
||||||
return if (fsrIndex in values.indices) values[fsrIndex] else null
|
context.getString(R.string.scaling_filter_fsr),
|
||||||
|
context.getString(R.string.scaling_filter_sgsr),
|
||||||
|
context.getString(R.string.scaling_filter_sgsr_edge),
|
||||||
|
)
|
||||||
|
return names.asSequence()
|
||||||
|
.mapIndexedNotNull { index, name ->
|
||||||
|
if (name in sharpnessFilterNames && index in values.indices) values[index] else null
|
||||||
|
}
|
||||||
|
.toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allows you to show/hide abstract settings based on the paired setting key
|
// Allows you to show/hide abstract settings based on the paired setting key
|
||||||
|
|
@ -267,7 +274,7 @@ class SettingsFragmentPresenter(
|
||||||
add(IntSetting.RENDERER_RESOLUTION.key)
|
add(IntSetting.RENDERER_RESOLUTION.key)
|
||||||
add(IntSetting.RENDERER_VSYNC.key)
|
add(IntSetting.RENDERER_VSYNC.key)
|
||||||
add(IntSetting.RENDERER_SCALING_FILTER.key)
|
add(IntSetting.RENDERER_SCALING_FILTER.key)
|
||||||
if (isFsrScalingFilterSelected()) {
|
if (isSharpnessScalingFilterSelected()) {
|
||||||
add(IntSetting.FSR_SHARPENING_SLIDER.key)
|
add(IntSetting.FSR_SHARPENING_SLIDER.key)
|
||||||
}
|
}
|
||||||
add(IntSetting.RENDERER_ANTI_ALIASING.key)
|
add(IntSetting.RENDERER_ANTI_ALIASING.key)
|
||||||
|
|
@ -291,6 +298,7 @@ class SettingsFragmentPresenter(
|
||||||
|
|
||||||
add(IntSetting.FAST_GPU_TIME.key)
|
add(IntSetting.FAST_GPU_TIME.key)
|
||||||
add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key)
|
add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key)
|
||||||
|
add(BooleanSetting.ANTIFLICKER.key)
|
||||||
add(BooleanSetting.FIX_BLOOM_EFFECTS.key)
|
add(BooleanSetting.FIX_BLOOM_EFFECTS.key)
|
||||||
add(BooleanSetting.EMULATE_BGR565.key)
|
add(BooleanSetting.EMULATE_BGR565.key)
|
||||||
add(BooleanSetting.RESCALE_HACK.key)
|
add(BooleanSetting.RESCALE_HACK.key)
|
||||||
|
|
|
||||||
|
|
@ -1090,7 +1090,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
private fun addQuickSettings() {
|
private fun addQuickSettings() {
|
||||||
binding.quickSettingsSheet.apply {
|
binding.quickSettingsSheet.apply {
|
||||||
val container = binding.quickSettingsSheet.findViewById<ViewGroup>(R.id.quick_settings_container)
|
val container = binding.quickSettingsSheet.findViewById<ViewGroup>(R.id.quick_settings_container)
|
||||||
val isFsrSelected = isFsrScalingFilterSelected()
|
val isSharpnessFilterSelected = isSharpnessScalingFilterSelected()
|
||||||
|
|
||||||
container.removeAllViews()
|
container.removeAllViews()
|
||||||
|
|
||||||
|
|
@ -1176,7 +1176,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
addQuickSettings()
|
addQuickSettings()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isFsrSelected) {
|
if (isSharpnessFilterSelected) {
|
||||||
quickSettings.addSliderSetting(
|
quickSettings.addSliderSetting(
|
||||||
R.string.fsr_sharpness,
|
R.string.fsr_sharpness,
|
||||||
container,
|
container,
|
||||||
|
|
@ -1197,17 +1197,24 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun isFsrScalingFilterSelected(): Boolean {
|
private fun isSharpnessScalingFilterSelected(): Boolean {
|
||||||
val fsrFilterValue = resolveFsrScalingFilterValue() ?: return false
|
|
||||||
val selectedFilter = IntSetting.RENDERER_SCALING_FILTER.getInt(needsGlobal = false)
|
val selectedFilter = IntSetting.RENDERER_SCALING_FILTER.getInt(needsGlobal = false)
|
||||||
return selectedFilter == fsrFilterValue
|
return selectedFilter in resolveSharpnessScalingFilterValues()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun resolveFsrScalingFilterValue(): Int? {
|
private fun resolveSharpnessScalingFilterValues(): Set<Int> {
|
||||||
val names = resources.getStringArray(R.array.rendererScalingFilterNames)
|
val names = resources.getStringArray(R.array.rendererScalingFilterNames)
|
||||||
val values = resources.getIntArray(R.array.rendererScalingFilterValues)
|
val values = resources.getIntArray(R.array.rendererScalingFilterValues)
|
||||||
val fsrIndex = names.indexOf(getString(R.string.scaling_filter_fsr))
|
val sharpnessFilterNames = setOf(
|
||||||
return if (fsrIndex in values.indices) values[fsrIndex] else null
|
getString(R.string.scaling_filter_fsr),
|
||||||
|
getString(R.string.scaling_filter_sgsr),
|
||||||
|
getString(R.string.scaling_filter_sgsr_edge),
|
||||||
|
)
|
||||||
|
return names.asSequence()
|
||||||
|
.mapIndexedNotNull { index, name ->
|
||||||
|
if (name in sharpnessFilterNames && index in values.indices) values[index] else null
|
||||||
|
}
|
||||||
|
.toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun openQuickSettingsMenu() {
|
private fun openQuickSettingsMenu() {
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,9 @@ AndroidConfig::AndroidConfig(const std::string& config_name, ConfigType config_t
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidConfig::ReloadAllValues() {
|
void AndroidConfig::ReloadAllValues() {
|
||||||
|
// Ensure the INI file is current before reloading values.
|
||||||
|
SetUpIni();
|
||||||
|
|
||||||
Reload();
|
Reload();
|
||||||
ReadAndroidValues();
|
ReadAndroidValues();
|
||||||
SaveAndroidValues();
|
SaveAndroidValues();
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 131 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 67 KiB |
|
|
@ -462,8 +462,8 @@
|
||||||
<string name="renderer_resolution">الدقة (الإرساء/محمول)</string>
|
<string name="renderer_resolution">الدقة (الإرساء/محمول)</string>
|
||||||
<string name="renderer_vsync">VSync وضع</string>
|
<string name="renderer_vsync">VSync وضع</string>
|
||||||
<string name="renderer_scaling_filter">مرشح ملائم للنافذة</string>
|
<string name="renderer_scaling_filter">مرشح ملائم للنافذة</string>
|
||||||
<string name="fsr_sharpness">حدة FSR</string>
|
<string name="fsr_sharpness">حدة FSR/SGSR</string>
|
||||||
<string name="fsr_sharpness_description">يحدد مدى وضوح الصورة عند استخدام التباين الديناميكي لـ FSR</string>
|
<string name="fsr_sharpness_description">يحدد مدى وضوح الصورة عند استخدام مرشحات FSR أو SGSR</string>
|
||||||
<string name="renderer_anti_aliasing">طريقة مضاد التعرج</string>
|
<string name="renderer_anti_aliasing">طريقة مضاد التعرج</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -503,6 +503,8 @@
|
||||||
<string name="fast_gpu_time_description">يُجبر هذا الخيار معظم الألعاب على العمل بأعلى دقة عرض أصلية. استخدم 256 للحصول على أقصى أداء و512 للحصول على أعلى جودة رسومات.</string>
|
<string name="fast_gpu_time_description">يُجبر هذا الخيار معظم الألعاب على العمل بأعلى دقة عرض أصلية. استخدم 256 للحصول على أقصى أداء و512 للحصول على أعلى جودة رسومات.</string>
|
||||||
<string name="skip_cpu_inner_invalidation">تخطي إبطال صلاحية وحدة المعالجة المركزية الداخلية</string>
|
<string name="skip_cpu_inner_invalidation">تخطي إبطال صلاحية وحدة المعالجة المركزية الداخلية</string>
|
||||||
<string name="skip_cpu_inner_invalidation_description">يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقتة من جانب وحدة المعالجة المركزية أثناء تحديثات الذاكرة، مما يقلل من استخدام وحدة المعالجة المركزية ويحسن أداءها. قد يتسبب ذلك في حدوث أعطال أو تعطل في بعض الألعاب.</string>
|
<string name="skip_cpu_inner_invalidation_description">يتخطى بعض عمليات إبطال ذاكرة التخزين المؤقتة من جانب وحدة المعالجة المركزية أثناء تحديثات الذاكرة، مما يقلل من استخدام وحدة المعالجة المركزية ويحسن أداءها. قد يتسبب ذلك في حدوث أعطال أو تعطل في بعض الألعاب.</string>
|
||||||
|
<string name="antiflicker">مضاد الوميض</string>
|
||||||
|
<string name="antiflicker_description">يُجبر هذا الوضع وظائف وحدة معالجة الرسومات على الانتظار حتى يتم إرسال العمل إليها. استخدمه مع وضع وحدة معالجة الرسومات السريع لتجنب الوميض مع تأثير أقل على الأداء.</string>
|
||||||
<string name="fix_bloom_effects">إصلاح تأثيرات التوهج</string>
|
<string name="fix_bloom_effects">إصلاح تأثيرات التوهج</string>
|
||||||
<string name="fix_bloom_effects_description">يقلل من ضبابية التوهج في LA/EOW (Adreno A6XX - A7XX/ Turnip)، ويزيل التوهج في Burnout. تحذير: قد يسبب تشوهات رسومية في ألعاب أخرى.</string>
|
<string name="fix_bloom_effects_description">يقلل من ضبابية التوهج في LA/EOW (Adreno A6XX - A7XX/ Turnip)، ويزيل التوهج في Burnout. تحذير: قد يسبب تشوهات رسومية في ألعاب أخرى.</string>
|
||||||
<string name="emulate_bgr565">محاكاة BGR565</string>
|
<string name="emulate_bgr565">محاكاة BGR565</string>
|
||||||
|
|
|
||||||
|
|
@ -329,8 +329,6 @@
|
||||||
<string name="renderer_resolution">ڕوونی (دۆخی دەستی/دۆخی دۆک)</string>
|
<string name="renderer_resolution">ڕوونی (دۆخی دەستی/دۆخی دۆک)</string>
|
||||||
<string name="renderer_vsync">دۆخی VSync</string>
|
<string name="renderer_vsync">دۆخی VSync</string>
|
||||||
<string name="renderer_scaling_filter">فلتەری گونجاندنی پەنجەرە</string>
|
<string name="renderer_scaling_filter">فلتەری گونجاندنی پەنجەرە</string>
|
||||||
<string name="fsr_sharpness">تیژی FSR</string>
|
|
||||||
<string name="fsr_sharpness_description">دیاریکردنی تیژی وێنە لە کاتی بەکارهێنانی FSR</string>
|
|
||||||
<string name="renderer_anti_aliasing">شێوازی دژە-خاوڕۆیی</string>
|
<string name="renderer_anti_aliasing">شێوازی دژە-خاوڕۆیی</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -439,8 +439,6 @@
|
||||||
<string name="renderer_resolution">Rozlišení (Handheld/V doku)</string>
|
<string name="renderer_resolution">Rozlišení (Handheld/V doku)</string>
|
||||||
<string name="renderer_vsync">Režim VSync</string>
|
<string name="renderer_vsync">Režim VSync</string>
|
||||||
<string name="renderer_scaling_filter">Škálovací filtr</string>
|
<string name="renderer_scaling_filter">Škálovací filtr</string>
|
||||||
<string name="fsr_sharpness">Ostrost FSR</string>
|
|
||||||
<string name="fsr_sharpness_description">Určuje jak ostře bude obraz vypadat při použití dynamického kontrastu FSR.</string>
|
|
||||||
<string name="renderer_anti_aliasing">Metoda anti-aliasingu</string>
|
<string name="renderer_anti_aliasing">Metoda anti-aliasingu</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -439,8 +439,6 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die
|
||||||
<string name="renderer_resolution">Auflösung (Handheld/Gedockt)</string>
|
<string name="renderer_resolution">Auflösung (Handheld/Gedockt)</string>
|
||||||
<string name="renderer_vsync">VSync-Modus</string>
|
<string name="renderer_vsync">VSync-Modus</string>
|
||||||
<string name="renderer_scaling_filter">Skalierungsfilter</string>
|
<string name="renderer_scaling_filter">Skalierungsfilter</string>
|
||||||
<string name="fsr_sharpness">FSR-Schärfe</string>
|
|
||||||
<string name="fsr_sharpness_description">Bestimmt die Schärfe bei FSR-Nutzung.</string>
|
|
||||||
<string name="renderer_anti_aliasing">Kantenglättung</string>
|
<string name="renderer_anti_aliasing">Kantenglättung</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -376,7 +376,7 @@
|
||||||
<string name="qlaunch_applet">Qlaunch</string>
|
<string name="qlaunch_applet">Qlaunch</string>
|
||||||
<string name="qlaunch_description">Iniciar aplicaciones desde la pantalla de inicio del sistema</string>
|
<string name="qlaunch_description">Iniciar aplicaciones desde la pantalla de inicio del sistema</string>
|
||||||
<string name="applets">Lanzador de Applet</string>
|
<string name="applets">Lanzador de Applet</string>
|
||||||
<string name="applets_description">Ejecutar applets de sistema usando el firmware instalado</string>
|
<string name="applets_description">Ejecutar applets del sistema usando el firmware instalado</string>
|
||||||
<string name="applets_error_firmware">El firmware no está instalado</string>
|
<string name="applets_error_firmware">El firmware no está instalado</string>
|
||||||
<string name="applets_error_applet">Applet no disponible</string>
|
<string name="applets_error_applet">Applet no disponible</string>
|
||||||
<string name="applets_error_description"><![CDATA[Por favor, asegúrese de que su archivo <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> y el <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware\">firmware</a> están instalados e inténtelo de nuevo.]]></string>
|
<string name="applets_error_description"><![CDATA[Por favor, asegúrese de que su archivo <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-prodkeys-and-titlekeys\">prod.keys</a> y el <a href=\"https://yuzu-mirror.github.io/help/quickstart/#dumping-system-firmware\">firmware</a> están instalados e inténtelo de nuevo.]]></string>
|
||||||
|
|
@ -456,8 +456,8 @@
|
||||||
<string name="renderer_resolution">Resolución (Portátil/Sobremesa)</string>
|
<string name="renderer_resolution">Resolución (Portátil/Sobremesa)</string>
|
||||||
<string name="renderer_vsync">Modo de sincronización vertical</string>
|
<string name="renderer_vsync">Modo de sincronización vertical</string>
|
||||||
<string name="renderer_scaling_filter">Filtro de adaptación de ventana</string>
|
<string name="renderer_scaling_filter">Filtro de adaptación de ventana</string>
|
||||||
<string name="fsr_sharpness">Nitidez FSR</string>
|
<string name="fsr_sharpness">Nitidez FSR/SGSR</string>
|
||||||
<string name="fsr_sharpness_description">Ajusta la intensidad del filtro de enfoque al usar el contraste dinámico de FSR.</string>
|
<string name="fsr_sharpness_description">Determina el grado de nitidez de la imagen al usar filtros FSR o SGSR</string>
|
||||||
<string name="renderer_anti_aliasing">Método de suavizado de bordes</string>
|
<string name="renderer_anti_aliasing">Método de suavizado de bordes</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -489,17 +489,22 @@
|
||||||
<string name="enable_buffer_history">Activar el historial del búfer</string>
|
<string name="enable_buffer_history">Activar el historial del búfer</string>
|
||||||
<string name="enable_buffer_history_description">Permite el acceso al estado del búfer anterior. Esta opción puede mejorar la calidad de renderizado y la consistencia en el rendimiento de algunos juegos.</string>
|
<string name="enable_buffer_history_description">Permite el acceso al estado del búfer anterior. Esta opción puede mejorar la calidad de renderizado y la consistencia en el rendimiento de algunos juegos.</string>
|
||||||
<string name="use_optimized_vertex_buffers">Búferes de vértices optimizados</string>
|
<string name="use_optimized_vertex_buffers">Búferes de vértices optimizados</string>
|
||||||
|
<string name="use_optimized_vertex_buffers_description">Permite la optimización del enlace del búfer de vértices para un mejor rendimiento. Requiere controladores Mesa 26.0+ Turnip/ controladores QCOM. Fallará con controladores Turnip más antiguos (versión 25.3 o inferior).</string>
|
||||||
|
|
||||||
<string name="hacks">Hacks</string>
|
<string name="hacks">Hacks</string>
|
||||||
|
|
||||||
<string name="fast_gpu_time">Tiempo rápido de la GPU</string>
|
<string name="fast_gpu_time">Tiempo rápido de la GPU</string>
|
||||||
<string name="fast_gpu_time_description">Fuerza a la mayoría de los juegos a ejecutarse a su resolución nativa más alta. Usa 256 para un máximo rendimiento y 512 para una fidelidad gráfica óptima.</string>
|
<string name="fast_gpu_time_description">Fuerza a la mayoría de los juegos a ejecutarse a su resolución nativa más alta. Usa 256 para un máximo rendimiento y 512 para una fidelidad gráfica óptima.</string>
|
||||||
<string name="skip_cpu_inner_invalidation">Omitir invalidación interna de la CPU</string>
|
<string name="skip_cpu_inner_invalidation">Omitir invalidación interna de la CPU</string>
|
||||||
<string name="skip_cpu_inner_invalidation_description">Omite ciertas invalidaciones de caché de la CPU durante las actualizaciones de memoria, lo que reduce el uso de la CPU y mejora su rendimiento. Esto puede causar fallos o bloqueos en algunos juegos.</string>
|
<string name="skip_cpu_inner_invalidation_description">Omite ciertas invalidaciones de caché de la CPU durante las actualizaciones de memoria, lo que reduce el uso de la CPU y mejora su rendimiento. Esto puede causar fallos o bloqueos en algunos juegos.</string>
|
||||||
|
<string name="antiflicker">Antiparpadeo</string>
|
||||||
|
<string name="antiflicker_description">Fuerza a las funciones de devolución de llamada de la GPU a esperar a que se envíen las tareas a la GPU.\nÚsalo con el modo de GPU rápida para evitar el parpadeo con un menor impacto en el rendimiento.</string>
|
||||||
<string name="fix_bloom_effects">Arreglar los efectos de resplandor</string>
|
<string name="fix_bloom_effects">Arreglar los efectos de resplandor</string>
|
||||||
<string name="fix_bloom_effects_description">Reduce el efecto de resplandor en LA/EOW (Adreno A6XX - A7XX/ Turnip), elimina el resplandor en Burnout. Advertencia: puede causar artefactos gráficos en otros juegos.</string>
|
<string name="fix_bloom_effects_description">Reduce el efecto de resplandor en LA/EOW (Adreno A6XX - A7XX/ Turnip), elimina el resplandor en Burnout. Advertencia: puede causar artefactos gráficos en otros juegos.</string>
|
||||||
<string name="emulate_bgr565">Emular BGR565</string>
|
<string name="emulate_bgr565">Emular BGR565</string>
|
||||||
<string name="emulate_bgr565_description">Soluciona problemas con colores invertidos en juegos, artefactos o sombras extrañas.</string>
|
<string name="emulate_bgr565_description">Soluciona problemas con colores invertidos en juegos, artefactos o sombras extrañas.</string>
|
||||||
<string name="rescale_hack">Activar la pasada de reescalado heredada</string>
|
<string name="rescale_hack">Activar la pasada de reescalado heredada</string>
|
||||||
|
<string name="rescale_hack_description">Permite el manejo de versiones anteriores para el paso de configuración de reescalado para juegos mediante el uso de una ruta de reescalado rápida.</string>
|
||||||
<string name="renderer_asynchronous_shaders">Usar sombreadores asíncronos</string>
|
<string name="renderer_asynchronous_shaders">Usar sombreadores asíncronos</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">Compila los sombreadores de forma asíncrona. Esto puede reducir los tirones, pero también puede introducir errores gráficos.</string>
|
<string name="renderer_asynchronous_shaders_description">Compila los sombreadores de forma asíncrona. Esto puede reducir los tirones, pero también puede introducir errores gráficos.</string>
|
||||||
<string name="gpu_unswizzle_settings">Ajustes de desentrelazado de la GPU</string>
|
<string name="gpu_unswizzle_settings">Ajustes de desentrelazado de la GPU</string>
|
||||||
|
|
@ -518,8 +523,10 @@
|
||||||
<string name="extensions">Extensiones</string>
|
<string name="extensions">Extensiones</string>
|
||||||
|
|
||||||
<string name="dyna_state">Estado dinámico extendido</string>
|
<string name="dyna_state">Estado dinámico extendido</string>
|
||||||
|
<string name="dyna_state_description">Controla la cantidad de características que se pueden usar en ExtendedDynamicState (EDS). Un valor más alto permitirá reducir la cantidad de compilaciones de canalización basadas en el estado dinámico compatible con el controlador.</string>
|
||||||
<string name="disabled">Desactivado</string>
|
<string name="disabled">Desactivado</string>
|
||||||
<string name="vertex_input_dynamic_state">Estado dinámico de entrada de vértices</string>
|
<string name="vertex_input_dynamic_state">Estado dinámico de entrada de vértices</string>
|
||||||
|
<string name="vertex_input_dynamic_state_description">La activación de esta función permite un manejo más flexible de la entrada de vértices, lo que podría reducir el tiempo de compilación de la canalización en vértices/búfer.</string>
|
||||||
<string name="sample_shading_fraction">Muestreo de sombreado</string>
|
<string name="sample_shading_fraction">Muestreo de sombreado</string>
|
||||||
<string name="sample_shading_fraction_description">Permite que el sombreador de fragmentos se ejecute por muestra en un fragmento multimuestreado, en lugar de una sola vez por fragmento. Mejora la calidad de los gráficos a coste de algo de rendimiento.</string>
|
<string name="sample_shading_fraction_description">Permite que el sombreador de fragmentos se ejecute por muestra en un fragmento multimuestreado, en lugar de una sola vez por fragmento. Mejora la calidad de los gráficos a coste de algo de rendimiento.</string>
|
||||||
|
|
||||||
|
|
@ -1067,7 +1074,7 @@
|
||||||
|
|
||||||
<!-- Black backgrounds theme -->
|
<!-- Black backgrounds theme -->
|
||||||
<string name="use_black_backgrounds">Fondos oscuros</string>
|
<string name="use_black_backgrounds">Fondos oscuros</string>
|
||||||
<string name="use_black_backgrounds_description">Cuando utilice el modo oscuro, aplique fondos negros.</string>
|
<string name="use_black_backgrounds_description">Cuando se usa el modo oscuro, aplicar fondos de pantalla negros.</string>
|
||||||
|
|
||||||
<!-- Buttons -->
|
<!-- Buttons -->
|
||||||
<string name="enable_folder_button">Carpeta</string>
|
<string name="enable_folder_button">Carpeta</string>
|
||||||
|
|
|
||||||
|
|
@ -454,11 +454,12 @@
|
||||||
<string name="renderer_resolution">Résolution (Mode Portable/Mode TV)</string>
|
<string name="renderer_resolution">Résolution (Mode Portable/Mode TV)</string>
|
||||||
<string name="renderer_vsync">Mode VSync</string>
|
<string name="renderer_vsync">Mode VSync</string>
|
||||||
<string name="renderer_scaling_filter">Filtre de fenêtre adaptatif</string>
|
<string name="renderer_scaling_filter">Filtre de fenêtre adaptatif</string>
|
||||||
<string name="fsr_sharpness">Netteté FSR</string>
|
|
||||||
<string name="fsr_sharpness_description">Détermine à quel point l\'image sera affinée lors de l\'utilisation du contraste dynamique FSR.</string>
|
|
||||||
<string name="renderer_anti_aliasing">Méthode d\'anticrénelage</string>
|
<string name="renderer_anti_aliasing">Méthode d\'anticrénelage</string>
|
||||||
|
|
||||||
|
|
||||||
|
<string name="advanced">Avancé</string>
|
||||||
|
|
||||||
|
<string name="renderer_accuracy">Mode GPU</string>
|
||||||
<string name="dma_accuracy">Précision DMA</string>
|
<string name="dma_accuracy">Précision DMA</string>
|
||||||
<string name="dma_accuracy_description">Contrôle la précision du DMA. Une précision sûre peut résoudre les problèmes dans certains jeux, mais peut aussi affecter les performances dans certains cas. Si vous n\'êtes pas sûr, laissez ce paramètre sur Par défaut.</string>
|
<string name="dma_accuracy_description">Contrôle la précision du DMA. Une précision sûre peut résoudre les problèmes dans certains jeux, mais peut aussi affecter les performances dans certains cas. Si vous n\'êtes pas sûr, laissez ce paramètre sur Par défaut.</string>
|
||||||
<string name="anisotropic_filtering">Filtrage anisotropique</string>
|
<string name="anisotropic_filtering">Filtrage anisotropique</string>
|
||||||
|
|
@ -474,15 +475,29 @@
|
||||||
<string name="use_disk_shader_cache_description">Réduire les saccades en stockant et en chargeant localement les shaders générés</string>
|
<string name="use_disk_shader_cache_description">Réduire les saccades en stockant et en chargeant localement les shaders générés</string>
|
||||||
<string name="renderer_force_max_clock">Forcer les fréquences maximales (Adreno uniquement)</string>
|
<string name="renderer_force_max_clock">Forcer les fréquences maximales (Adreno uniquement)</string>
|
||||||
<string name="renderer_force_max_clock_description">Forcer le GPU à fonctionner à ses fréquences maximales possibles (les contraintes thermiques seront toujours appliquées).</string>
|
<string name="renderer_force_max_clock_description">Forcer le GPU à fonctionner à ses fréquences maximales possibles (les contraintes thermiques seront toujours appliquées).</string>
|
||||||
|
<string name="renderer_asynchronous_gpu_emulation">Émulation GPU asynchrone </string>
|
||||||
|
<string name="renderer_asynchronous_gpu_emulation_description">Ce contournement peut améliorer les performances en faisant tourner l\'émulation GPU de manière asynchrone au détriment de la fidélité graphique et de la stabilité (plantages plus fréquents) dus à des erreurs de cadence.</string>
|
||||||
<string name="renderer_reactive_flushing">Utiliser le vidage réactif</string>
|
<string name="renderer_reactive_flushing">Utiliser le vidage réactif</string>
|
||||||
<string name="renderer_reactive_flushing_description">Améliore la précision du rendu dans certains jeux au détriment des performances.</string>
|
<string name="renderer_reactive_flushing_description">Améliore la précision du rendu dans certains jeux au détriment des performances.</string>
|
||||||
|
<string name="enable_buffer_history">Activer l\'historique du tampon</string>
|
||||||
|
<string name="hacks">Contournements</string>
|
||||||
|
|
||||||
|
<string name="fast_gpu_time">Temps GPU rapide</string>
|
||||||
<string name="skip_cpu_inner_invalidation">Ignorer l\'invalidation interne du CPU</string>
|
<string name="skip_cpu_inner_invalidation">Ignorer l\'invalidation interne du CPU</string>
|
||||||
<string name="skip_cpu_inner_invalidation_description">Ignore certaines invalidations de cache côté CPU lors des mises à jour mémoire, réduisant l\'utilisation du CPU et améliorant ses performances. Peut causer des bugs ou plantages sur certains jeux.</string>
|
<string name="skip_cpu_inner_invalidation_description">Ignore certaines invalidations de cache côté CPU lors des mises à jour mémoire, réduisant l\'utilisation du CPU et améliorant ses performances. Peut causer des bugs ou plantages sur certains jeux.</string>
|
||||||
|
<string name="emulate_bgr565">Emuler BGR565</string>
|
||||||
<string name="renderer_asynchronous_shaders">Utiliser les shaders asynchrones</string>
|
<string name="renderer_asynchronous_shaders">Utiliser les shaders asynchrones</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">Compile les shaders de manière asynchrone. Cela peut réduire les saccades mais peut aussi provoquer des problèmes graphiques.</string>
|
<string name="renderer_asynchronous_shaders_description">Compile les shaders de manière asynchrone. Cela peut réduire les saccades mais peut aussi provoquer des problèmes graphiques.</string>
|
||||||
|
<string name="gpu_unswizzle_disabled">Désactivé</string>
|
||||||
|
<string name="gpu_unswizzle_default_button">Par défaut</string>
|
||||||
|
|
||||||
|
|
||||||
|
<string name="extensions">Extensions</string>
|
||||||
|
|
||||||
<string name="dyna_state">État dynamique étendu</string>
|
<string name="dyna_state">État dynamique étendu</string>
|
||||||
<string name="disabled">Désactivé</string>
|
<string name="disabled">Désactivé</string>
|
||||||
<string name="vertex_input_dynamic_state">État dynamique d\'entrée de sommet</string>
|
<string name="vertex_input_dynamic_state">État dynamique d\'entrée de sommet</string>
|
||||||
|
<string name="sample_shading_fraction">Échantillonnage de shading</string>
|
||||||
<string name="display">Affichage</string>
|
<string name="display">Affichage</string>
|
||||||
|
|
||||||
<string name="renderer_screen_layout">Orientation</string>
|
<string name="renderer_screen_layout">Orientation</string>
|
||||||
|
|
@ -508,6 +523,21 @@
|
||||||
<string name="flush_by_line">Vider les journaux de débogage ligne par ligne</string>
|
<string name="flush_by_line">Vider les journaux de débogage ligne par ligne</string>
|
||||||
<string name="flush_by_line_description">Vide les journaux de débogage à chaque ligne écrite, facilitant le débogage en cas de plantage ou de gel.</string>
|
<string name="flush_by_line_description">Vide les journaux de débogage à chaque ligne écrite, facilitant le débogage en cas de plantage ou de gel.</string>
|
||||||
|
|
||||||
|
<!-- GPU Logging strings -->
|
||||||
|
<string name="gpu_logging_header">Journalisation GPU</string>
|
||||||
|
<string name="gpu_logging_enabled">Activer la journalisation GPU</string>
|
||||||
|
<string name="gpu_log_level">Niveau de journalisation</string>
|
||||||
|
<string name="gpu_log_vulkan_calls">Journaliser les appels API Vulkan</string>
|
||||||
|
<string name="gpu_log_shader_dumps">Extraire les shaders</string>
|
||||||
|
<string name="gpu_log_shader_dumps_description">Sauvegarder le shader SPIR-V complié dans les fichiers</string>
|
||||||
|
<string name="gpu_log_memory_tracking">Monitorer la mémoire GPU</string>
|
||||||
|
<string name="gpu_log_memory_tracking_description">Monitorer les allocations et désallocations de la mémoire GPU</string>
|
||||||
|
<string name="gpu_log_driver_debug">Informations de débogage du pilote</string>
|
||||||
|
<string name="gpu_log_ring_buffer_size_description">Nombre d\'appels Vulkans récents à monitorer (par défaut : 512)</string>
|
||||||
|
<string name="gpu_log_ring_buffer_size_hint">64 à 4096 entrées</string>
|
||||||
|
|
||||||
|
<string name="general">Général</string>
|
||||||
|
|
||||||
<!-- Audio settings strings -->
|
<!-- Audio settings strings -->
|
||||||
<string name="audio_output_engine">Moteur de sortie</string>
|
<string name="audio_output_engine">Moteur de sortie</string>
|
||||||
<string name="audio_volume">Volume</string>
|
<string name="audio_volume">Volume</string>
|
||||||
|
|
@ -590,6 +620,7 @@
|
||||||
|
|
||||||
<!-- Miscellaneous -->
|
<!-- Miscellaneous -->
|
||||||
<string name="slider_default">Par défaut</string>
|
<string name="slider_default">Par défaut</string>
|
||||||
|
<string name="default_string">Par défaut</string>
|
||||||
<string name="loading">Chargement...</string>
|
<string name="loading">Chargement...</string>
|
||||||
<string name="shutting_down">Extinction en cours...</string>
|
<string name="shutting_down">Extinction en cours...</string>
|
||||||
<string name="reset_setting_confirmation">Voulez-vous réinitialiser ce paramètre à sa valeur par défaut ?</string>
|
<string name="reset_setting_confirmation">Voulez-vous réinitialiser ce paramètre à sa valeur par défaut ?</string>
|
||||||
|
|
@ -628,6 +659,7 @@
|
||||||
<string name="select_gpu_driver_default">Par défaut</string>
|
<string name="select_gpu_driver_default">Par défaut</string>
|
||||||
<string name="select_gpu_driver_error">Pilote non valide sélectionné</string>
|
<string name="select_gpu_driver_error">Pilote non valide sélectionné</string>
|
||||||
<string name="driver_already_installed">Pilote déjà installé</string>
|
<string name="driver_already_installed">Pilote déjà installé</string>
|
||||||
|
<string name="installed_label">%1$s (Installé)</string>
|
||||||
<string name="system_gpu_driver">Pilote du GPU du système</string>
|
<string name="system_gpu_driver">Pilote du GPU du système</string>
|
||||||
<string name="installing_driver">Installation du pilote...</string>
|
<string name="installing_driver">Installation du pilote...</string>
|
||||||
|
|
||||||
|
|
@ -647,6 +679,7 @@
|
||||||
<string name="installing">Installation en cours…</string>
|
<string name="installing">Installation en cours…</string>
|
||||||
<string name="latest">Dernière</string>
|
<string name="latest">Dernière</string>
|
||||||
<string name="recommended_driver">Pilote recommandé :</string>
|
<string name="recommended_driver">Pilote recommandé :</string>
|
||||||
|
<string name="gpu_model">Modèle GPU</string>
|
||||||
<string name="unsupported_gpu">GPU non pris en charge</string>
|
<string name="unsupported_gpu">GPU non pris en charge</string>
|
||||||
<string name="unsupported_gpu_warning">Votre GPU ne prend pas en charge l\'injection de pilotes. Il n\'est pas recommandé de définir des pilotes personnalisés.</string>
|
<string name="unsupported_gpu_warning">Votre GPU ne prend pas en charge l\'injection de pilotes. Il n\'est pas recommandé de définir des pilotes personnalisés.</string>
|
||||||
|
|
||||||
|
|
@ -656,6 +689,9 @@
|
||||||
<string name="preferences_system_description">Mode TV, région, langue</string>
|
<string name="preferences_system_description">Mode TV, région, langue</string>
|
||||||
<string name="preferences_graphics">Vidéo</string>
|
<string name="preferences_graphics">Vidéo</string>
|
||||||
<string name="preferences_graphics_description">Niveau de précision, résolution, cache de shaders</string>
|
<string name="preferences_graphics_description">Niveau de précision, résolution, cache de shaders</string>
|
||||||
|
<string name="quick_settings">Paramètres rapides</string>
|
||||||
|
<string name="enable_quick_settings">Activer les paramètres rapides</string>
|
||||||
|
<string name="enable_quick_settings_description">Autoriser l\'accès aux paramètres rapides par le balayage de l\'écran et le bouton du menu</string>
|
||||||
<string name="preferences_audio">Audio</string>
|
<string name="preferences_audio">Audio</string>
|
||||||
<string name="preferences_audio_description">Moteur de sortie, volume</string>
|
<string name="preferences_audio_description">Moteur de sortie, volume</string>
|
||||||
<string name="preferences_controls">Contrôles</string>
|
<string name="preferences_controls">Contrôles</string>
|
||||||
|
|
@ -663,6 +699,25 @@
|
||||||
<string name="preferences_player">Joueur %d</string>
|
<string name="preferences_player">Joueur %d</string>
|
||||||
<string name="preferences_debug">Débogage</string>
|
<string name="preferences_debug">Débogage</string>
|
||||||
<string name="preferences_debug_description">Débogage CPU/GPU, API graphique, fastmem</string>
|
<string name="preferences_debug_description">Débogage CPU/GPU, API graphique, fastmem</string>
|
||||||
|
<string name="preferences_custom_paths">Chemins personnalisés</string>
|
||||||
|
<string name="preferences_custom_paths_description">Sauvegarder le répertoire des données</string>
|
||||||
|
|
||||||
|
<!-- Custom Paths settings -->
|
||||||
|
<string name="custom_save_directory">Sauvegarder le répertoire des données</string>
|
||||||
|
<string name="custom_save_directory_description">Définir un chemin personnalisé pour les sauvegardes</string>
|
||||||
|
<string name="reset_to_nand">Réinitialiser par défaut</string>
|
||||||
|
<string name="migrate_save_data">Migrer les données de sauvegarde</string>
|
||||||
|
<string name="save_migration_complete">Données de sauvegarde supprimées avec succès</string>
|
||||||
|
<string name="save_migration_failed">Échec de la migration des données de sauvegarde</string>
|
||||||
|
<string name="destination_has_saves">La destination contient déjà des données. Voulez-vous les écraser \?</string>
|
||||||
|
<string name="grant_permission">Accorder la permission</string>
|
||||||
|
<string name="custom_nand_directory">Dossier NAND</string>
|
||||||
|
<string name="custom_nand_directory_description">Définir un chemin personnalisé pour le stockage NAND</string>
|
||||||
|
<string name="custom_sdmc_directory">Répertoire de carte SD</string>
|
||||||
|
<string name="custom_sdmc_directory_description">Définir un chemin personnalisé pour le stockage de la carte SD virtuelle</string>
|
||||||
|
<string name="path_set">Chemin défini avec succès</string>
|
||||||
|
<string name="skip_migration">Sauter</string>
|
||||||
|
|
||||||
<!-- Game properties -->
|
<!-- Game properties -->
|
||||||
<string name="info">Info</string>
|
<string name="info">Info</string>
|
||||||
<string name="info_description">ID du programme, développeur, version</string>
|
<string name="info_description">ID du programme, développeur, version</string>
|
||||||
|
|
@ -676,6 +731,7 @@
|
||||||
<string name="copy_details">Copier les détails</string>
|
<string name="copy_details">Copier les détails</string>
|
||||||
<string name="add_ons">Extensions</string>
|
<string name="add_ons">Extensions</string>
|
||||||
<string name="add_ons_description">Activer les mods, mises à jour et DLC</string>
|
<string name="add_ons_description">Activer les mods, mises à jour et DLC</string>
|
||||||
|
<string name="playtime">Temps de jeu :</string>
|
||||||
<string name="reset_playtime">Réinitialiser le Temps de Jeu</string>
|
<string name="reset_playtime">Réinitialiser le Temps de Jeu</string>
|
||||||
<string name="reset_playtime_description">Réinitialiser le temps de jeu du jeu actuel à 0 seconde</string>
|
<string name="reset_playtime_description">Réinitialiser le temps de jeu du jeu actuel à 0 seconde</string>
|
||||||
<string name="reset_playtime_warning_description">Cela effacera les données de temps de jeu du jeu actuel. Êtes-vous sûr \?</string>
|
<string name="reset_playtime_warning_description">Cela effacera les données de temps de jeu du jeu actuel. Êtes-vous sûr \?</string>
|
||||||
|
|
@ -683,6 +739,9 @@
|
||||||
<string name="edit_playtime">Modifier le Temps de Jeu</string>
|
<string name="edit_playtime">Modifier le Temps de Jeu</string>
|
||||||
<string name="hours">Heures</string>
|
<string name="hours">Heures</string>
|
||||||
<string name="minutes">Minutes</string>
|
<string name="minutes">Minutes</string>
|
||||||
|
<string name="hours_abbr">h</string>
|
||||||
|
<string name="minutes_abbr">m</string>
|
||||||
|
<string name="seconds_abbr">s</string>
|
||||||
<string name="hours_must_be_between_0_and_9999">Les heures doivent être comprises entre 0 et 9999</string>
|
<string name="hours_must_be_between_0_and_9999">Les heures doivent être comprises entre 0 et 9999</string>
|
||||||
<string name="minutes_must_be_between_0_and_59">Les minutes doivent être comprises entre 0 et 59</string>
|
<string name="minutes_must_be_between_0_and_59">Les minutes doivent être comprises entre 0 et 59</string>
|
||||||
<string name="seconds_must_be_between_0_and_59">Les secondes doivent être comprises entre 0 et 59</string>
|
<string name="seconds_must_be_between_0_and_59">Les secondes doivent être comprises entre 0 et 59</string>
|
||||||
|
|
@ -714,6 +773,7 @@
|
||||||
<string name="confirm_uninstall">Confirmer la désinstallation</string>
|
<string name="confirm_uninstall">Confirmer la désinstallation</string>
|
||||||
<string name="confirm_uninstall_description">Êtes-vous sûr de vouloir désinstaller cette extension ?</string>
|
<string name="confirm_uninstall_description">Êtes-vous sûr de vouloir désinstaller cette extension ?</string>
|
||||||
<string name="verify_integrity">Vérifier l\'intégrité</string>
|
<string name="verify_integrity">Vérifier l\'intégrité</string>
|
||||||
|
<string name="verifying">Vérification...</string>
|
||||||
<string name="verify_success">La vérification de l\'intégrité a réussi !</string>
|
<string name="verify_success">La vérification de l\'intégrité a réussi !</string>
|
||||||
<string name="verify_failure">La vérification de l\'intégrité a échoué !</string>
|
<string name="verify_failure">La vérification de l\'intégrité a échoué !</string>
|
||||||
<string name="verify_failure_description">Le contenu d\'un fichier peut être corrompu</string>
|
<string name="verify_failure_description">Le contenu d\'un fichier peut être corrompu</string>
|
||||||
|
|
@ -785,6 +845,7 @@
|
||||||
<string name="emulation_control_opacity">Opacité</string>
|
<string name="emulation_control_opacity">Opacité</string>
|
||||||
<string name="emulation_touch_overlay_reset">Réinitialiser l\'overlay</string>
|
<string name="emulation_touch_overlay_reset">Réinitialiser l\'overlay</string>
|
||||||
<string name="emulation_touch_overlay_edit">Modifier l\'overlay</string>
|
<string name="emulation_touch_overlay_edit">Modifier l\'overlay</string>
|
||||||
|
<string name="emulation_snap_to_grid">Aimanter à la grille</string>
|
||||||
<string name="emulation_pause">Mettre en pause l\'émulation</string>
|
<string name="emulation_pause">Mettre en pause l\'émulation</string>
|
||||||
<string name="emulation_unpause">Reprendre l\'émulation</string>
|
<string name="emulation_unpause">Reprendre l\'émulation</string>
|
||||||
<string name="emulation_input_overlay">Options de l\'overlay</string>
|
<string name="emulation_input_overlay">Options de l\'overlay</string>
|
||||||
|
|
@ -838,6 +899,32 @@
|
||||||
<string name="clock_boost">Boost (1700MHz)</string>
|
<string name="clock_boost">Boost (1700MHz)</string>
|
||||||
<string name="clock_fast">Rapide (2000MHz)</string>
|
<string name="clock_fast">Rapide (2000MHz)</string>
|
||||||
|
|
||||||
|
<!-- GPU overclock factors -->
|
||||||
|
<string name="off">Désactivé</string>
|
||||||
|
<string name="fast_gpu_medium">Moyen (256)</string>
|
||||||
|
<string name="fast_gpu_high">Élevé (512)</string>
|
||||||
|
|
||||||
|
<!-- GPU swizzle texture size -->
|
||||||
|
<string name="gpu_texturesizeswizzle_verysmall">Très petit (16 Mo)</string>
|
||||||
|
<string name="gpu_texturesizeswizzle_small">Petit (32 Mo)</string>
|
||||||
|
<string name="gpu_texturesizeswizzle_normal">Normal (128 Mo)</string>
|
||||||
|
<string name="gpu_texturesizeswizzle_large">Large (256 Mo)</string>
|
||||||
|
<string name="gpu_texturesizeswizzle_verylarge">Très large (512 Mo)</string>
|
||||||
|
|
||||||
|
<!-- GPU swizzle streams -->
|
||||||
|
<string name="gpu_swizzle_verylow">Très faible (4 Mo)</string>
|
||||||
|
<string name="gpu_swizzle_low">Faible (8 Mo)</string>
|
||||||
|
<string name="gpu_swizzle_normal">Normal (16 Mo)</string>
|
||||||
|
<string name="gpu_swizzle_medium">Moyen (32 Mo)</string>
|
||||||
|
<string name="gpu_swizzle_high">Élevé (64 Mo)</string>
|
||||||
|
|
||||||
|
<!-- GPU swizzle chunks -->
|
||||||
|
<string name="gpu_swizzlechunk_verylow">Très faible (32)</string>
|
||||||
|
<string name="gpu_swizzlechunk_low">Faible (64)</string>
|
||||||
|
<string name="gpu_swizzlechunk_normal">Normal (128)</string>
|
||||||
|
<string name="gpu_swizzlechunk_medium">Moyen (256)</string>
|
||||||
|
<string name="gpu_swizzlechunk_high">Élevé (512)</string>
|
||||||
|
|
||||||
<!-- Temperature Units -->
|
<!-- Temperature Units -->
|
||||||
<string name="temperature_celsius">Celsius</string>
|
<string name="temperature_celsius">Celsius</string>
|
||||||
<string name="temperature_fahrenheit">Fahrenheit</string>
|
<string name="temperature_fahrenheit">Fahrenheit</string>
|
||||||
|
|
@ -853,6 +940,11 @@
|
||||||
|
|
||||||
<string name="renderer_none">Aucune</string>
|
<string name="renderer_none">Aucune</string>
|
||||||
|
|
||||||
|
<!-- Renderer Accuracy -->
|
||||||
|
<string name="renderer_accuracy_low">Rapide</string>
|
||||||
|
<string name="renderer_accuracy_medium">Moyen</string>
|
||||||
|
<string name="renderer_accuracy_high">Précis</string>
|
||||||
|
|
||||||
<!-- DMA Accuracy -->
|
<!-- DMA Accuracy -->
|
||||||
<string name="dma_accuracy_default">Défaut</string>
|
<string name="dma_accuracy_default">Défaut</string>
|
||||||
<string name="dma_accuracy_unsafe">Dangereux</string>
|
<string name="dma_accuracy_unsafe">Dangereux</string>
|
||||||
|
|
@ -886,6 +978,26 @@
|
||||||
<string name="cpu_accuracy_paranoid">Paranoïaque</string>
|
<string name="cpu_accuracy_paranoid">Paranoïaque</string>
|
||||||
<string name="cpu_accuracy_debugging">Débogage</string>
|
<string name="cpu_accuracy_debugging">Débogage</string>
|
||||||
|
|
||||||
|
<!-- Freedreno Settings -->
|
||||||
|
<string name="freedreno_settings_title">Paramètres de Freedreno</string>
|
||||||
|
<string name="gpu_driver_settings">Paramètres du pilote GPU</string>
|
||||||
|
<string name="freedreno_presets">Préréglages rapides</string>
|
||||||
|
<string name="freedreno_current_settings">Paramètres actuels</string>
|
||||||
|
<string name="freedreno_debug">Paramètres avancés</string>
|
||||||
|
<string name="freedreno_var_value">Valeur de la variable</string>
|
||||||
|
<string name="freedreno_add_variable">Ajouter la variable</string>
|
||||||
|
<string name="freedreno_clear_all">Effacer tout</string>
|
||||||
|
<string name="freedreno_saved">Configuration Freedreno sauvegardée</string>
|
||||||
|
<string name="freedreno_cleared_all">Toutes les variables Freedreno effacées</string>
|
||||||
|
<string name="freedreno_variable_added">Variable %1$s ajouté</string>
|
||||||
|
<string name="freedreno_preset_applied">Préréglage \'%1$s\' appliqué</string>
|
||||||
|
<string name="freedreno_error_empty_name">Le nom de la variable ne peut pas être vide</string>
|
||||||
|
<string name="freedreno_error_setting_variable">Échec de l\'assignation de la variable</string>
|
||||||
|
<string name="freedreno_info_title">À propos de la configuration Freedreno</string>
|
||||||
|
<string name="freedreno_per_game_title">Paramètres de Freedreno</string>
|
||||||
|
<string name="freedreno_per_game_description">Configurer les paramètres du pilote GPU pour ce jeu</string>
|
||||||
|
<string name="freedreno_per_game_saved">Configuration Freedreno sauvegardée</string>
|
||||||
|
|
||||||
<!-- Gamepad Buttons -->
|
<!-- Gamepad Buttons -->
|
||||||
<string name="gamepad_d_pad">Pavé directionnel</string>
|
<string name="gamepad_d_pad">Pavé directionnel</string>
|
||||||
<string name="gamepad_left_stick">Stick gauche</string>
|
<string name="gamepad_left_stick">Stick gauche</string>
|
||||||
|
|
@ -902,26 +1014,37 @@
|
||||||
<string name="theme_material_you">Material You</string>
|
<string name="theme_material_you">Material You</string>
|
||||||
<string name="app_settings">Paramètres de l’App</string>
|
<string name="app_settings">Paramètres de l’App</string>
|
||||||
<string name="theme_and_color">Thème et Couleur</string>
|
<string name="theme_and_color">Thème et Couleur</string>
|
||||||
|
<string name="fullscreen_mode">Mode plein écran</string>
|
||||||
<!-- Theme Modes -->
|
<!-- Theme Modes -->
|
||||||
<string name="change_theme_mode">Changer le mode de thème</string>
|
<string name="change_theme_mode">Changer le mode de thème</string>
|
||||||
<string name="theme_mode_follow_system">Automatique</string>
|
<string name="theme_mode_follow_system">Automatique</string>
|
||||||
<string name="theme_mode_light">Lumineux</string>
|
<string name="theme_mode_light">Lumineux</string>
|
||||||
<string name="theme_mode_dark">Sombre</string>
|
<string name="theme_mode_dark">Sombre</string>
|
||||||
|
|
||||||
|
<string name="multiplier_none">Aucun</string>
|
||||||
|
|
||||||
<!-- Black backgrounds theme -->
|
<!-- Black backgrounds theme -->
|
||||||
<string name="use_black_backgrounds">Arrière-plan noir</string>
|
<string name="use_black_backgrounds">Arrière-plan noir</string>
|
||||||
<string name="use_black_backgrounds_description">Lorsque vous utilisez le thème sombre, appliquer un arrière-plan noir.</string>
|
<string name="use_black_backgrounds_description">Lorsque vous utilisez le thème sombre, appliquer un arrière-plan noir.</string>
|
||||||
|
|
||||||
|
<!-- Buttons -->
|
||||||
|
<string name="enable_folder_button">Dossier</string>
|
||||||
|
<string name="enable_folder_button_description">Afficher le bouton pour ajouter les dossiers de jeu</string>
|
||||||
|
<string name="enable_qlaunch_button">QLaunch</string>
|
||||||
|
<string name="enable_qlaunch_button_description">Afficher le bouton pour lancer QLaunch</string>
|
||||||
|
|
||||||
<!-- App Language -->
|
<!-- App Language -->
|
||||||
<string name="app_language">Language de l\'application</string>
|
<string name="app_language">Language de l\'application</string>
|
||||||
<string name="app_language_description">Changer la langue de l\'interface</string>
|
<string name="app_language_description">Changer la langue de l\'interface</string>
|
||||||
<string name="app_language_system">Suivre le système</string>
|
<string name="app_language_system">Suivre le système</string>
|
||||||
<!-- Static Themes -->
|
<!-- Static Themes -->
|
||||||
<string name="static_theme_color">Couleur du thème</string>
|
<string name="static_theme_color">Couleur du thème</string>
|
||||||
|
<string name="eden_theme">Eden</string>
|
||||||
<string name="violet">Violet (Par défaut)</string>
|
<string name="violet">Violet (Par défaut)</string>
|
||||||
<string name="blue">Bleu</string>
|
<string name="blue">Bleu</string>
|
||||||
<string name="cyan">Cyan</string>
|
<string name="cyan">Cyan</string>
|
||||||
<string name="red">Rouge</string>
|
<string name="red">Rouge</string>
|
||||||
|
<string name="green">Vert</string>
|
||||||
<string name="yellow">Jaune</string>
|
<string name="yellow">Jaune</string>
|
||||||
<string name="orange">Orange</string>
|
<string name="orange">Orange</string>
|
||||||
<string name="pink">Rose</string>
|
<string name="pink">Rose</string>
|
||||||
|
|
@ -940,6 +1063,8 @@
|
||||||
|
|
||||||
<!-- Applet Modes -->
|
<!-- Applet Modes -->
|
||||||
<string name="applets_menu">Applets</string>
|
<string name="applets_menu">Applets</string>
|
||||||
|
<string name="applets_menu_description">Modifier les frontends et paramètres des applets</string>
|
||||||
|
|
||||||
<string name="applet_hle">Frontend personnalisé</string>
|
<string name="applet_hle">Frontend personnalisé</string>
|
||||||
<string name="applet_lle">Applet réel</string>
|
<string name="applet_lle">Applet réel</string>
|
||||||
|
|
||||||
|
|
@ -948,7 +1073,39 @@
|
||||||
<string name="airplane_mode">Mode avion</string>
|
<string name="airplane_mode">Mode avion</string>
|
||||||
<string name="airplane_mode_description">Passe le mode avion au système d\'exploitation Switch</string>
|
<string name="airplane_mode_description">Passe le mode avion au système d\'exploitation Switch</string>
|
||||||
|
|
||||||
|
<string name="enable_overlay">Activer l\'applet d\'overlay</string>
|
||||||
|
<!-- Profile Management -->
|
||||||
|
<string name="profile_manager">Gestionnaire de profil</string>
|
||||||
|
<string name="profile_manager_description">Gérer les profils utilisateurs</string>
|
||||||
|
<string name="profile_add_user">Ajouter un utilisateur</string>
|
||||||
|
<string name="profile_new_user">Nouvel utilisateur</string>
|
||||||
|
<string name="profile_edit_user">Modifier l\'utilisateur</string>
|
||||||
|
<string name="profile_edit">Éditer</string>
|
||||||
|
<string name="profile_delete">Supprimer</string>
|
||||||
|
<string name="profile_username">Nom d\'utilisateur</string>
|
||||||
|
<string name="profile_uuid">ID de l\'utilisateur (UUID)</string>
|
||||||
|
<string name="profile_uuid_description">Il s\'agit de l\'identifiant unique de ce profil utilisateur. Il ne peut pas être changé après sa création.</string>
|
||||||
|
<string name="profile_generate">Générer</string>
|
||||||
|
<string name="profile_avatar">Avatar de l\'utilisateur</string>
|
||||||
|
<string name="profile_select_image">Sélectionner l\'image</string>
|
||||||
|
<string name="profile_firmware_avatars">Avatars du firmware</string>
|
||||||
|
<string name="profile_firmware_avatars_unavailable">Avatars du firmware non disponibles. Veuillez installer le firmware pour utiliser cette fonctionnalité.</string>
|
||||||
|
<string name="profile_revert_image">Restaurer à la valeur par défaut</string>
|
||||||
|
<string name="profile_current_user">Utilisateur actuel</string>
|
||||||
|
<string name="profile_max_users_title">Nombre d\'Utilisateurs Maximum Atteint</string>
|
||||||
|
<string name="profile_max_users_message">Vous ne pouvez pas créer plus du 8 profils utilisateurs. Veuillez supprimer un des profils existants pour en créer un nouveau.</string>
|
||||||
|
<string name="profile_delete_confirm_title">Supprimer le profil \?</string>
|
||||||
|
<string name="profile_create_failed">Échec de la création du profil utilisateur</string>
|
||||||
|
<string name="profile_update_failed">Échec de la mise à jour du profil utilisateur</string>
|
||||||
|
<string name="profile_image_load_error">Échec du chargement de l\'image : %1$s</string>
|
||||||
|
<string name="profile_image_save_error">Échec de la sauvegarde de l\'image : %1$s</string>
|
||||||
|
<string name="error">Erreur</string>
|
||||||
|
|
||||||
<!-- Licenses screen strings -->
|
<!-- Licenses screen strings -->
|
||||||
<string name="licenses">Licences</string>
|
<string name="licenses">Licences</string>
|
||||||
<string name="license_fidelityfx_fsr_description">Mise à l\'échelle de haute qualité par AMD.</string>
|
<string name="license_fidelityfx_fsr_description">Mise à l\'échelle de haute qualité par AMD.</string>
|
||||||
</resources>
|
<string name="external_content">Contenu externe</string>
|
||||||
|
<string name="add_folders">Ajouter un dossier</string>
|
||||||
|
<string name="percent">%1$d%%</string>
|
||||||
|
|
||||||
|
</resources>
|
||||||
|
|
|
||||||
|
|
@ -359,8 +359,6 @@
|
||||||
<string name="renderer_resolution">רזולוציה (מעוגן/נייד)</string>
|
<string name="renderer_resolution">רזולוציה (מעוגן/נייד)</string>
|
||||||
<string name="renderer_vsync">מצב VSync</string>
|
<string name="renderer_vsync">מצב VSync</string>
|
||||||
<string name="renderer_scaling_filter">פילטר מתאם חלון</string>
|
<string name="renderer_scaling_filter">פילטר מתאם חלון</string>
|
||||||
<string name="fsr_sharpness">חדות FSR</string>
|
|
||||||
<string name="fsr_sharpness_description">קובע את מידת החדות בעת שימוש ב-FSR.</string>
|
|
||||||
<string name="renderer_anti_aliasing">שיטת Anti-aliasing</string>
|
<string name="renderer_anti_aliasing">שיטת Anti-aliasing</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -348,8 +348,6 @@
|
||||||
<string name="renderer_resolution">Felbontás (Kézi/Dockolt)</string>
|
<string name="renderer_resolution">Felbontás (Kézi/Dockolt)</string>
|
||||||
<string name="renderer_vsync">VSync mód</string>
|
<string name="renderer_vsync">VSync mód</string>
|
||||||
<string name="renderer_scaling_filter">Ablakhoz alkalmazkodó szűrő</string>
|
<string name="renderer_scaling_filter">Ablakhoz alkalmazkodó szűrő</string>
|
||||||
<string name="fsr_sharpness">FSR élesség</string>
|
|
||||||
<string name="fsr_sharpness_description">Meghatározza, milyen éles lesz a kép az FSR dinamikus kontraszt használata közben.</string>
|
|
||||||
<string name="renderer_anti_aliasing">Élsimítási módszer</string>
|
<string name="renderer_anti_aliasing">Élsimítási módszer</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -380,8 +380,6 @@
|
||||||
<string name="renderer_resolution">Resolusi (Handheld/Docked)</string>
|
<string name="renderer_resolution">Resolusi (Handheld/Docked)</string>
|
||||||
<string name="renderer_vsync">Mode Sinkronisasi Vertikal</string>
|
<string name="renderer_vsync">Mode Sinkronisasi Vertikal</string>
|
||||||
<string name="renderer_scaling_filter">Filter penyesuaian jendela</string>
|
<string name="renderer_scaling_filter">Filter penyesuaian jendela</string>
|
||||||
<string name="fsr_sharpness">Ketajaman FSR</string>
|
|
||||||
<string name="fsr_sharpness_description">Menentukan seberapa tajam gambar akan terlihat saat menggunakan kontras dinamis FSR</string>
|
|
||||||
<string name="renderer_anti_aliasing">Metode anti-aliasing</string>
|
<string name="renderer_anti_aliasing">Metode anti-aliasing</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -387,8 +387,6 @@
|
||||||
<string name="renderer_resolution">Risoluzione (Portatile/Docked)</string>
|
<string name="renderer_resolution">Risoluzione (Portatile/Docked)</string>
|
||||||
<string name="renderer_vsync">Modalità VSync</string>
|
<string name="renderer_vsync">Modalità VSync</string>
|
||||||
<string name="renderer_scaling_filter">Filtro adattivo della finestra </string>
|
<string name="renderer_scaling_filter">Filtro adattivo della finestra </string>
|
||||||
<string name="fsr_sharpness">Nitidezza FSR</string>
|
|
||||||
<string name="fsr_sharpness_description">Determina quanto sarà nitida l\'immagine utilizzando il contrasto dinamico di FSR</string>
|
|
||||||
<string name="renderer_anti_aliasing">Metodo di anti-aliasing</string>
|
<string name="renderer_anti_aliasing">Metodo di anti-aliasing</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
<string name="notification_permission_not_granted">알림 권한이 부여되지 않았습니다!</string>
|
<string name="notification_permission_not_granted">알림 권한이 부여되지 않았습니다!</string>
|
||||||
<!-- Stats Overlay settings -->
|
<!-- Stats Overlay settings -->
|
||||||
<string name="process_ram">프로세스 RAM: %1$d MB</string>
|
<string name="process_ram">프로세스 RAM: %1$d MB</string>
|
||||||
<string name="shaders_prefix">셰이더</string>
|
<string name="shaders_prefix">구축 중</string>
|
||||||
<string name="shaders_suffix">빌드 중</string>
|
<string name="shaders_suffix">개 셰이더</string>
|
||||||
<string name="charging">(충전 중)</string>
|
<string name="charging">(충전 중)</string>
|
||||||
|
|
||||||
<string name="system_info_label">시스템:</string>
|
<string name="system_info_label">시스템:</string>
|
||||||
|
|
|
||||||