Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9a59eb42d8 | |||
| 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=$(date "+%Y")
|
YEAR=2026
|
||||||
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|*.ps1|*.py|*.rb|*.perl|*.pl|*.nix|*CMakeLists.txt)
|
*.cmake|*.sh|*CMakeLists.txt)
|
||||||
begin="#"
|
begin="#"
|
||||||
;;
|
;;
|
||||||
*.kt|*.kts|*.cpp|*.h|*.qml|*.c|*.hpp|*.hxx|*.cxx|*.h.in|*.inc)
|
*.kt*|*.cpp|*.h|*.qml)
|
||||||
begin="//"
|
begin="//"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -185,12 +185,11 @@ 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
|
||||||
# Windows Powershell wont use shebangs
|
*.cmake|*CMakeLists.txt)
|
||||||
*.cmake|*.ps1|*CMakeLists.txt)
|
|
||||||
begin="#"
|
begin="#"
|
||||||
shell="false"
|
shell="false"
|
||||||
;;
|
;;
|
||||||
*.sh|*.py|*.rb|*.perl|*.pl|*.nix)
|
*.sh)
|
||||||
begin="#"
|
begin="#"
|
||||||
shell=true
|
shell=true
|
||||||
;;
|
;;
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
#!/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 ..
|
||||||
@@ -119,13 +119,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 +190,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 +228,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)
|
||||||
@@ -358,10 +360,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
|
||||||
# ===========================
|
# ===========================
|
||||||
|
|
||||||
@@ -559,7 +557,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)
|
||||||
@@ -730,6 +728,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 +742,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()
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -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"
|
|
||||||
@@ -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="base.svg.2026_01_12_14_43_47.0.svg"
|
sodipodi:docname="1stanni.svg"
|
||||||
inkscape:version="1.4.2 (ebf0e94, 2025-05-08)"
|
inkscape:version="1.4.3 (0d15f75042, 2025-12-25)"
|
||||||
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,36 +19,34 @@
|
|||||||
<defs
|
<defs
|
||||||
id="defs7">
|
id="defs7">
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="linearGradient1"
|
id="linearGradient34"
|
||||||
inkscape:collect="always">
|
inkscape:collect="always">
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#ff2e88;stop-opacity:0.5;"
|
style="stop-color:#ffd700;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
id="stop3" />
|
id="stop34" />
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#bf42f6;stop-opacity:0.5;"
|
style="stop-color:#ffd700;stop-opacity:0.48031053;"
|
||||||
offset="0.44631511"
|
offset="1"
|
||||||
id="stop4" />
|
id="stop35" />
|
||||||
<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="linearGradient138"
|
id="linearGradient21"
|
||||||
inkscape:collect="always">
|
inkscape:collect="always">
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#ff2e88;stop-opacity:1;"
|
style="stop-color:#3a0057;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
id="stop152" />
|
id="stop21" />
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#bf42f6;stop-opacity:1;"
|
style="stop-color:#830091;stop-opacity:1;"
|
||||||
offset="0.44971901"
|
offset="1"
|
||||||
id="stop137" />
|
id="stop22" />
|
||||||
<stop
|
|
||||||
style="stop-color:#5da5ed;stop-opacity:1;"
|
|
||||||
offset="0.89793283"
|
|
||||||
id="stop138" />
|
|
||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="swatch37"
|
id="swatch37"
|
||||||
@@ -116,33 +114,6 @@
|
|||||||
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">
|
||||||
@@ -165,16 +136,6 @@
|
|||||||
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">
|
||||||
@@ -187,14 +148,106 @@
|
|||||||
</clipPath>
|
</clipPath>
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
xlink:href="#linearGradient1"
|
xlink:href="#linearGradient21"
|
||||||
id="linearGradient2"
|
id="linearGradient22"
|
||||||
x1="256"
|
x1="256"
|
||||||
y1="64"
|
y1="0"
|
||||||
x2="256"
|
x2="256"
|
||||||
y2="448"
|
y2="512"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse" />
|
||||||
gradientTransform="matrix(1.3229974,0,0,1.3214002,-82.687336,-82.290326)" />
|
<linearGradient
|
||||||
|
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"
|
||||||
@@ -205,23 +258,29 @@
|
|||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pagecheckerboard="0"
|
inkscape:pagecheckerboard="0"
|
||||||
inkscape:deskcolor="#d1d1d1"
|
inkscape:deskcolor="#d1d1d1"
|
||||||
inkscape:zoom="1.4142136"
|
inkscape:zoom="1"
|
||||||
inkscape:cx="261.62951"
|
inkscape:cx="213.49999"
|
||||||
inkscape:cy="230.87036"
|
inkscape:cy="248.99999"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1600"
|
||||||
inkscape:window-height="1008"
|
inkscape:window-height="849"
|
||||||
inkscape:window-x="1080"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="351"
|
inkscape:window-y="27"
|
||||||
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: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"
|
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"
|
||||||
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:url(#linearGradient27);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:none;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: 13 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 256 KiB After Width: | Height: | Size: 256 KiB |
|
Before Width: | Height: | Size: 335 KiB After Width: | Height: | Size: 556 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 27 KiB |
@@ -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 -e' >cc
|
echo '#!/bin/sh' >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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# HOS Kernel
|
||||||
|
|
||||||
|
In brief, the HOS kernel is a microkernel, some 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, 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,26 @@
|
|||||||
|
|
||||||
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)**
|
||||||
- **[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 +30,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)**
|
||||||
|
|||||||
@@ -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;
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
# 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.
|
||||||
@@ -12,6 +13,7 @@ There are two main applications, an SDL2 based app (`eden-cli`) and a Qt based a
|
|||||||
- `-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.
|
||||||
|
|||||||
@@ -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)**
|
||||||
|
|||||||
@@ -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/sh -e
|
#!/bin/bash
|
||||||
emuName="eden" #parameterize me
|
emuName="eden" #parameterize me
|
||||||
|
|
||||||
. "$HOME/.config/EmuDeck/backend/functions/all.sh"
|
. "$HOME/.config/EmuDeck/backend/functions/all.sh"
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ 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.
|
||||||
|
|||||||
@@ -136,8 +136,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 +157,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)
|
||||||
|
|||||||
@@ -122,13 +122,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",
|
||||||
@@ -156,22 +156,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",
|
||||||
|
|||||||
@@ -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}")
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
// 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
|
||||||
|
|
||||||
@@ -12,10 +9,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,7 +1,5 @@
|
|||||||
#!/bin/sh -e
|
#!/bin/sh
|
||||||
|
|
||||||
# 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
|
||||||
|
|
||||||
@@ -12,19 +10,20 @@ 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<<EOF
|
cat<<END
|
||||||
|
|
||||||
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
|
||||||
EOF
|
END
|
||||||
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<<EOF
|
cat<<END
|
||||||
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.
|
||||||
EOF
|
END
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
#!/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 = []; };
|
||||||
@@ -20,7 +16,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
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -21,41 +21,20 @@ 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)
|
||||||
@@ -180,7 +159,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)
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 61 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/SGSR</string>
|
<string name="fsr_sharpness">حدة FSR</string>
|
||||||
<string name="fsr_sharpness_description">يحدد مدى وضوح الصورة عند استخدام مرشحات FSR أو SGSR</string>
|
<string name="fsr_sharpness_description">يحدد مدى وضوح الصورة عند استخدام التباين الديناميكي لـ FSR</string>
|
||||||
<string name="renderer_anti_aliasing">طريقة مضاد التعرج</string>
|
<string name="renderer_anti_aliasing">طريقة مضاد التعرج</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -329,6 +329,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_description">دیاریکردنی تیژی وێنە لە کاتی بەکارهێنانی FSR</string>
|
||||||
<string name="renderer_anti_aliasing">شێوازی دژە-خاوڕۆیی</string>
|
<string name="renderer_anti_aliasing">شێوازی دژە-خاوڕۆیی</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -439,6 +439,8 @@
|
|||||||
<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,6 +439,8 @@ 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 del sistema usando el firmware instalado</string>
|
<string name="applets_description">Ejecutar applets de 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/SGSR</string>
|
<string name="fsr_sharpness">Nitidez FSR</string>
|
||||||
<string name="fsr_sharpness_description">Determina el grado de nitidez de la imagen al usar filtros FSR o 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="renderer_anti_aliasing">Método de suavizado de bordes</string>
|
<string name="renderer_anti_aliasing">Método de suavizado de bordes</string>
|
||||||
|
|
||||||
|
|
||||||
@@ -1072,7 +1072,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 se usa el modo oscuro, aplicar fondos de pantalla negros.</string>
|
<string name="use_black_backgrounds_description">Cuando utilice el modo oscuro, aplique fondos negros.</string>
|
||||||
|
|
||||||
<!-- Buttons -->
|
<!-- Buttons -->
|
||||||
<string name="enable_folder_button">Carpeta</string>
|
<string name="enable_folder_button">Carpeta</string>
|
||||||
|
|||||||
@@ -454,12 +454,11 @@
|
|||||||
<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>
|
||||||
@@ -475,29 +474,15 @@
|
|||||||
<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>
|
||||||
@@ -523,21 +508,6 @@
|
|||||||
<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>
|
||||||
@@ -620,7 +590,6 @@
|
|||||||
|
|
||||||
<!-- 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>
|
||||||
@@ -659,7 +628,6 @@
|
|||||||
<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>
|
||||||
|
|
||||||
@@ -679,7 +647,6 @@
|
|||||||
<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>
|
||||||
|
|
||||||
@@ -689,9 +656,6 @@
|
|||||||
<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>
|
||||||
@@ -699,25 +663,6 @@
|
|||||||
<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>
|
||||||
@@ -731,7 +676,6 @@
|
|||||||
<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>
|
||||||
@@ -739,9 +683,6 @@
|
|||||||
<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>
|
||||||
@@ -773,7 +714,6 @@
|
|||||||
<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>
|
||||||
@@ -845,7 +785,6 @@
|
|||||||
<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>
|
||||||
@@ -899,32 +838,6 @@
|
|||||||
<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>
|
||||||
@@ -940,11 +853,6 @@
|
|||||||
|
|
||||||
<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>
|
||||||
@@ -978,26 +886,6 @@
|
|||||||
<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>
|
||||||
@@ -1014,37 +902,26 @@
|
|||||||
<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>
|
||||||
@@ -1063,8 +940,6 @@
|
|||||||
|
|
||||||
<!-- 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>
|
||||||
|
|
||||||
@@ -1073,39 +948,7 @@
|
|||||||
<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>
|
||||||
<string name="external_content">Contenu externe</string>
|
</resources>
|
||||||
<string name="add_folders">Ajouter un dossier</string>
|
|
||||||
<string name="percent">%1$d%%</string>
|
|
||||||
|
|
||||||
</resources>
|
|
||||||
|
|||||||
@@ -359,6 +359,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_description">קובע את מידת החדות בעת שימוש ב-FSR.</string>
|
||||||
<string name="renderer_anti_aliasing">שיטת Anti-aliasing</string>
|
<string name="renderer_anti_aliasing">שיטת Anti-aliasing</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -348,6 +348,8 @@
|
|||||||
<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,6 +380,8 @@
|
|||||||
<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,6 +387,8 @@
|
|||||||
<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>
|
||||||
|
|||||||
@@ -329,6 +329,8 @@
|
|||||||
<string name="renderer_resolution">Oppløsning (håndholdt/dokket)</string>
|
<string name="renderer_resolution">Oppløsning (håndholdt/dokket)</string>
|
||||||
<string name="renderer_vsync">VSync-modus</string>
|
<string name="renderer_vsync">VSync-modus</string>
|
||||||
<string name="renderer_scaling_filter">Filter for vindustilpasning</string>
|
<string name="renderer_scaling_filter">Filter for vindustilpasning</string>
|
||||||
|
<string name="fsr_sharpness">FSR-skarphet</string>
|
||||||
|
<string name="fsr_sharpness_description">Bestemmer bildekvalitet med FSR</string>
|
||||||
<string name="renderer_anti_aliasing">Anti-aliasing-metode</string>
|
<string name="renderer_anti_aliasing">Anti-aliasing-metode</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -439,6 +439,8 @@
|
|||||||
<string name="renderer_resolution">Rozdzielczość (Handheld/Zadokowany)</string>
|
<string name="renderer_resolution">Rozdzielczość (Handheld/Zadokowany)</string>
|
||||||
<string name="renderer_vsync">Synchronizacja pionowa VSync</string>
|
<string name="renderer_vsync">Synchronizacja pionowa VSync</string>
|
||||||
<string name="renderer_scaling_filter">Filtr adaptacji rozdzielczości</string>
|
<string name="renderer_scaling_filter">Filtr adaptacji rozdzielczości</string>
|
||||||
|
<string name="fsr_sharpness">Ostrość FSR</string>
|
||||||
|
<string name="fsr_sharpness_description">Kontroluje ostrość obrazu w FSR.</string>
|
||||||
<string name="renderer_anti_aliasing">Metoda wygładzania krawędzi</string>
|
<string name="renderer_anti_aliasing">Metoda wygładzania krawędzi</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -430,6 +430,8 @@
|
|||||||
<string name="renderer_resolution">Resolução (Portátil/Modo TV)</string>
|
<string name="renderer_resolution">Resolução (Portátil/Modo TV)</string>
|
||||||
<string name="renderer_vsync">Modo de VSync</string>
|
<string name="renderer_vsync">Modo de VSync</string>
|
||||||
<string name="renderer_scaling_filter">Filtro de Adaptação da Janela</string>
|
<string name="renderer_scaling_filter">Filtro de Adaptação da Janela</string>
|
||||||
|
<string name="fsr_sharpness">Nitidez do FSR</string>
|
||||||
|
<string name="fsr_sharpness_description">Determina a nitidez da imagem ao utilizar o contraste dinâmico do FSR</string>
|
||||||
<string name="renderer_anti_aliasing">Método de Anti-aliasing</string>
|
<string name="renderer_anti_aliasing">Método de Anti-aliasing</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -352,6 +352,8 @@
|
|||||||
<string name="renderer_resolution">Resolução (Portátil/Ancorado)</string>
|
<string name="renderer_resolution">Resolução (Portátil/Ancorado)</string>
|
||||||
<string name="renderer_vsync">Modo VSync</string>
|
<string name="renderer_vsync">Modo VSync</string>
|
||||||
<string name="renderer_scaling_filter">Filtro de Adaptação da Janela</string>
|
<string name="renderer_scaling_filter">Filtro de Adaptação da Janela</string>
|
||||||
|
<string name="fsr_sharpness">Nitidez do FSR</string>
|
||||||
|
<string name="fsr_sharpness_description">Determina a nitidez da imagem ao usar contraste dinâmico do FSR</string>
|
||||||
<string name="renderer_anti_aliasing">Método de Anti-Serrilhado</string>
|
<string name="renderer_anti_aliasing">Método de Anti-Serrilhado</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -458,8 +458,8 @@
|
|||||||
<string name="renderer_resolution">Разрешение (портативное/в док-станции)</string>
|
<string name="renderer_resolution">Разрешение (портативное/в док-станции)</string>
|
||||||
<string name="renderer_vsync">Режим верт. синхронизации</string>
|
<string name="renderer_vsync">Режим верт. синхронизации</string>
|
||||||
<string name="renderer_scaling_filter">Фильтр адаптации окна</string>
|
<string name="renderer_scaling_filter">Фильтр адаптации окна</string>
|
||||||
<string name="fsr_sharpness">Резкость FSR/SGSR</string>
|
<string name="fsr_sharpness">Резкость FSR</string>
|
||||||
<string name="fsr_sharpness_description">Определяет, насколько чётким будет изображение при использовании динамического контраста FSR или SGSR фильтров</string>
|
<string name="fsr_sharpness_description">Определяет, насколько чётким будет изображение при использовании динамического контраста FSR.</string>
|
||||||
<string name="renderer_anti_aliasing">Метод сглаживания</string>
|
<string name="renderer_anti_aliasing">Метод сглаживания</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -351,6 +351,8 @@
|
|||||||
<string name="renderer_resolution">Резолуција (ручно / прикључено)</string>
|
<string name="renderer_resolution">Резолуција (ручно / прикључено)</string>
|
||||||
<string name="renderer_vsync">Всинц мод</string>
|
<string name="renderer_vsync">Всинц мод</string>
|
||||||
<string name="renderer_scaling_filter">Филтер прилагођавања прозора</string>
|
<string name="renderer_scaling_filter">Филтер прилагођавања прозора</string>
|
||||||
|
<string name="fsr_sharpness">ФСР оштрина</string>
|
||||||
|
<string name="fsr_sharpness_description">Одређује колико ће се слика наоштрен трајати док користи \"ФСР\" динамички контраст</string>
|
||||||
<string name="renderer_anti_aliasing">Метода против алиасирања</string>
|
<string name="renderer_anti_aliasing">Метода против алиасирања</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
<string name="app_disclaimer">Цей застосунок запускає ігри для ігрової консолі Nintendo Switch. Він не містить ігор чи ключів.<br /><br />Перш ніж почати, укажіть розташування файлу <![CDATA[<b> prod.keys </b>]]> у пам’яті вашого пристрою.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Дізнатися більше</a>]]></string>
|
<string name="app_disclaimer">Цей застосунок запускає ігри для ігрової консолі Nintendo Switch. Він не містить ігор чи ключів.<br /><br />Перш ніж почати, укажіть розташування файлу <![CDATA[<b> prod.keys </b>]]> у пам’яті вашого пристрою.<br /><br /><![CDATA[<a href=\"https://yuzu-mirror.github.io/help/quickstart\">Дізнатися більше</a>]]></string>
|
||||||
<string name="notice_notification_channel_name">Сповіщення та помилки</string>
|
<string name="notice_notification_channel_name">Сповіщення та помилки</string>
|
||||||
<string name="notice_notification_channel_description">Показує сповіщення у разі виникнення проблем.</string>
|
<string name="notice_notification_channel_description">Виводить сповіщення у разі виникнення проблем.</string>
|
||||||
<string name="notification_permission_not_granted">Дозвіл на сповіщення не надано!</string>
|
<string name="notification_permission_not_granted">Дозвіл на сповіщення не надано!</string>
|
||||||
<string name="app_notification_channel_description">Сповіщення емулятора Switch Eden</string>
|
<string name="app_notification_channel_description">Сповіщення емулятора Switch Eden</string>
|
||||||
<string name="app_notification_running">Eden працює</string>
|
<string name="app_notification_running">Eden працює</string>
|
||||||
@@ -458,8 +458,8 @@
|
|||||||
<string name="renderer_resolution">Роздільна здатність (Портативний/Док)</string>
|
<string name="renderer_resolution">Роздільна здатність (Портативний/Док)</string>
|
||||||
<string name="renderer_vsync">Режим верт. синхронізації</string>
|
<string name="renderer_vsync">Режим верт. синхронізації</string>
|
||||||
<string name="renderer_scaling_filter">Фільтр масштабування вікна</string>
|
<string name="renderer_scaling_filter">Фільтр масштабування вікна</string>
|
||||||
<string name="fsr_sharpness">Різкість FSR/SGSR</string>
|
<string name="fsr_sharpness">Різкість FSR</string>
|
||||||
<string name="fsr_sharpness_description">Визначає різкість зображення при використанні фільтрів FSR або SGSR.</string>
|
<string name="fsr_sharpness_description">Визначає різкість зображення при використанні FSR.</string>
|
||||||
<string name="renderer_anti_aliasing">Згладжування</string>
|
<string name="renderer_anti_aliasing">Згладжування</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -327,6 +327,8 @@
|
|||||||
<string name="renderer_resolution">Độ phân giải (Handheld/Docked)</string>
|
<string name="renderer_resolution">Độ phân giải (Handheld/Docked)</string>
|
||||||
<string name="renderer_vsync">Chế độ VSync</string>
|
<string name="renderer_vsync">Chế độ VSync</string>
|
||||||
<string name="renderer_scaling_filter">Bộ lọc điều chỉnh cửa sổ</string>
|
<string name="renderer_scaling_filter">Bộ lọc điều chỉnh cửa sổ</string>
|
||||||
|
<string name="fsr_sharpness">Độ sắc nét FSR</string>
|
||||||
|
<string name="fsr_sharpness_description">Độ sắc nét khi dùng FSR</string>
|
||||||
<string name="renderer_anti_aliasing">Phương pháp khử răng cưa</string>
|
<string name="renderer_anti_aliasing">Phương pháp khử răng cưa</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -106,7 +106,7 @@
|
|||||||
|
|
||||||
<!-- NVDEC Emulation -->
|
<!-- NVDEC Emulation -->
|
||||||
<string name="nvdec_emulation">NVDEC模拟</string>
|
<string name="nvdec_emulation">NVDEC模拟</string>
|
||||||
<string name="nvdec_emulation_description">播放过场与开场动画期间的视频解码处理方式(NVDEC)。</string>
|
<string name="nvdec_emulation_description">选择视频解码处理方式</string>
|
||||||
<string name="nvdec_emulation_none">禁用</string>
|
<string name="nvdec_emulation_none">禁用</string>
|
||||||
|
|
||||||
<!-- Optimize SPIRV output -->
|
<!-- Optimize SPIRV output -->
|
||||||
@@ -181,14 +181,14 @@
|
|||||||
<string name="multiplayer_hide_full_rooms">隐藏满员房间</string>
|
<string name="multiplayer_hide_full_rooms">隐藏满员房间</string>
|
||||||
<string name="multiplayer_hide_empty_rooms">隐藏空房间</string>
|
<string name="multiplayer_hide_empty_rooms">隐藏空房间</string>
|
||||||
<string name="multiplayer_tap_refresh_to_check_again">点击刷新重试</string>
|
<string name="multiplayer_tap_refresh_to_check_again">点击刷新重试</string>
|
||||||
<string name="multiplayer_search_public_lobbies">搜索游戏大厅…</string>
|
<string name="multiplayer_search_public_lobbies">搜索房间…</string>
|
||||||
<string name="multiplayer_preferred_game_name">首选游戏</string>
|
<string name="multiplayer_preferred_game_name">首选游戏</string>
|
||||||
<string name="multiplayer_lobby_type">游戏大厅类型</string>
|
<string name="multiplayer_lobby_type">大厅类型</string>
|
||||||
<string name="multiplayer_room_name_error">长度需为3-20个字符</string>
|
<string name="multiplayer_room_name_error">长度需为3-20个字符</string>
|
||||||
<string name="multiplayer_required">必填</string>
|
<string name="multiplayer_required">必填</string>
|
||||||
<string name="multiplayer_token_required">需要Web令牌,请前往高级设置 -> 系统 -> 网络</string>
|
<string name="multiplayer_token_required">需要Web令牌,请前往高级设置 -> 系统 -> 网络</string>
|
||||||
<string name="multiplayer_ip_error">IP格式无效</string>
|
<string name="multiplayer_ip_error">IP格式无效</string>
|
||||||
<string name="multiplayer_username_error">必须为4至20个字符,且仅包含字母、数字、点号、连字符、下划线和空格</string>
|
<string name="multiplayer_username_error">必须为4-20个字符(仅字母数字、点号、连字符、下划线和空格)</string>
|
||||||
<string name="multiplayer_nickname_invalid">用户名无效,请在系统→网络中检查设置</string>
|
<string name="multiplayer_nickname_invalid">用户名无效,请在系统→网络中检查设置</string>
|
||||||
<string name="multiplayer_token_error">必须为48个字符,且仅包含小写字母a-z</string>
|
<string name="multiplayer_token_error">必须为48个字符,且仅包含小写字母a-z</string>
|
||||||
<string name="multiplayer_port_error">端口需为1-65535</string>
|
<string name="multiplayer_port_error">端口需为1-65535</string>
|
||||||
@@ -437,23 +437,23 @@
|
|||||||
<string name="custom_cpu_ticks_description">设置自定义的CPU时钟值。更高的值可能提高性能,但也可能导致游戏卡顿。建议范围为77-21000。</string>
|
<string name="custom_cpu_ticks_description">设置自定义的CPU时钟值。更高的值可能提高性能,但也可能导致游戏卡顿。建议范围为77-21000。</string>
|
||||||
<string name="cpu_ticks">时钟</string>
|
<string name="cpu_ticks">时钟</string>
|
||||||
<string name="memory_layout">内存布局</string>
|
<string name="memory_layout">内存布局</string>
|
||||||
<string name="memory_layout_description">(实验性) 更改模拟内存布局。此项设置并不会提升性能,但可能有助于游戏通过 mods 来利用高分辨率。请不要在内存不大于 8GB 的手机上使用。仅适用于 Dynamic(JIT)后端。</string>
|
<string name="memory_layout_description">(实验性) 更改模拟内存布局。此设置不会提高性能,但可能有助于通过模组使用高分辨率的游戏。不要在 RAM 为 8GB 或更少的手机上使用。</string>
|
||||||
|
|
||||||
<string name="generate">生成</string>
|
<string name="generate">生成</string>
|
||||||
|
|
||||||
<!-- Network settings strings -->
|
<!-- Network settings strings -->
|
||||||
<string name="web_token">网络令牌</string>
|
<string name="web_token">网络令牌</string>
|
||||||
<string name="web_token_description">用于创建公共游戏大厅的 web token。这是一个仅包含小写字母 a-z 的 48 位字符串。</string>
|
<string name="web_token_description">用于创建公共房间的网络令牌。它是一个48个字符的字符串,仅包含小写字母a-z。</string>
|
||||||
<string name="web_username">网络用户名</string>
|
<string name="web_username">网络用户名</string>
|
||||||
<string name="web_username_description">在多人游戏大厅中显示的用户名。用户名必须为4至20个字符,且仅可包含字母、数字、连字符、点号、下划线和空格。</string>
|
<string name="web_username_description">多人游戏房间中显示的用户名。必须为4-20个字符(仅字母数字、连字符、点号、下划线和空格)。</string>
|
||||||
<string name="network">网络</string>
|
<string name="network">网络</string>
|
||||||
|
|
||||||
<!-- Graphics settings strings -->
|
<!-- Graphics settings strings -->
|
||||||
<string name="renderer_resolution">分辨率 (掌机模式/主机模式)</string>
|
<string name="renderer_resolution">分辨率 (掌机模式/主机模式)</string>
|
||||||
<string name="renderer_vsync">垂直同步模式</string>
|
<string name="renderer_vsync">垂直同步模式</string>
|
||||||
<string name="renderer_scaling_filter">窗口滤镜</string>
|
<string name="renderer_scaling_filter">窗口滤镜</string>
|
||||||
<string name="fsr_sharpness">FSR/SGSR 锐度</string>
|
<string name="fsr_sharpness">FSR 锐化度</string>
|
||||||
<string name="fsr_sharpness_description">确定在使用 FSR 或 SGSR 过滤器时的图像锐度</string>
|
<string name="fsr_sharpness_description">指定使用 FSR 时图像的锐化程度</string>
|
||||||
<string name="renderer_anti_aliasing">抗锯齿方式</string>
|
<string name="renderer_anti_aliasing">抗锯齿方式</string>
|
||||||
|
|
||||||
|
|
||||||
@@ -496,7 +496,7 @@
|
|||||||
<string name="fix_bloom_effects">修复 Bloom 效果</string>
|
<string name="fix_bloom_effects">修复 Bloom 效果</string>
|
||||||
<string name="fix_bloom_effects_description">减少《塞尔达传说:智慧的再现》(Adreno A6XX - A7XX/ Turnip)中的 bloom 模糊,并移除《Burnout》中的 bloom 效果。警告:可能会导致在其他游戏中出现图形异常。</string>
|
<string name="fix_bloom_effects_description">减少《塞尔达传说:智慧的再现》(Adreno A6XX - A7XX/ Turnip)中的 bloom 模糊,并移除《Burnout》中的 bloom 效果。警告:可能会导致在其他游戏中出现图形异常。</string>
|
||||||
<string name="emulate_bgr565">模拟 BGR565</string>
|
<string name="emulate_bgr565">模拟 BGR565</string>
|
||||||
<string name="emulate_bgr565_description">修复游戏中的颜色反转或是异常的画面瑕疵或阴影问题</string>
|
<string name="emulate_bgr565_description">修复了游戏中的颜色反转以及出现的异常画面瑕疵或奇怪阴影问题</string>
|
||||||
<string name="rescale_hack">启用旧版缩放处理</string>
|
<string name="rescale_hack">启用旧版缩放处理</string>
|
||||||
<string name="rescale_hack_description">启用通过使用快速缩放路径,来为游戏提供缩放配置处理的传统处理方式</string>
|
<string name="rescale_hack_description">启用通过使用快速缩放路径,来为游戏提供缩放配置处理的传统处理方式</string>
|
||||||
<string name="renderer_asynchronous_shaders">使用异步着色器</string>
|
<string name="renderer_asynchronous_shaders">使用异步着色器</string>
|
||||||
@@ -508,9 +508,9 @@
|
|||||||
<string name="gpu_unswizzle_texture_size">GPU 还原最大纹理尺寸</string>
|
<string name="gpu_unswizzle_texture_size">GPU 还原最大纹理尺寸</string>
|
||||||
<string name="gpu_unswizzle_texture_size_description">设置基于 GPU 的纹理还原的最大尺寸(单位:MiB)。\n虽然 GPU 在处理中型和大型纹理时速度更快,但对于非常小的纹理,CPU 的效率可能更高。\n调整此设置,以便在 GPU 加速和 CPU 开销之间找到最佳平衡点。</string>
|
<string name="gpu_unswizzle_texture_size_description">设置基于 GPU 的纹理还原的最大尺寸(单位:MiB)。\n虽然 GPU 在处理中型和大型纹理时速度更快,但对于非常小的纹理,CPU 的效率可能更高。\n调整此设置,以便在 GPU 加速和 CPU 开销之间找到最佳平衡点。</string>
|
||||||
<string name="gpu_unswizzle_stream_size">GPU 还原流大小</string>
|
<string name="gpu_unswizzle_stream_size">GPU 还原流大小</string>
|
||||||
<string name="gpu_unswizzle_stream_size_description">设置用于 unswizzling 大型纹理时的每帧数据限制。较高的数值可以加快纹理的加载速度,但会增加帧延迟。而较低的数值可以降低 GPU 的开销,但可能会导致可见的纹理 闪现。</string>
|
<string name="gpu_unswizzle_stream_size_description">设置每帧还原大型纹理的数据限制。较高的数值可以加快纹理加载速度,但代价是增加帧延迟(影响响应速度/平滑度);较低的数值可以减少 GPU 开销,但可能会导致明显的纹理突然出现(Pop-in)现象。</string>
|
||||||
<string name="gpu_unswizzle_chunk_size">GPU 还原块大小</string>
|
<string name="gpu_unswizzle_chunk_size">GPU 还原块大小</string>
|
||||||
<string name="gpu_unswizzle_chunk_size_description">定义了 3D 纹理每批次处理的深度切片数量。增加此数值可在高性能 GPU 上提升吞吐效率,但在性能较弱的硬件上可能会导致卡顿或驱动超时。</string>
|
<string name="gpu_unswizzle_chunk_size_description">定义了 3D 纹理在单个批次(Batch)中处理的深度切片(Depth Slices)数量。增加此数值可以提升强力 GPU 的吞吐效率,但在性能较弱的硬件上可能会引起卡顿或驱动程序超时(Driver Timeouts)。</string>
|
||||||
<string name="gpu_unswizzle_default_button">默认</string>
|
<string name="gpu_unswizzle_default_button">默认</string>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -437,6 +437,8 @@
|
|||||||
<string name="renderer_resolution">解析度 (手提/底座)</string>
|
<string name="renderer_resolution">解析度 (手提/底座)</string>
|
||||||
<string name="renderer_vsync">垂直同步</string>
|
<string name="renderer_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>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?><resources><color name='ic_launcher_background'>#1F143C</color></resources>
|
<?xml version='1.0' encoding='utf-8'?><resources><color name='ic_launcher_background'>#ffd700</color></resources>
|
||||||
|
|||||||
@@ -247,11 +247,11 @@ if(ANDROID)
|
|||||||
target_compile_definitions(audio_core PUBLIC HAVE_OBOE)
|
target_compile_definitions(audio_core PUBLIC HAVE_OBOE)
|
||||||
else()
|
else()
|
||||||
target_sources(audio_core PRIVATE
|
target_sources(audio_core PRIVATE
|
||||||
sink/sdl2_sink.cpp
|
sink/sdl3_sink.cpp
|
||||||
sink/sdl2_sink.h)
|
sink/sdl3_sink.h)
|
||||||
|
|
||||||
target_link_libraries(audio_core PRIVATE SDL2::SDL2)
|
target_link_libraries(audio_core PRIVATE SDL3::SDL3)
|
||||||
target_compile_definitions(audio_core PRIVATE HAVE_SDL2)
|
target_compile_definitions(audio_core PRIVATE HAVE_SDL3)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
create_target_directory_groups(audio_core)
|
create_target_directory_groups(audio_core)
|
||||||
|
|||||||
@@ -7,16 +7,40 @@
|
|||||||
#include <span>
|
#include <span>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
|
|
||||||
#include "audio_core/common/common.h"
|
#include "audio_core/common/common.h"
|
||||||
#include "audio_core/sink/sdl2_sink.h"
|
#include "audio_core/sink/sdl3_sink.h"
|
||||||
#include "audio_core/sink/sink_stream.h"
|
#include "audio_core/sink/sink_stream.h"
|
||||||
#include "common/logging.h"
|
#include "common/logging.h"
|
||||||
#include "common/scope_exit.h"
|
#include "common/scope_exit.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
|
|
||||||
namespace AudioCore::Sink {
|
namespace AudioCore::Sink {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
SDL_AudioDeviceID FindAudioDeviceByName(const std::string& device_name, bool capture) {
|
||||||
|
int device_count = 0;
|
||||||
|
SDL_AudioDeviceID* devices = capture ? SDL_GetAudioRecordingDevices(&device_count)
|
||||||
|
: SDL_GetAudioPlaybackDevices(&device_count);
|
||||||
|
if (devices == nullptr) {
|
||||||
|
return capture ? SDL_AUDIO_DEVICE_DEFAULT_RECORDING : SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_AudioDeviceID selected = capture ? SDL_AUDIO_DEVICE_DEFAULT_RECORDING
|
||||||
|
: SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK;
|
||||||
|
for (int i = 0; i < device_count; ++i) {
|
||||||
|
const char* current_name = SDL_GetAudioDeviceName(devices[i]);
|
||||||
|
if (current_name != nullptr && device_name == current_name) {
|
||||||
|
selected = devices[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SDL_free(devices);
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
} // Anonymous namespace
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SDL sink stream, responsible for sinking samples to hardware.
|
* SDL sink stream, responsible for sinking samples to hardware.
|
||||||
*/
|
*/
|
||||||
@@ -39,13 +63,10 @@ public:
|
|||||||
system_channels = system_channels_;
|
system_channels = system_channels_;
|
||||||
device_channels = device_channels_;
|
device_channels = device_channels_;
|
||||||
|
|
||||||
SDL_AudioSpec spec;
|
SDL_AudioSpec spec{};
|
||||||
spec.freq = TargetSampleRate;
|
spec.freq = TargetSampleRate;
|
||||||
spec.channels = static_cast<u8>(device_channels);
|
spec.channels = static_cast<u8>(device_channels);
|
||||||
spec.format = AUDIO_S16SYS;
|
spec.format = SDL_AUDIO_S16;
|
||||||
spec.samples = TargetSampleCount * 2;
|
|
||||||
spec.callback = &SDLSinkStream::DataCallback;
|
|
||||||
spec.userdata = this;
|
|
||||||
|
|
||||||
std::string device_name{output_device};
|
std::string device_name{output_device};
|
||||||
bool capture{false};
|
bool capture{false};
|
||||||
@@ -54,22 +75,28 @@ public:
|
|||||||
capture = true;
|
capture = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_AudioSpec obtained;
|
const SDL_AudioDeviceID audio_device =
|
||||||
if (device_name.empty()) {
|
device_name.empty() ? (capture ? SDL_AUDIO_DEVICE_DEFAULT_RECORDING
|
||||||
device = SDL_OpenAudioDevice(nullptr, capture, &spec, &obtained, false);
|
: SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK)
|
||||||
} else {
|
: FindAudioDeviceByName(device_name, capture);
|
||||||
device = SDL_OpenAudioDevice(device_name.c_str(), capture, &spec, &obtained, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (device == 0) {
|
stream = SDL_OpenAudioDeviceStream(audio_device, &spec, &SDLSinkStream::DataCallback,
|
||||||
|
this);
|
||||||
|
|
||||||
|
if (stream == nullptr) {
|
||||||
LOG_CRITICAL(Audio_Sink, "Error opening SDL audio device: {}", SDL_GetError());
|
LOG_CRITICAL(Audio_Sink, "Error opening SDL audio device: {}", SDL_GetError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDL_AudioSpec stream_in{};
|
||||||
|
SDL_AudioSpec stream_out{};
|
||||||
|
static_cast<void>(SDL_GetAudioStreamFormat(stream, &stream_in, &stream_out));
|
||||||
|
|
||||||
LOG_INFO(Service_Audio,
|
LOG_INFO(Service_Audio,
|
||||||
"Opening SDL stream {} with: rate {} channels {} (system channels {}) "
|
"Opening SDL stream {} with: rate {} channels {} (system channels {}) "
|
||||||
" samples {}",
|
" format {}",
|
||||||
device, obtained.freq, obtained.channels, system_channels, obtained.samples);
|
static_cast<const void*>(stream), stream_out.freq, stream_out.channels,
|
||||||
|
system_channels, static_cast<int>(stream_out.format));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -84,13 +111,14 @@ public:
|
|||||||
* Finalize the sink stream.
|
* Finalize the sink stream.
|
||||||
*/
|
*/
|
||||||
void Finalize() override {
|
void Finalize() override {
|
||||||
if (device == 0) {
|
if (stream == nullptr) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Stop();
|
Stop();
|
||||||
SDL_ClearQueuedAudio(device);
|
SDL_ClearAudioStream(stream);
|
||||||
SDL_CloseAudioDevice(device);
|
SDL_DestroyAudioStream(stream);
|
||||||
|
stream = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -100,23 +128,23 @@ public:
|
|||||||
* Default false.
|
* Default false.
|
||||||
*/
|
*/
|
||||||
void Start(bool resume = false) override {
|
void Start(bool resume = false) override {
|
||||||
if (device == 0 || !paused) {
|
if (stream == nullptr || !paused) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
paused = false;
|
paused = false;
|
||||||
SDL_PauseAudioDevice(device, 0);
|
static_cast<void>(SDL_ResumeAudioStreamDevice(stream));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stop the sink stream.
|
* Stop the sink stream.
|
||||||
*/
|
*/
|
||||||
void Stop() override {
|
void Stop() override {
|
||||||
if (device == 0 || paused) {
|
if (stream == nullptr || paused) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
SignalPause();
|
SignalPause();
|
||||||
SDL_PauseAudioDevice(device, 1);
|
static_cast<void>(SDL_PauseAudioStreamDevice(stream));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -128,7 +156,8 @@ private:
|
|||||||
* @param stream - Buffer of samples to be filled or read.
|
* @param stream - Buffer of samples to be filled or read.
|
||||||
* @param len - Length of the stream in bytes.
|
* @param len - Length of the stream in bytes.
|
||||||
*/
|
*/
|
||||||
static void DataCallback(void* userdata, Uint8* stream, int len) {
|
static void DataCallback(void* userdata, SDL_AudioStream* stream, int additional_amount,
|
||||||
|
int total_amount) {
|
||||||
auto* impl = static_cast<SDLSinkStream*>(userdata);
|
auto* impl = static_cast<SDLSinkStream*>(userdata);
|
||||||
|
|
||||||
if (!impl) {
|
if (!impl) {
|
||||||
@@ -137,25 +166,46 @@ private:
|
|||||||
|
|
||||||
const std::size_t num_channels = impl->GetDeviceChannels();
|
const std::size_t num_channels = impl->GetDeviceChannels();
|
||||||
const std::size_t frame_size = num_channels;
|
const std::size_t frame_size = num_channels;
|
||||||
const std::size_t num_frames{len / num_channels / sizeof(s16)};
|
|
||||||
|
|
||||||
if (impl->type == StreamType::In) {
|
if (impl->type == StreamType::In) {
|
||||||
std::span<const s16> input_buffer{reinterpret_cast<const s16*>(stream),
|
const int bytes_available = SDL_GetAudioStreamAvailable(stream);
|
||||||
num_frames * frame_size};
|
if (bytes_available <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<s16> input(bytes_available / static_cast<int>(sizeof(s16)));
|
||||||
|
const int bytes_read = SDL_GetAudioStreamData(stream, input.data(), bytes_available);
|
||||||
|
if (bytes_read <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::size_t num_frames =
|
||||||
|
static_cast<std::size_t>(bytes_read) / sizeof(s16) / frame_size;
|
||||||
|
std::span<const s16> input_buffer{input.data(),
|
||||||
|
static_cast<std::size_t>(bytes_read) / sizeof(s16)};
|
||||||
impl->ProcessAudioIn(input_buffer, num_frames);
|
impl->ProcessAudioIn(input_buffer, num_frames);
|
||||||
} else {
|
} else {
|
||||||
std::span<s16> output_buffer{reinterpret_cast<s16*>(stream), num_frames * frame_size};
|
if (additional_amount <= 0 && total_amount <= 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int bytes_requested = additional_amount > 0 ? additional_amount : total_amount;
|
||||||
|
std::vector<s16> output(bytes_requested / static_cast<int>(sizeof(s16)));
|
||||||
|
const std::size_t num_frames =
|
||||||
|
static_cast<std::size_t>(bytes_requested) / sizeof(s16) / frame_size;
|
||||||
|
std::span<s16> output_buffer{output.data(), output.size()};
|
||||||
impl->ProcessAudioOutAndRender(output_buffer, num_frames);
|
impl->ProcessAudioOutAndRender(output_buffer, num_frames);
|
||||||
|
static_cast<void>(SDL_PutAudioStreamData(stream, output.data(), bytes_requested));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// SDL device id of the opened input/output device
|
/// SDL stream attached to an opened input/output device
|
||||||
SDL_AudioDeviceID device{};
|
SDL_AudioStream* stream{};
|
||||||
};
|
};
|
||||||
|
|
||||||
SDLSink::SDLSink(std::string_view target_device_name) {
|
SDLSink::SDLSink(std::string_view target_device_name) {
|
||||||
if (!SDL_WasInit(SDL_INIT_AUDIO)) {
|
if (!SDL_WasInit(SDL_INIT_AUDIO)) {
|
||||||
if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) {
|
if (!SDL_InitSubSystem(SDL_INIT_AUDIO)) {
|
||||||
LOG_CRITICAL(Audio_Sink, "SDL_InitSubSystem audio failed: {}", SDL_GetError());
|
LOG_CRITICAL(Audio_Sink, "SDL_InitSubSystem audio failed: {}", SDL_GetError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -218,18 +268,26 @@ std::vector<std::string> ListSDLSinkDevices(bool capture) {
|
|||||||
std::vector<std::string> device_list;
|
std::vector<std::string> device_list;
|
||||||
|
|
||||||
if (!SDL_WasInit(SDL_INIT_AUDIO)) {
|
if (!SDL_WasInit(SDL_INIT_AUDIO)) {
|
||||||
if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0) {
|
if (!SDL_InitSubSystem(SDL_INIT_AUDIO)) {
|
||||||
LOG_CRITICAL(Audio_Sink, "SDL_InitSubSystem audio failed: {}", SDL_GetError());
|
LOG_CRITICAL(Audio_Sink, "SDL_InitSubSystem audio failed: {}", SDL_GetError());
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const int device_count = SDL_GetNumAudioDevices(capture);
|
int device_count = 0;
|
||||||
|
SDL_AudioDeviceID* devices =
|
||||||
|
capture ? SDL_GetAudioRecordingDevices(&device_count)
|
||||||
|
: SDL_GetAudioPlaybackDevices(&device_count);
|
||||||
|
if (devices == nullptr) {
|
||||||
|
return device_list;
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < device_count; ++i) {
|
for (int i = 0; i < device_count; ++i) {
|
||||||
if (const char* name = SDL_GetAudioDeviceName(i, capture)) {
|
if (const char* name = SDL_GetAudioDeviceName(devices[i])) {
|
||||||
device_list.emplace_back(name);
|
device_list.emplace_back(name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
SDL_free(devices);
|
||||||
|
|
||||||
return device_list;
|
return device_list;
|
||||||
}
|
}
|
||||||
@@ -242,7 +300,7 @@ u32 GetSDLLatency() {
|
|||||||
// REVERTED back to 3833 - Below function IsSDLSuitable() removed, reverting to GetSDLLatency() above. - DIABLO 3 FIX
|
// REVERTED back to 3833 - Below function IsSDLSuitable() removed, reverting to GetSDLLatency() above. - DIABLO 3 FIX
|
||||||
/*
|
/*
|
||||||
bool IsSDLSuitable() {
|
bool IsSDLSuitable() {
|
||||||
#if !defined(HAVE_SDL2)
|
#if !defined(HAVE_SDL3)
|
||||||
return false;
|
return false;
|
||||||
#else
|
#else
|
||||||
// Check SDL can init
|
// Check SDL can init
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2025 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
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||||
@@ -16,8 +16,8 @@
|
|||||||
#ifdef HAVE_CUBEB
|
#ifdef HAVE_CUBEB
|
||||||
#include "audio_core/sink/cubeb_sink.h"
|
#include "audio_core/sink/cubeb_sink.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SDL2
|
#ifdef HAVE_SDL3
|
||||||
#include "audio_core/sink/sdl2_sink.h"
|
#include "audio_core/sink/sdl3_sink.h"
|
||||||
#endif
|
#endif
|
||||||
#include "audio_core/sink/null_sink.h"
|
#include "audio_core/sink/null_sink.h"
|
||||||
#include "common/logging.h"
|
#include "common/logging.h"
|
||||||
@@ -71,9 +71,9 @@ constexpr SinkDetails sink_details[] = {
|
|||||||
&GetCubebLatency,
|
&GetCubebLatency,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_SDL2
|
#ifdef HAVE_SDL3
|
||||||
SinkDetails{
|
SinkDetails{
|
||||||
Settings::AudioEngine::Sdl2,
|
Settings::AudioEngine::Sdl3,
|
||||||
[](std::string_view device_id) -> std::unique_ptr<Sink> {
|
[](std::string_view device_id) -> std::unique_ptr<Sink> {
|
||||||
return std::make_unique<SDLSink>(device_id);
|
return std::make_unique<SDLSink>(device_id);
|
||||||
},
|
},
|
||||||
@@ -115,10 +115,10 @@ const SinkDetails& GetOutputSinkDetails(Settings::AudioEngine sink_id) {
|
|||||||
// BEGIN REINTRODUCED FROM 3833 - REPLACED CODE BLOCK ABOVE - DIABLO 3 FIX
|
// BEGIN REINTRODUCED FROM 3833 - REPLACED CODE BLOCK ABOVE - DIABLO 3 FIX
|
||||||
// Auto-select a backend. Prefer CubeB, but it may report a large minimum latency which
|
// Auto-select a backend. Prefer CubeB, but it may report a large minimum latency which
|
||||||
// causes audio issues, in that case go with SDL.
|
// causes audio issues, in that case go with SDL.
|
||||||
#if defined(HAVE_CUBEB) && defined(HAVE_SDL2)
|
#if defined(HAVE_CUBEB) && defined(HAVE_SDL3)
|
||||||
iter = find_backend(Settings::AudioEngine::Cubeb);
|
iter = find_backend(Settings::AudioEngine::Cubeb);
|
||||||
if (iter->latency() > TargetSampleCount * 3) {
|
if (iter->latency() > TargetSampleCount * 3) {
|
||||||
iter = find_backend(Settings::AudioEngine::Sdl2);
|
iter = find_backend(Settings::AudioEngine::Sdl3);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
iter = std::begin(sink_details);
|
iter = std::begin(sink_details);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
|
||||||
@@ -177,8 +177,10 @@ void SinkStream::ProcessAudioOutAndRender(std::span<s16> output_buffer, std::siz
|
|||||||
queued_buffers.store(0);
|
queued_buffers.store(0);
|
||||||
release_cv.notify_one();
|
release_cv.notify_one();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr std::array<s16, 6> silence{};
|
||||||
for (size_t i = 0; i < num_frames; i++)
|
for (size_t i = 0; i < num_frames; i++)
|
||||||
std::memset(&output_buffer[i * frame_size], 0, frame_size_bytes);
|
std::memcpy(&output_buffer[i * frame_size], silence.data(), frame_size_bytes);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -184,19 +184,12 @@ if(ARCHITECTURE_x86_64)
|
|||||||
x64/cpu_detect.h
|
x64/cpu_detect.h
|
||||||
x64/cpu_wait.cpp
|
x64/cpu_wait.cpp
|
||||||
x64/cpu_wait.h
|
x64/cpu_wait.h
|
||||||
x64/native_clock.cpp
|
|
||||||
x64/native_clock.h
|
|
||||||
x64/rdtsc.cpp
|
x64/rdtsc.cpp
|
||||||
x64/rdtsc.h
|
x64/rdtsc.h
|
||||||
x64/xbyak_abi.h
|
x64/xbyak.h)
|
||||||
x64/xbyak_util.h)
|
|
||||||
target_link_libraries(common PRIVATE xbyak::xbyak)
|
target_link_libraries(common PRIVATE xbyak::xbyak)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(HAS_NCE)
|
|
||||||
target_sources(common PRIVATE arm64/native_clock.cpp arm64/native_clock.h)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(MSVC)
|
if(MSVC)
|
||||||
target_compile_definitions(
|
target_compile_definitions(
|
||||||
common
|
common
|
||||||
|
|||||||
@@ -1,87 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#ifdef ANDROID
|
|
||||||
#include <sys/system_properties.h>
|
|
||||||
#endif
|
|
||||||
#include "common/arm64/native_clock.h"
|
|
||||||
|
|
||||||
namespace Common::Arm64 {
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
NativeClock::FactorType GetFixedPointFactor(u64 num, u64 den) {
|
|
||||||
return (static_cast<NativeClock::FactorType>(num) << 64) / den;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 MultiplyHigh(u64 m, NativeClock::FactorType factor) {
|
|
||||||
return static_cast<u64>((m * factor) >> 64);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
NativeClock::NativeClock() {
|
|
||||||
const u64 host_cntfrq = GetHostCNTFRQ();
|
|
||||||
ns_cntfrq_factor = GetFixedPointFactor(NsRatio::den, host_cntfrq);
|
|
||||||
us_cntfrq_factor = GetFixedPointFactor(UsRatio::den, host_cntfrq);
|
|
||||||
ms_cntfrq_factor = GetFixedPointFactor(MsRatio::den, host_cntfrq);
|
|
||||||
guest_cntfrq_factor = GetFixedPointFactor(CNTFRQ, host_cntfrq);
|
|
||||||
gputick_cntfrq_factor = GetFixedPointFactor(GPUTickFreq, host_cntfrq);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::chrono::nanoseconds NativeClock::GetTimeNS() const {
|
|
||||||
return std::chrono::nanoseconds{MultiplyHigh(GetUptime(), ns_cntfrq_factor)};
|
|
||||||
}
|
|
||||||
|
|
||||||
std::chrono::microseconds NativeClock::GetTimeUS() const {
|
|
||||||
return std::chrono::microseconds{MultiplyHigh(GetUptime(), us_cntfrq_factor)};
|
|
||||||
}
|
|
||||||
|
|
||||||
std::chrono::milliseconds NativeClock::GetTimeMS() const {
|
|
||||||
return std::chrono::milliseconds{MultiplyHigh(GetUptime(), ms_cntfrq_factor)};
|
|
||||||
}
|
|
||||||
|
|
||||||
s64 NativeClock::GetCNTPCT() const {
|
|
||||||
return MultiplyHigh(GetUptime(), guest_cntfrq_factor);
|
|
||||||
}
|
|
||||||
|
|
||||||
s64 NativeClock::GetGPUTick() const {
|
|
||||||
return MultiplyHigh(GetUptime(), gputick_cntfrq_factor);
|
|
||||||
}
|
|
||||||
|
|
||||||
s64 NativeClock::GetUptime() const {
|
|
||||||
s64 cntvct_el0 = 0;
|
|
||||||
asm volatile("dsb ish\n\t"
|
|
||||||
"mrs %[cntvct_el0], cntvct_el0\n\t"
|
|
||||||
"dsb ish\n\t"
|
|
||||||
: [cntvct_el0] "=r"(cntvct_el0));
|
|
||||||
return cntvct_el0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NativeClock::IsNative() const {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
s64 NativeClock::GetHostCNTFRQ() {
|
|
||||||
u64 cntfrq_el0 = 0;
|
|
||||||
std::string_view board{""};
|
|
||||||
#ifdef ANDROID
|
|
||||||
char buffer[PROP_VALUE_MAX];
|
|
||||||
int len{__system_property_get("ro.product.board", buffer)};
|
|
||||||
board = std::string_view(buffer, static_cast<size_t>(len));
|
|
||||||
#endif
|
|
||||||
if (board == "s5e9925") { // Exynos 2200
|
|
||||||
cntfrq_el0 = 25600000;
|
|
||||||
} else if (board == "exynos2100") { // Exynos 2100
|
|
||||||
cntfrq_el0 = 26000000;
|
|
||||||
} else if (board == "exynos9810") { // Exynos 9810
|
|
||||||
cntfrq_el0 = 26000000;
|
|
||||||
} else if (board == "s5e8825") { // Exynos 1280
|
|
||||||
cntfrq_el0 = 26000000;
|
|
||||||
} else {
|
|
||||||
asm("mrs %[cntfrq_el0], cntfrq_el0" : [cntfrq_el0] "=r"(cntfrq_el0));
|
|
||||||
}
|
|
||||||
return cntfrq_el0;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace Common::Arm64
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include "common/wall_clock.h"
|
|
||||||
|
|
||||||
namespace Common::Arm64 {
|
|
||||||
|
|
||||||
class NativeClock final : public WallClock {
|
|
||||||
public:
|
|
||||||
explicit NativeClock();
|
|
||||||
|
|
||||||
std::chrono::nanoseconds GetTimeNS() const override;
|
|
||||||
|
|
||||||
std::chrono::microseconds GetTimeUS() const override;
|
|
||||||
|
|
||||||
std::chrono::milliseconds GetTimeMS() const override;
|
|
||||||
|
|
||||||
s64 GetCNTPCT() const override;
|
|
||||||
|
|
||||||
s64 GetGPUTick() const override;
|
|
||||||
|
|
||||||
s64 GetUptime() const override;
|
|
||||||
|
|
||||||
bool IsNative() const override;
|
|
||||||
|
|
||||||
static s64 GetHostCNTFRQ();
|
|
||||||
|
|
||||||
public:
|
|
||||||
using FactorType = unsigned __int128;
|
|
||||||
|
|
||||||
FactorType GetGuestCNTFRQFactor() const {
|
|
||||||
return guest_cntfrq_factor;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
FactorType ns_cntfrq_factor;
|
|
||||||
FactorType us_cntfrq_factor;
|
|
||||||
FactorType ms_cntfrq_factor;
|
|
||||||
FactorType guest_cntfrq_factor;
|
|
||||||
FactorType gputick_cntfrq_factor;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace Common::Arm64
|
|
||||||
@@ -1,12 +1,7 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2005-2014 Daniel James
|
// SPDX-FileCopyrightText: 2005-2014 Daniel James
|
||||||
// SPDX-FileCopyrightText: 2016 Austin Appleby
|
// SPDX-FileCopyrightText: 2016 Austin Appleby
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <climits>
|
#include <climits>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|||||||
@@ -62,20 +62,16 @@ std::vector<Asset> Release::GetPlatformAssets() const {
|
|||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#ifdef ARCHITECTURE_x86_64
|
#ifdef ARCHITECTURE_x86_64
|
||||||
#ifdef _MSC_VER
|
find_asset("Standard", {"amd64-msvc-standard.exe", "amd64-msvc-standard.zip", "mingw-amd64-gcc-standard.exe", "mingw-amd64-gcc-standard.zip"});
|
||||||
find_asset("Standard", {"amd64-msvc-standard.exe", "amd64-msvc-standard.zip"});
|
find_asset("PGO", {"mingw-amd64-clang-pgo.exe", "mingw-amd64-clang-pgo.zip"});
|
||||||
#else // _MSC_VER
|
|
||||||
find_asset("Standard", {BUILD_ID "-gcc-standard.exe", BUILD_ID "-gcc-standard.zip"});
|
|
||||||
find_asset("PGO", {BUILD_ID "-clang-pgo.exe", BUILD_ID "-clang-pgo.zip"});
|
|
||||||
#endif // _MSC_VER
|
|
||||||
#elif defined(ARCHITECTURE_arm64)
|
#elif defined(ARCHITECTURE_arm64)
|
||||||
find_asset("Standard", {"arm64-clang-standard.exe", "arm64-clang-standard.zip"});
|
find_asset("Standard", {"mingw-arm64-clang-standard.exe", "mingw-arm64-clang-standard.zip"});
|
||||||
find_asset("PGO", {"arm64-clang-pgo.exe", "arm64-clang-pgo.zip"});
|
find_asset("PGO", {"mingw-arm64-clang-pgo.exe", "mingw-arm64-clang-pgo.zip"});
|
||||||
#endif // ARCHITECTURE_arm64
|
#endif
|
||||||
#elif defined(__APPLE__)
|
#elif defined(__APPLE__)
|
||||||
#ifdef ARCHITECTURE_arm64
|
#ifdef ARCHITECTURE_arm64
|
||||||
find_asset("Standard", {".dmg", ".tar.gz"});
|
find_asset("Standard", {".dmg", ".tar.gz"});
|
||||||
#endif // ARCHITECTURE_arm64
|
#endif
|
||||||
#elif defined(__ANDROID__)
|
#elif defined(__ANDROID__)
|
||||||
#ifdef ARCHITECTURE_x86_64
|
#ifdef ARCHITECTURE_x86_64
|
||||||
find_asset("Standard", {"chromeos.apk"});
|
find_asset("Standard", {"chromeos.apk"});
|
||||||
@@ -86,9 +82,9 @@ std::vector<Asset> Release::GetPlatformAssets() const {
|
|||||||
find_asset("Standard", {"optimized.apk"});
|
find_asset("Standard", {"optimized.apk"});
|
||||||
#else
|
#else
|
||||||
find_asset("Standard", {"standard.apk"});
|
find_asset("Standard", {"standard.apk"});
|
||||||
#endif // GENSHIN_SPOOF
|
#endif
|
||||||
#endif // ARCHITECTURE_arm64
|
#endif
|
||||||
#endif // __APPLE__
|
#endif
|
||||||
return found_assets;
|
return found_assets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||